/** * Creates a Nashorn dynamic linker with the given app class loader. * @param appLoader the app class loader. It will be used to discover * additional language runtime linkers (if any). * @param unstableRelinkThreshold the unstable relink threshold * @return a newly created dynamic linker. */ public static DynamicLinker createDynamicLinker(final ClassLoader appLoader, final int unstableRelinkThreshold) { final DynamicLinkerFactory factory = new DynamicLinkerFactory(); factory.setPrioritizedLinkers(prioritizedLinkers); factory.setFallbackLinkers(fallbackLinkers); factory.setSyncOnRelink(true); factory.setPrelinkTransformer((inv, request, linkerServices) -> { final CallSiteDescriptor desc = request.getCallSiteDescriptor(); return OptimisticReturnFilters.filterOptimisticReturnValue(inv, desc).asType(linkerServices, desc.getMethodType()); }); factory.setAutoConversionStrategy(Bootstrap::unboxReturnType); factory.setInternalObjectsFilter(NashornBeansLinker.createHiddenObjectFilter()); factory.setUnstableRelinkThreshold(unstableRelinkThreshold); // Linkers for any additional language runtimes deployed alongside Nashorn will be picked up by the factory. factory.setClassLoader(appLoader); return factory.createLinker(); }
@Override public GuardedInvocation filter(final GuardedInvocation inv, final LinkRequest request, final LinkerServices linkerServices) { final CallSiteDescriptor desc = request.getCallSiteDescriptor(); return OptimisticReturnFilters.filterOptimisticReturnValue(inv, desc).asType(linkerServices, desc.getMethodType()); }