Thu, 05 Feb 2015 19:08:00 +0530
8072595: nashorn should not use obj.getClass() for null checks
Reviewed-by: hannesw, attila
1.1 --- a/samples/javashell.js Thu Feb 05 16:26:36 2015 +0100 1.2 +++ b/samples/javashell.js Thu Feb 05 19:08:00 2015 +0530 1.3 @@ -40,6 +40,7 @@ 1.4 var Arrays = Java.type("java.util.Arrays"); 1.5 var BufferedReader = Java.type("java.io.BufferedReader"); 1.6 var FileWriter = Java.type("java.io.FileWriter"); 1.7 +var List = Java.type("java.util.List"); 1.8 var LocalDateTime = Java.type("java.time.LocalDateTime"); 1.9 var InputStreamReader = Java.type("java.io.InputStreamReader"); 1.10 var PrintWriter = Java.type("java.io.PrintWriter"); 1.11 @@ -121,7 +122,7 @@ 1.12 // execute code command 1.13 function exec(args) { 1.14 // build child process and start it! 1.15 - new ProcessBuilder(Arrays.asList(args.split(' '))) 1.16 + new ProcessBuilder(Java.to(args.split(' '), List)) 1.17 .inheritIO() 1.18 .start() 1.19 .waitFor();
2.1 --- a/samples/shell.js Thu Feb 05 16:26:36 2015 +0100 2.2 +++ b/samples/shell.js Thu Feb 05 19:08:00 2015 +0530 2.3 @@ -42,6 +42,7 @@ 2.4 var Arrays = Java.type("java.util.Arrays"); 2.5 var BufferedReader = Java.type("java.io.BufferedReader"); 2.6 var InputStreamReader = Java.type("java.io.InputStreamReader"); 2.7 + var List = Java.type("java.util.List"); 2.8 var ProcessBuilder = Java.type("java.lang.ProcessBuilder"); 2.9 var System = Java.type("java.lang.System"); 2.10 2.11 @@ -66,7 +67,7 @@ 2.12 } 2.13 } else { 2.14 // build child process and start it! 2.15 - new ProcessBuilder(Arrays.asList(args)) 2.16 + new ProcessBuilder(Java.to(args, List)) 2.17 .inheritIO() 2.18 .start() 2.19 .waitFor();
3.1 --- a/src/jdk/internal/dynalink/DynamicLinker.java Thu Feb 05 16:26:36 2015 +0100 3.2 +++ b/src/jdk/internal/dynalink/DynamicLinker.java Thu Feb 05 19:08:00 2015 +0530 3.3 @@ -88,6 +88,7 @@ 3.4 import java.lang.invoke.MethodType; 3.5 import java.lang.invoke.MutableCallSite; 3.6 import java.util.List; 3.7 +import java.util.Objects; 3.8 import jdk.internal.dynalink.linker.GuardedInvocation; 3.9 import jdk.internal.dynalink.linker.GuardingDynamicLinker; 3.10 import jdk.internal.dynalink.linker.LinkRequest; 3.11 @@ -252,7 +253,7 @@ 3.12 // Make sure we filter the invocation before linking it into the call site. This is typically used to match the 3.13 // return type of the invocation to the call site. 3.14 guardedInvocation = prelinkFilter.filter(guardedInvocation, linkRequest, linkerServices); 3.15 - guardedInvocation.getClass(); // null pointer check 3.16 + Objects.requireNonNull(guardedInvocation); 3.17 3.18 int newRelinkCount = relinkCount; 3.19 // Note that the short-circuited "&&" evaluation below ensures we'll increment the relinkCount until
4.1 --- a/src/jdk/internal/dynalink/beans/StaticClass.java Thu Feb 05 16:26:36 2015 +0100 4.2 +++ b/src/jdk/internal/dynalink/beans/StaticClass.java Thu Feb 05 19:08:00 2015 +0530 4.3 @@ -84,6 +84,7 @@ 4.4 package jdk.internal.dynalink.beans; 4.5 4.6 import java.io.Serializable; 4.7 +import java.util.Objects; 4.8 4.9 /** 4.10 * Object that represents the static facet of a class (its static methods, properties, and fields, as well as 4.11 @@ -106,8 +107,7 @@ 4.12 private final Class<?> clazz; 4.13 4.14 /*private*/ StaticClass(final Class<?> clazz) { 4.15 - clazz.getClass(); // NPE check 4.16 - this.clazz = clazz; 4.17 + this.clazz = Objects.requireNonNull(clazz); 4.18 } 4.19 4.20 /**
5.1 --- a/src/jdk/internal/dynalink/linker/GuardedInvocation.java Thu Feb 05 16:26:36 2015 +0100 5.2 +++ b/src/jdk/internal/dynalink/linker/GuardedInvocation.java Thu Feb 05 19:08:00 2015 +0530 5.3 @@ -91,6 +91,7 @@ 5.4 import java.lang.invoke.SwitchPoint; 5.5 import java.lang.invoke.WrongMethodTypeException; 5.6 import java.util.List; 5.7 +import java.util.Objects; 5.8 import jdk.internal.dynalink.CallSiteDescriptor; 5.9 import jdk.internal.dynalink.support.Guards; 5.10 5.11 @@ -170,8 +171,7 @@ 5.12 * @throws NullPointerException if invocation is null. 5.13 */ 5.14 public GuardedInvocation(final MethodHandle invocation, final MethodHandle guard, final SwitchPoint switchPoint, final Class<? extends Throwable> exception) { 5.15 - invocation.getClass(); // NPE check 5.16 - this.invocation = invocation; 5.17 + this.invocation = Objects.requireNonNull(invocation); 5.18 this.guard = guard; 5.19 this.switchPoints = switchPoint == null ? null : new SwitchPoint[] { switchPoint }; 5.20 this.exception = exception; 5.21 @@ -190,8 +190,7 @@ 5.22 * @throws NullPointerException if invocation is null. 5.23 */ 5.24 public GuardedInvocation(final MethodHandle invocation, final MethodHandle guard, final SwitchPoint[] switchPoints, final Class<? extends Throwable> exception) { 5.25 - invocation.getClass(); // NPE check 5.26 - this.invocation = invocation; 5.27 + this.invocation = Objects.requireNonNull(invocation); 5.28 this.guard = guard; 5.29 this.switchPoints = switchPoints == null ? null : switchPoints.clone(); 5.30 this.exception = exception;
6.1 --- a/src/jdk/internal/dynalink/support/CallSiteDescriptorFactory.java Thu Feb 05 16:26:36 2015 +0100 6.2 +++ b/src/jdk/internal/dynalink/support/CallSiteDescriptorFactory.java Thu Feb 05 19:08:00 2015 +0530 6.3 @@ -91,6 +91,7 @@ 6.4 import java.util.Arrays; 6.5 import java.util.Collections; 6.6 import java.util.List; 6.7 +import java.util.Objects; 6.8 import java.util.StringTokenizer; 6.9 import java.util.WeakHashMap; 6.10 import jdk.internal.dynalink.CallSiteDescriptor; 6.11 @@ -123,9 +124,9 @@ 6.12 * in fact return a weakly-referenced canonical instance. 6.13 */ 6.14 public static CallSiteDescriptor create(final Lookup lookup, final String name, final MethodType methodType) { 6.15 - name.getClass(); // NPE check 6.16 - methodType.getClass(); // NPE check 6.17 - lookup.getClass(); // NPE check 6.18 + Objects.requireNonNull(name); 6.19 + Objects.requireNonNull(methodType); 6.20 + Objects.requireNonNull(lookup); 6.21 final String[] tokenizedName = tokenizeName(name); 6.22 if(isPublicLookup(lookup)) { 6.23 return getCanonicalPublicDescriptor(createPublicCallSiteDescriptor(tokenizedName, methodType));
7.1 --- a/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Thu Feb 05 16:26:36 2015 +0100 7.2 +++ b/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Thu Feb 05 19:08:00 2015 +0530 7.3 @@ -39,6 +39,7 @@ 7.4 import java.security.ProtectionDomain; 7.5 import java.text.MessageFormat; 7.6 import java.util.Locale; 7.7 +import java.util.Objects; 7.8 import java.util.ResourceBundle; 7.9 import javax.script.AbstractScriptEngine; 7.10 import javax.script.Bindings; 7.11 @@ -360,7 +361,7 @@ 7.12 } 7.13 7.14 private Object invokeImpl(final Object selfObject, final String name, final Object... args) throws ScriptException, NoSuchMethodException { 7.15 - name.getClass(); // null check 7.16 + Objects.requireNonNull(name); 7.17 assert !(selfObject instanceof ScriptObject) : "raw ScriptObject not expected here"; 7.18 7.19 Global invokeGlobal = null;
8.1 --- a/src/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java Thu Feb 05 16:26:36 2015 +0100 8.2 +++ b/src/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java Thu Feb 05 19:08:00 2015 +0530 8.3 @@ -28,6 +28,7 @@ 8.4 import java.util.Arrays; 8.5 import java.util.Collections; 8.6 import java.util.List; 8.7 +import java.util.Objects; 8.8 import javax.script.ScriptEngine; 8.9 import javax.script.ScriptEngineFactory; 8.10 import jdk.nashorn.internal.runtime.Context; 8.11 @@ -177,7 +178,7 @@ 8.12 * denies {@code RuntimePermission("nashorn.setConfig")} 8.13 */ 8.14 public ScriptEngine getScriptEngine(final ClassFilter classFilter) { 8.15 - classFilter.getClass(); // null check 8.16 + Objects.requireNonNull(classFilter); 8.17 return newEngine(DEFAULT_OPTIONS, getAppClassLoader(), classFilter); 8.18 } 8.19 8.20 @@ -192,7 +193,7 @@ 8.21 * denies {@code RuntimePermission("nashorn.setConfig")} 8.22 */ 8.23 public ScriptEngine getScriptEngine(final String... args) { 8.24 - args.getClass(); // null check 8.25 + Objects.requireNonNull(args); 8.26 return newEngine(args, getAppClassLoader(), null); 8.27 } 8.28 8.29 @@ -208,7 +209,7 @@ 8.30 * denies {@code RuntimePermission("nashorn.setConfig")} 8.31 */ 8.32 public ScriptEngine getScriptEngine(final String[] args, final ClassLoader appLoader) { 8.33 - args.getClass(); // null check 8.34 + Objects.requireNonNull(args); 8.35 return newEngine(args, appLoader, null); 8.36 } 8.37 8.38 @@ -225,8 +226,8 @@ 8.39 * denies {@code RuntimePermission("nashorn.setConfig")} 8.40 */ 8.41 public ScriptEngine getScriptEngine(final String[] args, final ClassLoader appLoader, final ClassFilter classFilter) { 8.42 - args.getClass(); // null check 8.43 - classFilter.getClass(); // null check 8.44 + Objects.requireNonNull(args); 8.45 + Objects.requireNonNull(classFilter); 8.46 return newEngine(args, appLoader, classFilter); 8.47 } 8.48
9.1 --- a/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java Thu Feb 05 16:26:36 2015 +0100 9.2 +++ b/src/jdk/nashorn/api/scripting/ScriptObjectMirror.java Thu Feb 05 19:08:00 2015 +0530 9.3 @@ -39,6 +39,7 @@ 9.4 import java.util.LinkedHashSet; 9.5 import java.util.List; 9.6 import java.util.Map; 9.7 +import java.util.Objects; 9.8 import java.util.Set; 9.9 import java.util.concurrent.Callable; 9.10 import javax.script.Bindings; 9.11 @@ -180,7 +181,7 @@ 9.12 * @return return value of function 9.13 */ 9.14 public Object callMember(final String functionName, final Object... args) { 9.15 - functionName.getClass(); // null check 9.16 + Objects.requireNonNull(functionName); 9.17 final Global oldGlobal = Context.getGlobal(); 9.18 final boolean globalChanged = (oldGlobal != global); 9.19 9.20 @@ -213,7 +214,7 @@ 9.21 9.22 @Override 9.23 public Object getMember(final String name) { 9.24 - name.getClass(); 9.25 + Objects.requireNonNull(name); 9.26 return inGlobal(new Callable<Object>() { 9.27 @Override public Object call() { 9.28 return wrap(sobj.get(name), global); 9.29 @@ -232,7 +233,7 @@ 9.30 9.31 @Override 9.32 public boolean hasMember(final String name) { 9.33 - name.getClass(); 9.34 + Objects.requireNonNull(name); 9.35 return inGlobal(new Callable<Boolean>() { 9.36 @Override public Boolean call() { 9.37 return sobj.has(name); 9.38 @@ -251,13 +252,13 @@ 9.39 9.40 @Override 9.41 public void removeMember(final String name) { 9.42 - name.getClass(); 9.43 + Objects.requireNonNull(name); 9.44 remove(name); 9.45 } 9.46 9.47 @Override 9.48 public void setMember(final String name, final Object value) { 9.49 - name.getClass(); 9.50 + Objects.requireNonNull(name); 9.51 put(name, value); 9.52 } 9.53 9.54 @@ -425,9 +426,7 @@ 9.55 9.56 @Override 9.57 public void putAll(final Map<? extends String, ? extends Object> map) { 9.58 - if (map == null) { 9.59 - throw new NullPointerException("map is null"); 9.60 - } 9.61 + Objects.requireNonNull(map, "map is null"); 9.62 final ScriptObject oldGlobal = Context.getGlobal(); 9.63 final boolean globalChanged = (oldGlobal != global); 9.64 inGlobal(new Callable<Object>() { 9.65 @@ -804,9 +803,9 @@ 9.66 * @throws IllegalArgumentException if key is empty string 9.67 */ 9.68 private static void checkKey(final Object key) { 9.69 - if (key == null) { 9.70 - throw new NullPointerException("key can not be null"); 9.71 - } else if (!(key instanceof String)) { 9.72 + Objects.requireNonNull(key, "key can not be null"); 9.73 + 9.74 + if (!(key instanceof String)) { 9.75 throw new ClassCastException("key should be a String. It is " + key.getClass().getName() + " instead."); 9.76 } else if (((String)key).length() == 0) { 9.77 throw new IllegalArgumentException("key can not be empty");
10.1 --- a/src/jdk/nashorn/api/scripting/URLReader.java Thu Feb 05 16:26:36 2015 +0100 10.2 +++ b/src/jdk/nashorn/api/scripting/URLReader.java Thu Feb 05 19:08:00 2015 +0530 10.3 @@ -30,6 +30,7 @@ 10.4 import java.io.Reader; 10.5 import java.net.URL; 10.6 import java.nio.charset.Charset; 10.7 +import java.util.Objects; 10.8 import jdk.nashorn.internal.runtime.Source; 10.9 10.10 /** 10.11 @@ -77,8 +78,7 @@ 10.12 * @throws NullPointerException if url is null 10.13 */ 10.14 public URLReader(final URL url, final Charset cs) { 10.15 - // null check 10.16 - url.getClass(); 10.17 + Objects.requireNonNull(url); 10.18 this.url = url; 10.19 this.cs = cs; 10.20 }
11.1 --- a/src/jdk/nashorn/internal/codegen/CompileUnit.java Thu Feb 05 16:26:36 2015 +0100 11.2 +++ b/src/jdk/nashorn/internal/codegen/CompileUnit.java Thu Feb 05 19:08:00 2015 +0530 11.3 @@ -26,6 +26,7 @@ 11.4 package jdk.nashorn.internal.codegen; 11.5 11.6 import java.io.Serializable; 11.7 +import java.util.Objects; 11.8 import java.util.Set; 11.9 import java.util.TreeSet; 11.10 import jdk.nashorn.internal.ir.CompileUnitHolder; 11.11 @@ -113,7 +114,7 @@ 11.12 * @param clazz class with code for this compile unit 11.13 */ 11.14 void setCode(final Class<?> clazz) { 11.15 - clazz.getClass(); // null check 11.16 + Objects.requireNonNull(clazz); 11.17 this.clazz = clazz; 11.18 // Revisit this - refactor to avoid null-ed out non-final fields 11.19 // null out emitter
12.1 --- a/src/jdk/nashorn/internal/objects/Global.java Thu Feb 05 16:26:36 2015 +0100 12.2 +++ b/src/jdk/nashorn/internal/objects/Global.java Thu Feb 05 19:08:00 2015 +0530 12.3 @@ -41,6 +41,7 @@ 12.4 import java.util.Arrays; 12.5 import java.util.List; 12.6 import java.util.Map; 12.7 +import java.util.Objects; 12.8 import java.util.concurrent.Callable; 12.9 import java.util.concurrent.ConcurrentHashMap; 12.10 import javax.script.ScriptContext; 12.11 @@ -463,8 +464,7 @@ 12.12 sm.checkPermission(new RuntimePermission(Context.NASHORN_CREATE_GLOBAL)); 12.13 } 12.14 12.15 - // null check on context 12.16 - context.getClass(); 12.17 + Objects.requireNonNull(context); 12.18 12.19 return $nasgenmap$; 12.20 } 12.21 @@ -488,7 +488,7 @@ 12.22 */ 12.23 public static Global instance() { 12.24 final Global global = Context.getGlobal(); 12.25 - global.getClass(); // null check 12.26 + Objects.requireNonNull(global); 12.27 return global; 12.28 } 12.29
13.1 --- a/src/jdk/nashorn/internal/runtime/Context.java Thu Feb 05 16:26:36 2015 +0100 13.2 +++ b/src/jdk/nashorn/internal/runtime/Context.java Thu Feb 05 19:08:00 2015 +0530 13.3 @@ -60,6 +60,7 @@ 13.4 import java.util.HashMap; 13.5 import java.util.LinkedHashMap; 13.6 import java.util.Map; 13.7 +import java.util.Objects; 13.8 import java.util.concurrent.atomic.AtomicLong; 13.9 import java.util.concurrent.atomic.AtomicReference; 13.10 import java.util.function.Consumer; 13.11 @@ -904,7 +905,7 @@ 13.12 * @throw SecurityException if not accessible 13.13 */ 13.14 private static void checkPackageAccess(final SecurityManager sm, final String fullName) { 13.15 - sm.getClass(); // null check 13.16 + Objects.requireNonNull(sm); 13.17 final int index = fullName.lastIndexOf('.'); 13.18 if (index != -1) { 13.19 final String pkgName = fullName.substring(0, index);
14.1 --- a/src/jdk/nashorn/internal/runtime/ScriptLoader.java Thu Feb 05 16:26:36 2015 +0100 14.2 +++ b/src/jdk/nashorn/internal/runtime/ScriptLoader.java Thu Feb 05 19:08:00 2015 +0530 14.3 @@ -26,6 +26,7 @@ 14.4 package jdk.nashorn.internal.runtime; 14.5 14.6 import java.security.CodeSource; 14.7 +import java.util.Objects; 14.8 14.9 /** 14.10 * Responsible for loading script generated classes. 14.11 @@ -69,8 +70,7 @@ 14.12 * @return Installed class. 14.13 */ 14.14 synchronized Class<?> installClass(final String name, final byte[] data, final CodeSource cs) { 14.15 - // null check 14.16 - cs.getClass(); 14.17 + Objects.requireNonNull(cs); 14.18 return defineClass(name, data, 0, data.length, cs); 14.19 } 14.20 }
15.1 --- a/src/jdk/nashorn/internal/runtime/linker/JavaSuperAdapter.java Thu Feb 05 16:26:36 2015 +0100 15.2 +++ b/src/jdk/nashorn/internal/runtime/linker/JavaSuperAdapter.java Thu Feb 05 19:08:00 2015 +0530 15.3 @@ -25,6 +25,8 @@ 15.4 15.5 package jdk.nashorn.internal.runtime.linker; 15.6 15.7 +import java.util.Objects; 15.8 + 15.9 /** 15.10 * Represents a an adapter for invoking superclass methods on an adapter instance generated by 15.11 * {@code JavaAdapterBytecodeGenerator}. Note that objects of this class are just wrappers around the adapter instances, 15.12 @@ -34,7 +36,7 @@ 15.13 private final Object adapter; 15.14 15.15 JavaSuperAdapter(final Object adapter) { 15.16 - adapter.getClass(); // NPE check 15.17 + Objects.requireNonNull(adapter); 15.18 this.adapter = adapter; 15.19 } 15.20
16.1 --- a/src/jdk/nashorn/internal/runtime/options/Options.java Thu Feb 05 16:26:36 2015 +0100 16.2 +++ b/src/jdk/nashorn/internal/runtime/options/Options.java Thu Feb 05 19:08:00 2015 +0530 16.3 @@ -42,6 +42,7 @@ 16.4 import java.util.Locale; 16.5 import java.util.Map; 16.6 import java.util.MissingResourceException; 16.7 +import java.util.Objects; 16.8 import java.util.PropertyPermission; 16.9 import java.util.ResourceBundle; 16.10 import java.util.StringTokenizer; 16.11 @@ -143,7 +144,7 @@ 16.12 * @return true if set to true, default value if unset or set to false 16.13 */ 16.14 public static boolean getBooleanProperty(final String name, final Boolean defValue) { 16.15 - name.getClass(); // null check 16.16 + Objects.requireNonNull(name); 16.17 if (!name.startsWith("nashorn.")) { 16.18 throw new IllegalArgumentException(name); 16.19 } 16.20 @@ -184,7 +185,7 @@ 16.21 * @return string property if set or default value 16.22 */ 16.23 public static String getStringProperty(final String name, final String defValue) { 16.24 - name.getClass(); // null check 16.25 + Objects.requireNonNull(name); 16.26 if (! name.startsWith("nashorn.")) { 16.27 throw new IllegalArgumentException(name); 16.28 } 16.29 @@ -211,7 +212,7 @@ 16.30 * @return integer property if set or default value 16.31 */ 16.32 public static int getIntProperty(final String name, final int defValue) { 16.33 - name.getClass(); // null check 16.34 + Objects.requireNonNull(name); 16.35 if (! name.startsWith("nashorn.")) { 16.36 throw new IllegalArgumentException(name); 16.37 }
17.1 --- a/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Thu Feb 05 16:26:36 2015 +0100 17.2 +++ b/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Thu Feb 05 19:08:00 2015 +0530 17.3 @@ -721,6 +721,15 @@ 17.4 assertTrue(invoked.get()); 17.5 } 17.6 17.7 + @Test 17.8 + public void testLengthOnArrayLikeObjects() throws Exception { 17.9 + final ScriptEngine e = new ScriptEngineManager().getEngineByName("nashorn"); 17.10 + final Object val = e.eval("var arr = { length: 1, 0: 1}; arr.length"); 17.11 + 17.12 + assertTrue(Number.class.isAssignableFrom(val.getClass())); 17.13 + assertTrue(((Number)val).intValue() == 1); 17.14 + } 17.15 + 17.16 // @bug JDK-8068603: NashornScriptEngine.put/get() impls don't conform to NPE, IAE spec assertions 17.17 @Test 17.18 public void illegalBindingsValuesTest() throws Exception {