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