23 * questions. |
23 * questions. |
24 */ |
24 */ |
25 |
25 |
26 package jdk.nashorn.internal.runtime.linker; |
26 package jdk.nashorn.internal.runtime.linker; |
27 |
27 |
|
28 import java.lang.reflect.Modifier; |
28 import jdk.internal.dynalink.CallSiteDescriptor; |
29 import jdk.internal.dynalink.CallSiteDescriptor; |
29 import jdk.internal.dynalink.beans.BeansLinker; |
30 import jdk.internal.dynalink.beans.BeansLinker; |
30 import jdk.internal.dynalink.beans.StaticClass; |
31 import jdk.internal.dynalink.beans.StaticClass; |
31 import jdk.internal.dynalink.linker.GuardedInvocation; |
32 import jdk.internal.dynalink.linker.GuardedInvocation; |
32 import jdk.internal.dynalink.linker.GuardingDynamicLinker; |
33 import jdk.internal.dynalink.linker.GuardingDynamicLinker; |
63 final Object self = request.getReceiver(); |
64 final Object self = request.getReceiver(); |
64 if (self.getClass() != StaticClass.class) { |
65 if (self.getClass() != StaticClass.class) { |
65 return null; |
66 return null; |
66 } |
67 } |
67 final Class<?> receiverClass = ((StaticClass) self).getRepresentedClass(); |
68 final Class<?> receiverClass = ((StaticClass) self).getRepresentedClass(); |
|
69 |
68 Bootstrap.checkReflectionAccess(receiverClass, true); |
70 Bootstrap.checkReflectionAccess(receiverClass, true); |
69 final CallSiteDescriptor desc = request.getCallSiteDescriptor(); |
71 final CallSiteDescriptor desc = request.getCallSiteDescriptor(); |
70 // We intercept "new" on StaticClass instances to provide additional capabilities |
72 // We intercept "new" on StaticClass instances to provide additional capabilities |
71 if ("new".equals(desc.getNameToken(CallSiteDescriptor.OPERATOR))) { |
73 if ("new".equals(desc.getNameToken(CallSiteDescriptor.OPERATOR))) { |
|
74 if (! Modifier.isPublic(receiverClass.getModifiers())) { |
|
75 throw ECMAErrors.typeError("new.on.nonpublic.javatype", receiverClass.getName()); |
|
76 } |
|
77 |
72 // make sure new is on accessible Class |
78 // make sure new is on accessible Class |
73 Context.checkPackageAccess(receiverClass); |
79 Context.checkPackageAccess(receiverClass); |
74 |
80 |
75 // Is the class abstract? (This includes interfaces.) |
81 // Is the class abstract? (This includes interfaces.) |
76 if (NashornLinker.isAbstractClass(receiverClass)) { |
82 if (NashornLinker.isAbstractClass(receiverClass)) { |