src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/BrowserJSObjectLinker.java

Print this page




  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();