src/jdk/nashorn/internal/runtime/NativeJavaPackage.java

Print this page
rev 746 : 8031715: Indexed access to java package not working
Reviewed-by: lagergren, hannesw
rev 760 : 8037400: Remove getInitialMap getters and GlobalObject interface
Reviewed-by: lagergren, jlaskey, attila

*** 33,43 **** import jdk.internal.dynalink.linker.GuardedInvocation; import jdk.internal.dynalink.linker.LinkRequest; import jdk.internal.dynalink.support.Guards; import jdk.nashorn.internal.lookup.MethodHandleFactory; import jdk.nashorn.internal.lookup.MethodHandleFunctionality; - import jdk.nashorn.internal.objects.NativeJava; import jdk.nashorn.internal.objects.annotations.Attribute; import jdk.nashorn.internal.objects.annotations.Function; /** * An object that exposes Java packages and classes as its properties. Packages are exposed as objects that have further --- 33,42 ----
*** 50,60 **** * or you can store the type objects in a variable for later reuse: * <pre> * var ArrayList = java.util.ArrayList * var list = new ArrayList * </pre> ! * You can also use {@link NativeJava#type(Object, Object)} to access Java classes. These two statements are mostly * equivalent: * <pre> * var listType1 = java.util.ArrayList * var listType2 = Java.type("java.util.ArrayList") * </pre> --- 49,59 ---- * or you can store the type objects in a variable for later reuse: * <pre> * var ArrayList = java.util.ArrayList * var list = new ArrayList * </pre> ! * You can also use {@link jdk.nashorn.internal.objects.NativeJava#type(Object, Object)} to access Java classes. These two statements are mostly * equivalent: * <pre> * var listType1 = java.util.ArrayList * var listType2 = Java.type("java.util.ArrayList") * </pre>
*** 196,229 **** * @return Link to be invoked at call site. */ @Override public GuardedInvocation noSuchProperty(final CallSiteDescriptor desc, final LinkRequest request) { final String propertyName = desc.getNameToken(2); ! final String fullName = name.isEmpty() ? propertyName : name + "." + propertyName; final Context context = Context.getContextTrusted(); Class<?> javaClass = null; try { javaClass = context.findClass(fullName); } catch (final NoClassDefFoundError | ClassNotFoundException e) { //ignored } if (javaClass == null) { ! set(propertyName, new NativeJavaPackage(fullName, getProto()), false); } else { ! set(propertyName, StaticClass.forClass(javaClass), false); } ! return super.lookup(desc, request); ! } ! ! @Override ! public GuardedInvocation noSuchMethod(final CallSiteDescriptor desc, final LinkRequest request) { ! return noSuchProperty(desc, request); ! } ! ! private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) { ! return MH.findStatic(MethodHandles.lookup(), NativeJavaPackage.class, name, MH.type(rtype, types)); } } --- 195,239 ---- * @return Link to be invoked at call site. */ @Override public GuardedInvocation noSuchProperty(final CallSiteDescriptor desc, final LinkRequest request) { final String propertyName = desc.getNameToken(2); ! createProperty(propertyName); ! return super.lookup(desc, request); ! } ! ! @Override ! protected Object invokeNoSuchProperty(final String name) { ! return createProperty(name); ! } ! ! @Override ! public GuardedInvocation noSuchMethod(final CallSiteDescriptor desc, final LinkRequest request) { ! return noSuchProperty(desc, request); ! } ! ! private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) { ! return MH.findStatic(MethodHandles.lookup(), NativeJavaPackage.class, name, MH.type(rtype, types)); ! } + private Object createProperty(final String propertyName) { + final String fullName = name.isEmpty() ? propertyName : name + "." + propertyName; final Context context = Context.getContextTrusted(); Class<?> javaClass = null; try { javaClass = context.findClass(fullName); } catch (final NoClassDefFoundError | ClassNotFoundException e) { //ignored } + final Object propertyValue; if (javaClass == null) { ! propertyValue = new NativeJavaPackage(fullName, getProto()); } else { ! propertyValue = StaticClass.forClass(javaClass); } ! set(propertyName, propertyValue, false); ! return propertyValue; } }