Wed, 07 Jan 2015 14:02:30 +0530
8068524: NashornScriptEngineFactory.getParameter() throws IAE for an unknown key, doesn't conform to the general spec
Reviewed-by: hannesw, attila
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/samples/jd.js Wed Jan 07 14:02:30 2015 +0530 1.3 @@ -0,0 +1,94 @@ 1.4 +#// Usage: jjs -cp <asmtools.jar> jd.js -- <classname> [jdis|jdec] 1.5 + 1.6 +/* 1.7 + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 1.8 + * 1.9 + * Redistribution and use in source and binary forms, with or without 1.10 + * modification, are permitted provided that the following conditions 1.11 + * are met: 1.12 + * 1.13 + * - Redistributions of source code must retain the above copyright 1.14 + * notice, this list of conditions and the following disclaimer. 1.15 + * 1.16 + * - Redistributions in binary form must reproduce the above copyright 1.17 + * notice, this list of conditions and the following disclaimer in the 1.18 + * documentation and/or other materials provided with the distribution. 1.19 + * 1.20 + * - Neither the name of Oracle nor the names of its 1.21 + * contributors may be used to endorse or promote products derived 1.22 + * from this software without specific prior written permission. 1.23 + * 1.24 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 1.25 + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1.26 + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1.27 + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 1.28 + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 1.29 + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 1.30 + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 1.31 + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 1.32 + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 1.33 + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 1.34 + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 1.35 + */ 1.36 + 1.37 +// javap-like disassembler/decoder tool that disassembles/decodes 1.38 +// java classes but with OpenJDK AsmTools disassembler/decoder syntax. 1.39 +// You need to build asmtool.jar from OpenJDK codetools project 1.40 +// specify it with -cp option. 1.41 + 1.42 +// See also https://wiki.openjdk.java.net/display/CodeTools/AsmTools 1.43 + 1.44 +function usage() { 1.45 + print("Usage: jjs -cp <asmtools.jar> jd.js -- <classname> [jdis|jdec]"); 1.46 + exit(1); 1.47 +} 1.48 + 1.49 +if (arguments.length == 0) { 1.50 + usage(); 1.51 +} 1.52 + 1.53 +// argument handling 1.54 +// convert to internal class name 1.55 +var className = arguments[0].replaceAll('\\.', '/'); 1.56 +var tool; 1.57 +if (arguments.length > 1) { 1.58 + tool = arguments[1]; 1.59 + switch (tool) { 1.60 + case 'jdis': 1.61 + case 'jdec': 1.62 + break; 1.63 + default: 1.64 + usage(); 1.65 + } 1.66 +} else { 1.67 + tool = "jdis"; // default tool 1.68 +} 1.69 + 1.70 +// Java classes used 1.71 +var AsmTools = Java.type("org.openjdk.asmtools.Main"); 1.72 +var Files = Java.type("java.nio.file.Files"); 1.73 +var StandardCopyOption = Java.type("java.nio.file.StandardCopyOption"); 1.74 + 1.75 +// retrive input stream for .class bytes 1.76 +var cl = AsmTools.class.classLoader; 1.77 +var res = cl.getResource(className + ".class"); 1.78 + 1.79 +if (res) { 1.80 + var is = res.openStream(); 1.81 + var tmpPath; 1.82 + try { 1.83 + // copy the content of the .class to a temp file 1.84 + tmpPath = Files.createTempFile("asmtools-", ".class"); 1.85 + // mark as delete-on-exit 1.86 + tmpPath.toFile().deleteOnExit(); 1.87 + Files.copy(is, tmpPath, [ StandardCopyOption.REPLACE_EXISTING ]); 1.88 + } finally { 1.89 + is.close(); 1.90 + } 1.91 + 1.92 + // invoke asmtools Main 1.93 + AsmTools.main([ tool, tmpPath.toString() ]); 1.94 +} else { 1.95 + print("no such class: " + arguments[0]); 1.96 + exit(1); 1.97 +}
2.1 --- a/src/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java Mon Jan 05 16:02:56 2015 +0530 2.2 +++ b/src/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java Wed Jan 07 14:02:30 2015 +0530 2.3 @@ -123,7 +123,7 @@ 2.4 // used to execute scripts concurrently on multiple threads. 2.5 return null; 2.6 default: 2.7 - throw new IllegalArgumentException("Invalid key"); 2.8 + return null; 2.9 } 2.10 } 2.11
3.1 --- a/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Mon Jan 05 16:02:56 2015 +0530 3.2 +++ b/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Wed Jan 07 14:02:30 2015 +0530 3.3 @@ -27,6 +27,7 @@ 3.4 3.5 import static org.testng.Assert.assertEquals; 3.6 import static org.testng.Assert.assertNotNull; 3.7 +import static org.testng.Assert.assertNull; 3.8 import static org.testng.Assert.assertTrue; 3.9 import static org.testng.Assert.fail; 3.10 import java.io.StringReader; 3.11 @@ -668,6 +669,17 @@ 3.12 assertEquals("helloworld", inv.invokeMethod(ctx.get(), "join", "")); 3.13 } 3.14 3.15 + // @bug 8068524: NashornScriptEngineFactory.getParameter() throws IAE 3.16 + // for an unknown key, doesn't conform to the general spec 3.17 + @Test 3.18 + public void getParameterInvalidKeyTest() throws Exception { 3.19 + final ScriptEngineManager manager = new ScriptEngineManager(); 3.20 + final ScriptEngine e = manager.getEngineByName("nashorn"); 3.21 + // no exception expected here! 3.22 + Object value = e.getFactory().getParameter("no value assigned to this key"); 3.23 + assertNull(value); 3.24 + } 3.25 + 3.26 private static void checkProperty(final ScriptEngine e, final String name) 3.27 throws ScriptException { 3.28 final String value = System.getProperty(name);