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;
}
}