< prev index next >

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

Print this page




  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package jdk.nashorn.internal.runtime.linker;
  27 
  28 import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup;
  29 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
  30 
  31 import java.lang.invoke.CallSite;
  32 import java.lang.invoke.MethodHandle;
  33 import java.lang.invoke.MethodHandles;
  34 import java.lang.invoke.MethodHandles.Lookup;
  35 import java.lang.invoke.MethodType;



  36 import jdk.dynalink.CallSiteDescriptor;
  37 import jdk.dynalink.DynamicLinker;
  38 import jdk.dynalink.DynamicLinkerFactory;
  39 import jdk.dynalink.beans.BeansLinker;
  40 import jdk.dynalink.beans.StaticClass;
  41 import jdk.dynalink.linker.GuardedInvocation;
  42 import jdk.dynalink.linker.GuardingDynamicLinker;
  43 import jdk.dynalink.linker.LinkRequest;
  44 import jdk.dynalink.linker.LinkerServices;
  45 import jdk.dynalink.linker.MethodTypeConversionStrategy;
  46 import jdk.dynalink.linker.TypeBasedGuardingDynamicLinker;
  47 import jdk.dynalink.linker.support.TypeUtilities;
  48 import jdk.nashorn.api.scripting.JSObject;
  49 import jdk.nashorn.internal.codegen.CompilerConstants.Call;
  50 import jdk.nashorn.internal.lookup.MethodHandleFactory;
  51 import jdk.nashorn.internal.lookup.MethodHandleFunctionality;
  52 import jdk.nashorn.internal.runtime.Context;
  53 import jdk.nashorn.internal.runtime.ECMAException;
  54 import jdk.nashorn.internal.runtime.JSType;
  55 import jdk.nashorn.internal.runtime.OptimisticReturnFilters;
  56 import jdk.nashorn.internal.runtime.ScriptFunction;
  57 import jdk.nashorn.internal.runtime.ScriptRuntime;
  58 
  59 /**
  60  * This class houses bootstrap method for invokedynamic instructions generated by compiler.
  61  */
  62 public final class Bootstrap {
  63     /** Reference to the seed boostrap function */
  64     public static final Call BOOTSTRAP = staticCallNoLookup(Bootstrap.class, "bootstrap", CallSite.class, Lookup.class, String.class, MethodType.class, int.class);
  65 
  66     private static final MethodHandleFunctionality MH = MethodHandleFactory.getFunctionality();
  67 
  68     private static final MethodHandle VOID_TO_OBJECT = MH.constant(Object.class, ScriptRuntime.UNDEFINED);
  69 
  70     private static final BeansLinker beansLinker = new BeansLinker(Bootstrap::createMissingMemberHandler);
  71     private static final GuardingDynamicLinker[] prioritizedLinkers;
  72     private static final GuardingDynamicLinker[] fallbackLinkers;

  73     static {
  74         final NashornBeansLinker nashornBeansLinker = new NashornBeansLinker(beansLinker);
  75         prioritizedLinkers = new GuardingDynamicLinker[] {
  76             new NashornLinker(),
  77             new NashornPrimitiveLinker(),
  78             new NashornStaticClassLinker(beansLinker),
  79             new BoundCallableLinker(),
  80             new JavaSuperAdapterLinker(beansLinker),
  81             new JSObjectLinker(nashornBeansLinker),
  82             new BrowserJSObjectLinker(nashornBeansLinker),
  83             new ReflectionCheckLinker()
  84         };
  85         fallbackLinkers = new GuardingDynamicLinker[] {nashornBeansLinker, new NashornBottomLinker() };
  86     }
  87 
  88     // do not create me!!
  89     private Bootstrap() {













  90     }
  91 
  92     /**
  93      * Creates a Nashorn dynamic linker with the given app class loader.
  94      * @param appLoader the app class loader. It will be used to discover
  95      * additional language runtime linkers (if any).
  96      * @param unstableRelinkThreshold the unstable relink threshold
  97      * @return a newly created dynamic linker.
  98      */
  99     public static DynamicLinker createDynamicLinker(final ClassLoader appLoader,
 100             final int unstableRelinkThreshold) {
 101         final DynamicLinkerFactory factory = new DynamicLinkerFactory();
 102         factory.setPrioritizedLinkers(prioritizedLinkers);
 103         factory.setFallbackLinkers(fallbackLinkers);
 104         factory.setSyncOnRelink(true);
 105         factory.setPrelinkTransformer((inv, request, linkerServices) -> {
 106             final CallSiteDescriptor desc = request.getCallSiteDescriptor();
 107             return OptimisticReturnFilters.filterOptimisticReturnValue(inv, desc).asType(linkerServices, desc.getMethodType());
 108         });
 109         factory.setAutoConversionStrategy(Bootstrap::unboxReturnType);




  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package jdk.nashorn.internal.runtime.linker;
  27 
  28 import static jdk.nashorn.internal.codegen.CompilerConstants.staticCallNoLookup;
  29 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
  30 
  31 import java.lang.invoke.CallSite;
  32 import java.lang.invoke.MethodHandle;
  33 import java.lang.invoke.MethodHandles;
  34 import java.lang.invoke.MethodHandles.Lookup;
  35 import java.lang.invoke.MethodType;
  36 import java.util.ArrayList;
  37 import java.util.Collections;
  38 import java.util.List;
  39 import jdk.dynalink.CallSiteDescriptor;
  40 import jdk.dynalink.DynamicLinker;
  41 import jdk.dynalink.DynamicLinkerFactory;
  42 import jdk.dynalink.beans.BeansLinker;
  43 import jdk.dynalink.beans.StaticClass;
  44 import jdk.dynalink.linker.GuardedInvocation;
  45 import jdk.dynalink.linker.GuardingDynamicLinker;
  46 import jdk.dynalink.linker.LinkRequest;
  47 import jdk.dynalink.linker.LinkerServices;
  48 import jdk.dynalink.linker.MethodTypeConversionStrategy;
  49 import jdk.dynalink.linker.TypeBasedGuardingDynamicLinker;
  50 import jdk.dynalink.linker.support.TypeUtilities;
  51 import jdk.nashorn.api.scripting.JSObject;
  52 import jdk.nashorn.internal.codegen.CompilerConstants.Call;
  53 import jdk.nashorn.internal.lookup.MethodHandleFactory;
  54 import jdk.nashorn.internal.lookup.MethodHandleFunctionality;
  55 import jdk.nashorn.internal.runtime.Context;
  56 import jdk.nashorn.internal.runtime.ECMAException;
  57 import jdk.nashorn.internal.runtime.JSType;
  58 import jdk.nashorn.internal.runtime.OptimisticReturnFilters;
  59 import jdk.nashorn.internal.runtime.ScriptFunction;
  60 import jdk.nashorn.internal.runtime.ScriptRuntime;
  61 
  62 /**
  63  * This class houses bootstrap method for invokedynamic instructions generated by compiler.
  64  */
  65 public final class Bootstrap {
  66     /** Reference to the seed boostrap function */
  67     public static final Call BOOTSTRAP = staticCallNoLookup(Bootstrap.class, "bootstrap", CallSite.class, Lookup.class, String.class, MethodType.class, int.class);
  68 
  69     private static final MethodHandleFunctionality MH = MethodHandleFactory.getFunctionality();
  70 
  71     private static final MethodHandle VOID_TO_OBJECT = MH.constant(Object.class, ScriptRuntime.UNDEFINED);
  72 
  73     private static final BeansLinker beansLinker = new BeansLinker(Bootstrap::createMissingMemberHandler);
  74     private static final GuardingDynamicLinker[] prioritizedLinkers;
  75     private static final GuardingDynamicLinker[] fallbackLinkers;
  76 
  77     static {
  78         final NashornBeansLinker nashornBeansLinker = new NashornBeansLinker(beansLinker);
  79         prioritizedLinkers = new GuardingDynamicLinker[] {
  80             new NashornLinker(),
  81             new NashornPrimitiveLinker(),
  82             new NashornStaticClassLinker(beansLinker),
  83             new BoundCallableLinker(),
  84             new JavaSuperAdapterLinker(beansLinker),
  85             new JSObjectLinker(nashornBeansLinker),
  86             new BrowserJSObjectLinker(nashornBeansLinker),
  87             new ReflectionCheckLinker()
  88         };
  89         fallbackLinkers = new GuardingDynamicLinker[] {nashornBeansLinker, new NashornBottomLinker() };
  90     }
  91 
  92     // do not create me!!
  93     private Bootstrap() {
  94     }
  95 
  96     /**
  97      * Returns a list of exposed nashorn dynalink linkers.
  98      *
  99      * @return a list of exposed nashorn dynalink linkers.
 100      */
 101     public static List<GuardingDynamicLinker> getExposedLinkers() {
 102         // we have to create BeansLinker without nashorn specific missing member handler!
 103         // Or else, we'd return values such as 'undefined' to the external world!
 104         final NashornBeansLinker nbl = new NashornBeansLinker(new BeansLinker());
 105         final JSObjectLinker linker = new JSObjectLinker(nbl);
 106         return Collections.singletonList(linker);
 107     }
 108 
 109     /**
 110      * Creates a Nashorn dynamic linker with the given app class loader.
 111      * @param appLoader the app class loader. It will be used to discover
 112      * additional language runtime linkers (if any).
 113      * @param unstableRelinkThreshold the unstable relink threshold
 114      * @return a newly created dynamic linker.
 115      */
 116     public static DynamicLinker createDynamicLinker(final ClassLoader appLoader,
 117             final int unstableRelinkThreshold) {
 118         final DynamicLinkerFactory factory = new DynamicLinkerFactory();
 119         factory.setPrioritizedLinkers(prioritizedLinkers);
 120         factory.setFallbackLinkers(fallbackLinkers);
 121         factory.setSyncOnRelink(true);
 122         factory.setPrelinkTransformer((inv, request, linkerServices) -> {
 123             final CallSiteDescriptor desc = request.getCallSiteDescriptor();
 124             return OptimisticReturnFilters.filterOptimisticReturnValue(inv, desc).asType(linkerServices, desc.getMethodType());
 125         });
 126         factory.setAutoConversionStrategy(Bootstrap::unboxReturnType);


< prev index next >