Wed, 26 Aug 2015 20:30:34 +0200
8134403: Nashorn react.js benchmark performance regression
Reviewed-by: hannesw, sundar
src/jdk/nashorn/internal/runtime/UserAccessorProperty.java | file | annotate | diff | comparison | revisions |
1.1 --- a/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java Mon Aug 31 14:00:51 2015 -0700 1.2 +++ b/src/jdk/nashorn/internal/runtime/UserAccessorProperty.java Wed Aug 26 20:30:34 2015 +0200 1.3 @@ -24,7 +24,6 @@ 1.4 */ 1.5 1.6 package jdk.nashorn.internal.runtime; 1.7 - 1.8 import static jdk.nashorn.internal.lookup.Lookup.MH; 1.9 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; 1.10 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED; 1.11 @@ -34,6 +33,7 @@ 1.12 import java.lang.invoke.MethodHandle; 1.13 import java.lang.invoke.MethodHandles; 1.14 import java.lang.invoke.MethodType; 1.15 +import java.util.concurrent.Callable; 1.16 import jdk.nashorn.internal.lookup.Lookup; 1.17 import jdk.nashorn.internal.runtime.linker.Bootstrap; 1.18 import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor; 1.19 @@ -80,6 +80,15 @@ 1.20 private final static MethodHandle INVOKE_LONG_SETTER = findOwnMH_S("invokeLongSetter", void.class, Accessors.class, MethodHandle.class, String.class, Object.class, long.class); 1.21 private final static MethodHandle INVOKE_NUMBER_SETTER = findOwnMH_S("invokeNumberSetter", void.class, Accessors.class, MethodHandle.class, String.class, Object.class, double.class); 1.22 1.23 + private static final Object OBJECT_GETTER_INVOKER_KEY = new Object(); 1.24 + private static MethodHandle getObjectGetterInvoker() { 1.25 + return Context.getGlobal().getDynamicInvoker(OBJECT_GETTER_INVOKER_KEY, new Callable<MethodHandle>() { 1.26 + @Override 1.27 + public MethodHandle call() throws Exception { 1.28 + return getINVOKE_UA_GETTER(Object.class, INVALID_PROGRAM_POINT); 1.29 + } 1.30 + }); 1.31 + } 1.32 1.33 static MethodHandle getINVOKE_UA_GETTER(final Class<?> returnType, final int programPoint) { 1.34 if (UnwarrantedOptimismException.isValid(programPoint)) { 1.35 @@ -90,6 +99,16 @@ 1.36 } 1.37 } 1.38 1.39 + private static final Object OBJECT_SETTER_INVOKER_KEY = new Object(); 1.40 + private static MethodHandle getObjectSetterInvoker() { 1.41 + return Context.getGlobal().getDynamicInvoker(OBJECT_SETTER_INVOKER_KEY, new Callable<MethodHandle>() { 1.42 + @Override 1.43 + public MethodHandle call() throws Exception { 1.44 + return getINVOKE_UA_SETTER(Object.class); 1.45 + } 1.46 + }); 1.47 + } 1.48 + 1.49 static MethodHandle getINVOKE_UA_SETTER(final Class<?> valueType) { 1.50 return Bootstrap.createDynamicInvoker("dyn:call", void.class, Object.class, Object.class, valueType); 1.51 } 1.52 @@ -181,7 +200,7 @@ 1.53 @Override 1.54 public Object getObjectValue(final ScriptObject self, final ScriptObject owner) { 1.55 try { 1.56 - return invokeObjectGetter(getAccessors((owner != null) ? owner : self), getINVOKE_UA_GETTER(Object.class, INVALID_PROGRAM_POINT), self); 1.57 + return invokeObjectGetter(getAccessors((owner != null) ? owner : self), getObjectGetterInvoker(), self); 1.58 } catch (final Error | RuntimeException t) { 1.59 throw t; 1.60 } catch (final Throwable t) { 1.61 @@ -207,7 +226,7 @@ 1.62 @Override 1.63 public void setValue(final ScriptObject self, final ScriptObject owner, final Object value, final boolean strict) { 1.64 try { 1.65 - invokeObjectSetter(getAccessors((owner != null) ? owner : self), getINVOKE_UA_SETTER(Object.class), strict ? getKey() : null, self, value); 1.66 + invokeObjectSetter(getAccessors((owner != null) ? owner : self), getObjectSetterInvoker(), strict ? getKey() : null, self, value); 1.67 } catch (final Error | RuntimeException t) { 1.68 throw t; 1.69 } catch (final Throwable t) {