.insert(1, arrayOf("selfClass", "name"), arrayOf(RubyModule.class, String.class), implClass, name) .insert(5, arrayOf("scope"), arrayOf(StaticScope.class), scope) .invokeVirtualQuiet(lookup(), "preMethodFrameAndScope") .handle(); .insert(1, arrayOf("selfClass", "name"), arrayOf(RubyModule.class, String.class), implClass, name) .insert(5, arrayOf("scope"), arrayOf(StaticScope.class), scope) .invokeVirtualQuiet(lookup(), "preMethodFrameAndDummyScope") .handle(); .insert(1, arrayOf("selfClass", "name"), arrayOf(RubyModule.class, String.class), implClass, name) .invokeVirtualQuiet(lookup(), "preMethodFrameOnly") .handle(); .insert(1, arrayOf("selfClass", "scope"), arrayOf(RubyModule.class, StaticScope.class), implClass, scope) .invokeVirtualQuiet(lookup(), "preMethodScopeOnly") .handle(); .insert(1, arrayOf("selfClass", "scope"), arrayOf(RubyModule.class, StaticScope.class), implClass, scope) .invokeVirtualQuiet(lookup(), "preMethodNoFrameAndDummyScope") .handle();
public static void checkArity(int required, int optional, boolean rest, ThreadContext context, IRubyObject caller, IRubyObject self, IRubyObject[] args, Block block) { checkArity(required, optional, rest, context, caller, self, args); }
private static int getNativeArgCount(DynamicMethod method, NativeCall nativeCall) { // if non-Java, must: // * exactly match arities or both are [] boxed // * 3 or fewer arguments int nativeArgCount = (method instanceof CompiledMethod || method instanceof JittedMethod) ? getRubyArgCount(nativeCall.getNativeSignature()) : getArgCount(nativeCall.getNativeSignature(), nativeCall.isStatic()); return nativeArgCount; }
public static MethodHandle wrapWithFraming(Signature signature, CallConfiguration callConfig, RubyModule implClass, String name, MethodHandle nativeTarget, StaticScope scope) { MethodHandle framePre = getFramePre(signature, callConfig, implClass, name, scope); if (framePre != null) { MethodHandle framePost = getFramePost(signature, callConfig); // break, return, redo handling boolean heapScoped = callConfig.scoping() != Scoping.None; boolean framed = callConfig.framing() != Framing.None; // post logic for frame nativeTarget = Binder .from(nativeTarget.type()) .tryFinally(framePost) .invoke(nativeTarget); // pre logic for frame nativeTarget = foldArguments(nativeTarget, framePre); // call polling and call number increment nativeTarget = Binder .from(nativeTarget.type()) .fold(Binder .from(nativeTarget.type().changeReturnType(void.class)) .permute(0) .invokeStaticQuiet(lookup(), ThreadContext.class, "callThreadPoll")) .invoke(nativeTarget); } return nativeTarget; }
(!site.hasSeenType(selfClass.id) && site.seenTypesCount() + 1 > RubyInstanceConfig.MAX_POLY_COUNT)) { site.setTarget(target = createFail((block?FAILS_B:FAILS)[arity], site, name, entry.method)); } else { target = postProcess(site, target); if (RubyInstanceConfig.LOG_INDY_BINDINGS) LOG.info(name + "\tadded to PIC " + logMethod(entry.method)); fallback = site.getTarget(); curry = false; gwt = createGWT(test, target, fallback, entry, site, curry);
public static MethodHandle wrapWithFrameOnly(Signature signature, RubyModule implClass, String name, MethodHandle nativeTarget) { MethodHandle framePre = getFrameOnlyPre(signature, CallConfiguration.FrameFullScopeNone, implClass, name); MethodHandle framePost = getFramePost(signature, CallConfiguration.FrameFullScopeNone); // post logic for frame nativeTarget = Binder .from(nativeTarget.type()) .tryFinally(framePost) .invoke(nativeTarget); // pre logic for frame nativeTarget = foldArguments(nativeTarget, framePre); // call polling and call number increment nativeTarget = Binder .from(nativeTarget.type()) .fold(Binder .from(nativeTarget.type().changeReturnType(void.class)) .permute(0) .invokeStaticQuiet(lookup(), ThreadContext.class, "callThreadPoll")) .invoke(nativeTarget); return nativeTarget; }
private static MethodHandle getTarget(JRubyCallSite site, RubyClass cls, CacheEntry entry, int arity) { IndirectBindingException ibe; try { return tryDispatchDirect(site, cls, entry.method); } catch (IndirectBindingException _ibe) { ibe = _ibe; // proceed with indirect, if enabled } // if indirect indy-bound methods (via DynamicMethod.call) are disabled, bail out if (!RubyInstanceConfig.INVOKEDYNAMIC_INDIRECT) { if (RubyInstanceConfig.LOG_INDY_BINDINGS) LOG.info(site.name() + "\tfailed to bind to " + logMethod(entry.method) + ": " + ibe.getMessage()); return null; } // no direct native path, use DynamicMethod.call if (RubyInstanceConfig.LOG_INDY_BINDINGS) LOG.info(site.name() + "\tbound indirectly to " + logMethod(entry.method) + ": " + ibe.getMessage()); MethodHandle dynMethodTarget = getDynamicMethodTarget(site.type(), arity, entry.method); dynMethodTarget = insertArguments(dynMethodTarget, 4, site.name()); dynMethodTarget = insertArguments(dynMethodTarget, 0, entry.method); return dynMethodTarget; }
private static MethodHandle postProcessNativeHandle(MethodHandle nativeTarget, JRubyCallSite site, DynamicMethod method, boolean checkArity, boolean rewriteStackTrace) { if (nativeTarget != null) { nativeTarget = addOrRemoveBlock(site, nativeTarget); int nativeArgCount = getNativeArgCount(method, method.getNativeCall());
return getFrameOnlyPre(signature, callConfig, implClass, name);
public static MethodHandle wrapWithFraming(Signature signature, CallConfiguration callConfig, RubyModule implClass, String name, MethodHandle nativeTarget, StaticScope scope) { MethodHandle framePre = getFramePre(signature, callConfig, implClass, name, scope); if (framePre != null) { MethodHandle framePost = getFramePost(signature, callConfig); // break, return, redo handling boolean heapScoped = callConfig.scoping() != Scoping.None; boolean framed = callConfig.framing() != Framing.None; // post logic for frame nativeTarget = Binder .from(nativeTarget.type()) .tryFinally(framePost) .invoke(nativeTarget); // pre logic for frame nativeTarget = foldArguments(nativeTarget, framePre); // call polling and call number increment nativeTarget = Binder .from(nativeTarget.type()) .fold(Binder .from(nativeTarget.type().changeReturnType(void.class)) .permute(0) .invokeStaticQuiet(lookup(), ThreadContext.class, "callThreadPoll")) .invoke(nativeTarget); } return nativeTarget; }
(!site.hasSeenType(selfClass.id) && site.seenTypesCount() + 1 > RubyInstanceConfig.MAX_POLY_COUNT)) { site.setTarget(target = createFail((block?FAILS_B:FAILS)[arity], site, name, entry.method)); } else { target = postProcess(site, target); if (RubyInstanceConfig.LOG_INDY_BINDINGS) LOG.info(name + "\tadded to PIC " + logMethod(entry.method)); fallback = site.getTarget(); curry = false; gwt = createGWT(test, target, fallback, entry, site, curry);
public static MethodHandle wrapWithFrameOnly(Signature signature, RubyModule implClass, String name, MethodHandle nativeTarget) { MethodHandle framePre = getFrameOnlyPre(signature, CallConfiguration.FrameFullScopeNone, implClass, name); MethodHandle framePost = getFramePost(signature, CallConfiguration.FrameFullScopeNone); // post logic for frame nativeTarget = Binder .from(nativeTarget.type()) .tryFinally(framePost) .invoke(nativeTarget); // pre logic for frame nativeTarget = foldArguments(nativeTarget, framePre); // call polling and call number increment nativeTarget = Binder .from(nativeTarget.type()) .fold(Binder .from(nativeTarget.type().changeReturnType(void.class)) .permute(0) .invokeStaticQuiet(lookup(), ThreadContext.class, "callThreadPoll")) .invoke(nativeTarget); return nativeTarget; }
private static MethodHandle getTarget(JRubyCallSite site, RubyClass cls, CacheEntry entry, int arity) { IndirectBindingException ibe; try { return tryDispatchDirect(site, cls, entry.method); } catch (IndirectBindingException _ibe) { ibe = _ibe; // proceed with indirect, if enabled } // if indirect indy-bound methods (via DynamicMethod.call) are disabled, bail out if (!RubyInstanceConfig.INVOKEDYNAMIC_INDIRECT) { if (RubyInstanceConfig.LOG_INDY_BINDINGS) LOG.info(site.name() + "\tfailed to bind to " + logMethod(entry.method) + ": " + ibe.getMessage()); return null; } // no direct native path, use DynamicMethod.call if (RubyInstanceConfig.LOG_INDY_BINDINGS) LOG.info(site.name() + "\tbound indirectly to " + logMethod(entry.method) + ": " + ibe.getMessage()); MethodHandle dynMethodTarget = getDynamicMethodTarget(site.type(), arity, entry.method); dynMethodTarget = insertArguments(dynMethodTarget, 4, site.name()); dynMethodTarget = insertArguments(dynMethodTarget, 0, entry.method); return dynMethodTarget; }
private static MethodHandle postProcessNativeHandle(MethodHandle nativeTarget, JRubyCallSite site, DynamicMethod method, boolean checkArity, boolean rewriteStackTrace) { if (nativeTarget != null) { nativeTarget = addOrRemoveBlock(site, nativeTarget); int nativeArgCount = getNativeArgCount(method, method.getNativeCall());
return getFrameOnlyPre(signature, callConfig, implClass, name);
public static MethodHandle wrapWithFraming(Signature signature, CallConfiguration callConfig, RubyModule implClass, String name, MethodHandle nativeTarget, StaticScope scope) { MethodHandle framePre = getFramePre(signature, callConfig, implClass, name, scope); MethodHandle framePost = getFramePost(signature, callConfig);
private static int getNativeArgCount(DynamicMethod method, NativeCall nativeCall) { // if non-Java, must: // * exactly match arities or both are [] boxed // * 3 or fewer arguments int nativeArgCount = (method instanceof CompiledMethod || method instanceof JittedMethod) ? getRubyArgCount(nativeCall.getNativeSignature()) : getArgCount(nativeCall.getNativeSignature(), nativeCall.isStatic()); return nativeArgCount; }
public static void checkArity(int required, int optional, boolean rest, ThreadContext context, IRubyObject caller, IRubyObject self, IRubyObject[] args, Block block) { checkArity(required, optional, rest, context, caller, self, args); }
.insert(1, arrayOf("selfClass", "name"), arrayOf(RubyModule.class, String.class), implClass, name) .insert(5, arrayOf("scope"), arrayOf(StaticScope.class), scope) .invokeVirtualQuiet(lookup(), "preMethodFrameAndScope") .handle(); .insert(1, arrayOf("selfClass", "name"), arrayOf(RubyModule.class, String.class), implClass, name) .insert(5, arrayOf("scope"), arrayOf(StaticScope.class), scope) .invokeVirtualQuiet(lookup(), "preMethodFrameAndDummyScope") .handle(); .insert(1, arrayOf("selfClass", "name"), arrayOf(RubyModule.class, String.class), implClass, name) .invokeVirtualQuiet(lookup(), "preMethodFrameOnly") .handle(); .insert(1, arrayOf("selfClass", "scope"), arrayOf(RubyModule.class, StaticScope.class), implClass, scope) .invokeVirtualQuiet(lookup(), "preMethodScopeOnly") .handle(); .insert(1, arrayOf("selfClass", "scope"), arrayOf(RubyModule.class, StaticScope.class), implClass, scope) .invokeVirtualQuiet(lookup(), "preMethodNoFrameAndDummyScope") .handle();
public static MethodHandle wrapWithFraming(Signature signature, CallConfiguration callConfig, RubyModule implClass, String name, MethodHandle nativeTarget, StaticScope scope) { MethodHandle framePre = getFramePre(signature, callConfig, implClass, name, scope); MethodHandle framePost = getFramePost(signature, callConfig);