# HG changeset patch # User sundar # Date 1372688527 -19800 # Node ID 012cd852f8813ce25d28835b09d904ed3acd4ef5 # Parent ef4e353a4a8f963a7c0b29e6199bf66513365b99 8019488: switch on literals result in NoSuchMethodError or VerifyError Reviewed-by: hannesw diff -r ef4e353a4a8f -r 012cd852f881 nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java --- a/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Mon Jul 01 17:21:09 2013 +0530 +++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Mon Jul 01 19:52:07 2013 +0530 @@ -1845,7 +1845,8 @@ // If expression not int see if we can convert, if not use deflt to trigger default. if (!type.isInteger()) { method.load(deflt); - method.invoke(staticCallNoLookup(ScriptRuntime.class, "switchTagAsInt", int.class, type.getTypeClass(), int.class)); + final Class exprClass = type.getTypeClass(); + method.invoke(staticCallNoLookup(ScriptRuntime.class, "switchTagAsInt", int.class, exprClass.isPrimitive()? exprClass : Object.class, int.class)); } // If reasonable size and not too sparse (80%), use table otherwise use lookup. diff -r ef4e353a4a8f -r 012cd852f881 nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java --- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Mon Jul 01 17:21:09 2013 +0530 +++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Mon Jul 01 19:52:07 2013 +0530 @@ -127,6 +127,17 @@ * @param deflt default to use if not convertible. * @return int tag value (or deflt.) */ + public static int switchTagAsInt(final boolean tag, final int deflt) { + return deflt; + } + + /** + * Converts a switch tag value to a simple integer. deflt value if it can't. + * + * @param tag Switch statement tag value. + * @param deflt default to use if not convertible. + * @return int tag value (or deflt.) + */ public static int switchTagAsInt(final long tag, final int deflt) { return isRepresentableAsInt(tag) ? (int)tag : deflt; } diff -r ef4e353a4a8f -r 012cd852f881 nashorn/test/script/basic/JDK-8019488.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8019488.js Mon Jul 01 19:52:07 2013 +0530 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8019488: switch on literals result in NoSuchMethodError or VerifyError + * + * @test + * @run + */ + +switch("") { + case 0: + break +} + +switch(true) { + case 0: + print("0"); break; + case 1: + print("1"); break; +} + +switch(false) { + case 0: + print("0"); break; + case 1: + print("1"); break; +} + +switch([]) { + case 1: + print("1"); +} + +switch (undefined) { + case 0: + print("0"); +} + +switch (null) { + case 0: + print("0"); +} + +switch({}) { + case 1: + print("1"); +}