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,11 +33,10 @@
 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

@@ -50,11 +49,11 @@
  * 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
+ * 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,34 +195,45 @@
      * @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;
+        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) {
-            set(propertyName, new NativeJavaPackage(fullName, getProto()), false);
+            propertyValue = new NativeJavaPackage(fullName, getProto());
         } else {
-            set(propertyName, StaticClass.forClass(javaClass), false);
+            propertyValue = StaticClass.forClass(javaClass);
         }
 
-        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));
+        set(propertyName, propertyValue, false);
+        return propertyValue;
     }
 }