28 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_GETMEMBER; 29 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_GETSLOT; 30 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_SETMEMBER; 31 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_SETSLOT; 32 import java.lang.invoke.MethodHandle; 33 import java.lang.invoke.MethodHandles; 34 import jdk.internal.dynalink.CallSiteDescriptor; 35 import jdk.internal.dynalink.linker.GuardedInvocation; 36 import jdk.internal.dynalink.linker.LinkRequest; 37 import jdk.internal.dynalink.linker.LinkerServices; 38 import jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker; 39 import jdk.internal.dynalink.support.CallSiteDescriptorFactory; 40 import jdk.nashorn.internal.lookup.MethodHandleFactory; 41 import jdk.nashorn.internal.lookup.MethodHandleFunctionality; 42 import jdk.nashorn.internal.runtime.JSType; 43 44 /** 45 * A Dynalink linker to handle web browser built-in JS (DOM etc.) objects. 46 */ 47 final class BrowserJSObjectLinker implements TypeBasedGuardingDynamicLinker { 48 private static final ClassLoader myLoader = BrowserJSObjectLinker.class.getClassLoader(); 49 private static final String JSOBJECT_CLASS = "netscape.javascript.JSObject"; 50 // not final because this is lazily initialized 51 // when we hit a subclass for the first time. 52 private static volatile Class<?> jsObjectClass; 53 private final NashornBeansLinker nashornBeansLinker; 54 55 BrowserJSObjectLinker(final NashornBeansLinker nashornBeansLinker) { 56 this.nashornBeansLinker = nashornBeansLinker; 57 } 58 59 @Override 60 public boolean canLinkType(final Class<?> type) { 61 return canLinkTypeStatic(type); 62 } 63 64 static boolean canLinkTypeStatic(final Class<?> type) { 65 if (jsObjectClass != null && jsObjectClass.isAssignableFrom(type)) { 66 return true; 67 } 68 69 // check if this class is a subclass of JSObject 70 Class<?> clazz = type; 71 while (clazz != null) { 72 if (clazz.getClassLoader() == myLoader && 73 clazz.getName().equals(JSOBJECT_CLASS)) { 74 jsObjectClass = clazz; 75 return true; 76 } 77 clazz = clazz.getSuperclass(); 78 } 79 80 return false; 81 } 82 83 private static void checkJSObjectClass() { 84 assert jsObjectClass != null : JSOBJECT_CLASS + " not found!"; 85 } 86 87 @Override 88 public GuardedInvocation getGuardedInvocation(final LinkRequest request, final LinkerServices linkerServices) throws Exception { 89 final LinkRequest requestWithoutContext = request.withoutRuntimeContext(); // Nashorn has no runtime context 90 final Object self = requestWithoutContext.getReceiver(); 91 final CallSiteDescriptor desc = requestWithoutContext.getCallSiteDescriptor(); 92 checkJSObjectClass(); | 28 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_GETMEMBER; 29 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_GETSLOT; 30 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_SETMEMBER; 31 import static jdk.nashorn.internal.runtime.linker.BrowserJSObjectLinker.JSObjectHandles.JSOBJECT_SETSLOT; 32 import java.lang.invoke.MethodHandle; 33 import java.lang.invoke.MethodHandles; 34 import jdk.internal.dynalink.CallSiteDescriptor; 35 import jdk.internal.dynalink.linker.GuardedInvocation; 36 import jdk.internal.dynalink.linker.LinkRequest; 37 import jdk.internal.dynalink.linker.LinkerServices; 38 import jdk.internal.dynalink.linker.TypeBasedGuardingDynamicLinker; 39 import jdk.internal.dynalink.support.CallSiteDescriptorFactory; 40 import jdk.nashorn.internal.lookup.MethodHandleFactory; 41 import jdk.nashorn.internal.lookup.MethodHandleFunctionality; 42 import jdk.nashorn.internal.runtime.JSType; 43 44 /** 45 * A Dynalink linker to handle web browser built-in JS (DOM etc.) objects. 46 */ 47 final class BrowserJSObjectLinker implements TypeBasedGuardingDynamicLinker { 48 private static ClassLoader extLoader; 49 static { 50 extLoader = BrowserJSObjectLinker.class.getClassLoader(); 51 // in case nashorn is loaded as bootstrap! 52 if (extLoader == null) { 53 extLoader = ClassLoader.getSystemClassLoader().getParent(); 54 } 55 } 56 57 private static final String JSOBJECT_CLASS = "netscape.javascript.JSObject"; 58 // not final because this is lazily initialized 59 // when we hit a subclass for the first time. 60 private static volatile Class<?> jsObjectClass; 61 private final NashornBeansLinker nashornBeansLinker; 62 63 BrowserJSObjectLinker(final NashornBeansLinker nashornBeansLinker) { 64 this.nashornBeansLinker = nashornBeansLinker; 65 } 66 67 @Override 68 public boolean canLinkType(final Class<?> type) { 69 return canLinkTypeStatic(type); 70 } 71 72 static boolean canLinkTypeStatic(final Class<?> type) { 73 if (jsObjectClass != null && jsObjectClass.isAssignableFrom(type)) { 74 return true; 75 } 76 77 // check if this class is a subclass of JSObject 78 Class<?> clazz = type; 79 while (clazz != null) { 80 if (clazz.getClassLoader() == extLoader && 81 clazz.getName().equals(JSOBJECT_CLASS)) { 82 jsObjectClass = clazz; 83 return true; 84 } 85 clazz = clazz.getSuperclass(); 86 } 87 88 return false; 89 } 90 91 private static void checkJSObjectClass() { 92 assert jsObjectClass != null : JSOBJECT_CLASS + " not found!"; 93 } 94 95 @Override 96 public GuardedInvocation getGuardedInvocation(final LinkRequest request, final LinkerServices linkerServices) throws Exception { 97 final LinkRequest requestWithoutContext = request.withoutRuntimeContext(); // Nashorn has no runtime context 98 final Object self = requestWithoutContext.getReceiver(); 99 final CallSiteDescriptor desc = requestWithoutContext.getCallSiteDescriptor(); 100 checkJSObjectClass(); |