Mercurial > hg > openjdk > jdk8 > nashorn
changeset 389:ab3ea5b3e507
8019488: switch on literals result in NoSuchMethodError or VerifyError
Reviewed-by: hannesw
author | sundar |
---|---|
date | Mon, 01 Jul 2013 19:52:07 +0530 |
parents | 47099609a48b |
children | 9165138b427c |
files | src/jdk/nashorn/internal/codegen/CodeGenerator.java src/jdk/nashorn/internal/runtime/ScriptRuntime.java test/script/basic/JDK-8019488.js |
diffstat | 3 files changed, 81 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk/nashorn/internal/codegen/CodeGenerator.java Mon Jul 01 17:21:09 2013 +0530 +++ b/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.
--- a/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Mon Jul 01 17:21:09 2013 +0530 +++ b/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; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/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"); +}