JITSignature(Signature signature) { this.resultType = signature.getResultType().getNativeType(); this.parameterTypes = new NativeType[signature.getParameterCount()]; for (int i = 0; i < parameterTypes.length; i++) { parameterTypes[i] = signature.getParameterType(i).getNativeType(); } this.convention = signature.getCallingConvention(); this.ignoreError = signature.isIgnoreError(); // FIXME: calculate these properly this.hasResultConverter = false; this.hasParameterConverter = new boolean[parameterTypes.length]; Arrays.fill(hasParameterConverter, false); }
@SuppressWarnings("deprecation") private static NativeDataConverter getParameterConverter(Signature signature, int i) { return signature.getParameterCount() > i ? DataConverters.getParameterConverter(signature.getParameterType(i), signature.getEnums()) : null; }
public NativeInvoker(RubyModule implementationClass, com.kenai.jffi.Function function, Signature signature) { super(implementationClass, Visibility.PUBLIC, CallConfiguration.FrameNoneScopeNone); this.arity = Arity.fixed(signature.getParameterCount()); this.function = function; this.signature = signature; int cbIndex = -1; NativeCallbackFactory cbFactory = null; for (int i = 0; i < signature.getParameterCount(); ++i) { if (signature.getParameterType(i) instanceof CallbackInfo) { cbFactory = CallbackManager.getInstance().getCallbackFactory(implementationClass.getRuntime(), (CallbackInfo) signature.getParameterType(i)); cbIndex = i; break; } } this.cbIndex = cbIndex; this.cbFactory = cbFactory; }
MethodHandle resultFilter = getResultFilter(method.getImplementationClass().getRuntime(), signature.getResultType().getNativeType(), nativeIntClass); if (resultFilter == null) { return null; MethodHandle targetHandle = Binder.from(IRubyObject.class, CodegenUtils.params(IRubyObject.class, signature.getParameterCount())) .filter(0, parameterFilters) .filterReturn(resultFilter) .invoke(nativeInvoker); if (signature.getParameterCount() > 3) { targetHandle = targetHandle.asSpreader(IRubyObject[].class, signature.getParameterCount());
public DefaultMethod(RubyModule implementationClass, Function function, Signature signature, NativeInvoker defaultInvoker) { super(implementationClass, Visibility.PUBLIC, CallConfiguration.FrameNoneScopeNone); this.arity = Arity.fixed(signature.getParameterCount()); this.function = function; this.defaultInvoker = defaultInvoker; this.signature = signature; }
DynamicMethod createMethod(RubyModule module, Function function, Type returnType, Type[] parameterTypes, CallingConvention convention, IRubyObject enums, boolean ignoreError) { FunctionInvoker functionInvoker = getFunctionInvoker(returnType); ParameterMarshaller[] marshallers = new ParameterMarshaller[parameterTypes.length]; for (int i = 0; i < parameterTypes.length; ++i) { marshallers[i] = getMarshaller(parameterTypes[i], convention, enums); if (marshallers[i] == null) { throw module.getRuntime().newTypeError("Could not create marshaller for " + parameterTypes[i]); } } Signature signature = new Signature(returnType, parameterTypes, convention, ignoreError, enums instanceof RubyHash ? (RubyHash) enums : null); BufferNativeInvoker fallbackInvoker = new BufferNativeInvoker(module, function, signature, functionInvoker, marshallers); return parameterTypes.length <= 6 ? new DefaultMethod(module, function, signature, fallbackInvoker) : fallbackInvoker; }
@SuppressWarnings("deprecation") private void setParameterConverterWithTypeAndSignature(Signature signature, boolean[] hasParameterConverter, int i, Type parameterType) { hasParameterConverter[i] = !(parameterType instanceof Type.Builtin) || DataConverters.isEnumConversionRequired(parameterType, signature.getEnums()); }
public NativeInvoker(RubyModule implementationClass, com.kenai.jffi.Function function, Signature signature) { super(implementationClass, Visibility.PUBLIC, CallConfiguration.FrameNoneScopeNone); this.arity = Arity.fixed(signature.getParameterCount()); this.function = function; this.signature = signature; int cbIndex = -1; NativeCallbackFactory cbFactory = null; for (int i = 0; i < signature.getParameterCount(); ++i) { if (signature.getParameterType(i) instanceof CallbackInfo) { cbFactory = CallbackManager.getInstance().getCallbackFactory(implementationClass.getRuntime(), (CallbackInfo) signature.getParameterType(i)); cbIndex = i; break; } } this.cbIndex = cbIndex; this.cbFactory = cbFactory; }
MethodHandle resultFilter = getResultFilter(method.getImplementationClass().getRuntime(), signature.getResultType().getNativeType(), nativeIntClass); if (resultFilter == null) { return null; MethodHandle targetHandle = Binder.from(IRubyObject.class, CodegenUtils.params(IRubyObject.class, signature.getParameterCount())) .filter(0, parameterFilters) .filterReturn(resultFilter) .invoke(nativeInvoker); if (signature.getParameterCount() > 3) { targetHandle = targetHandle.asSpreader(IRubyObject[].class, signature.getParameterCount());
public DefaultMethod(RubyModule implementationClass, Function function, Signature signature, NativeInvoker defaultInvoker) { super(implementationClass, Visibility.PUBLIC, CallConfiguration.FrameNoneScopeNone); this.arity = Arity.fixed(signature.getParameterCount()); this.function = function; this.defaultInvoker = defaultInvoker; this.signature = signature; }
DynamicMethod createMethod(RubyModule module, Function function, Type returnType, Type[] parameterTypes, CallingConvention convention, IRubyObject enums, boolean ignoreError) { FunctionInvoker functionInvoker = getFunctionInvoker(returnType); ParameterMarshaller[] marshallers = new ParameterMarshaller[parameterTypes.length]; for (int i = 0; i < parameterTypes.length; ++i) { marshallers[i] = getMarshaller(parameterTypes[i], convention, enums); if (marshallers[i] == null) { throw module.getRuntime().newTypeError("Could not create marshaller for " + parameterTypes[i]); } } Signature signature = new Signature(returnType, parameterTypes, convention, ignoreError, enums instanceof RubyHash ? (RubyHash) enums : null); BufferNativeInvoker fallbackInvoker = new BufferNativeInvoker(module, function, signature, functionInvoker, marshallers); return parameterTypes.length <= 6 ? new DefaultMethod(module, function, signature, fallbackInvoker) : fallbackInvoker; }
@SuppressWarnings("deprecation") private void setParameterConverterWithTypeAndSignature(Signature signature, boolean[] hasParameterConverter, int i, Type parameterType) { hasParameterConverter[i] = !(parameterType instanceof Type.Builtin) || DataConverters.isEnumConversionRequired(parameterType, signature.getEnums()); }
JITSignature(Signature signature) { this.resultType = signature.getResultType().getNativeType(); this.parameterTypes = new NativeType[signature.getParameterCount()]; for (int i = 0; i < parameterTypes.length; i++) { parameterTypes[i] = signature.getParameterType(i).getNativeType(); } this.convention = signature.getCallingConvention(); this.ignoreError = signature.isIgnoreError(); // FIXME: calculate these properly this.hasResultConverter = false; this.hasParameterConverter = new boolean[parameterTypes.length]; Arrays.fill(hasParameterConverter, false); }
public NativeInvoker(RubyModule implementationClass, com.kenai.jffi.Function function, Signature signature) { super(implementationClass, Visibility.PUBLIC, "ffi"+function.getFunctionAddress()); this.arity = Arity.fixed(signature.getParameterCount()); this.function = function; this.signature = signature; int cbIndex = -1; NativeCallbackFactory cbFactory = null; for (int i = 0; i < signature.getParameterCount(); ++i) { if (signature.getParameterType(i) instanceof CallbackInfo) { cbFactory = CallbackManager.getInstance().getCallbackFactory(implementationClass.getRuntime(), (CallbackInfo) signature.getParameterType(i)); cbIndex = i; break; } } this.cbIndex = cbIndex; this.cbFactory = cbFactory; }
@SuppressWarnings("deprecation") private static NativeDataConverter getParameterConverter(Signature signature, int i) { return signature.getParameterCount() > i ? DataConverters.getParameterConverter(signature.getParameterType(i), signature.getEnums()) : null; }
public JITNativeInvoker(RubyModule implementationClass, com.kenai.jffi.Function function, Signature signature) { super(implementationClass, function, signature); this.arity = signature.getParameterCount(); this.function = function; this.callContext = function.getCallContext(); this.functionAddress = function.getFunctionAddress(); this.signature = signature; // Get any result and parameter converters needed resultConverter = DataConverters.getResultConverter(signature.getResultType()); parameterConverter0 = getParameterConverter(signature, 0); parameterConverter1 = getParameterConverter(signature, 1); parameterConverter2 = getParameterConverter(signature, 2); parameterConverter3 = getParameterConverter(signature, 3); parameterConverter4 = getParameterConverter(signature, 4); parameterConverter5 = getParameterConverter(signature, 5); parameterInfo0 = getParameterInfo(signature, 0); parameterInfo1 = getParameterInfo(signature, 1); parameterInfo2 = getParameterInfo(signature, 2); parameterInfo3 = getParameterInfo(signature, 3); parameterInfo4 = getParameterInfo(signature, 4); parameterInfo5 = getParameterInfo(signature, 5); parameterCallSite0 = getParameterCallSite(signature, 0); parameterCallSite1 = getParameterCallSite(signature, 1); parameterCallSite2 = getParameterCallSite(signature, 2); parameterCallSite3 = getParameterCallSite(signature, 3); parameterCallSite4 = getParameterCallSite(signature, 4); parameterCallSite5 = getParameterCallSite(signature, 5); parameterCallSite6 = getParameterCallSite(signature, 6); }
public DefaultMethod(RubyModule implementationClass, Function function, Signature signature, NativeInvoker defaultInvoker) { super(implementationClass, Visibility.PUBLIC, defaultInvoker.getName()); this.arity = Arity.fixed(signature.getParameterCount()); this.function = function; this.defaultInvoker = defaultInvoker; this.signature = signature; }
DynamicMethod createMethod(RubyModule module, Function function, Type returnType, Type[] parameterTypes, CallingConvention convention, IRubyObject enums, boolean ignoreError) { FunctionInvoker functionInvoker = getFunctionInvoker(returnType); ParameterMarshaller[] marshallers = new ParameterMarshaller[parameterTypes.length]; for (int i = 0; i < parameterTypes.length; ++i) { marshallers[i] = getMarshaller(parameterTypes[i], convention, enums); if (marshallers[i] == null) { throw module.getRuntime().newTypeError("Could not create marshaller for " + parameterTypes[i]); } } Signature signature = new Signature(returnType, parameterTypes, convention, ignoreError, enums instanceof RubyHash ? (RubyHash) enums : null); BufferNativeInvoker fallbackInvoker = new BufferNativeInvoker(module, function, signature, functionInvoker, marshallers); return parameterTypes.length <= 6 ? new DefaultMethod(module, function, signature, fallbackInvoker) : fallbackInvoker; }
JITSignature(Signature signature) { this.resultType = signature.getResultType().getNativeType(); this.parameterTypes = new NativeType[signature.getParameterCount()]; for (int i = 0; i < parameterTypes.length; i++) { parameterTypes[i] = signature.getParameterType(i).getNativeType(); } this.convention = signature.getCallingConvention(); this.ignoreError = signature.isIgnoreError(); // FIXME: calculate these properly this.hasResultConverter = false; this.hasParameterConverter = new boolean[parameterTypes.length]; Arrays.fill(hasParameterConverter, false); }
public NativeInvoker(RubyModule implementationClass, com.kenai.jffi.Function function, Signature signature) { super(implementationClass, Visibility.PUBLIC, "ffi"+function.getFunctionAddress()); this.arity = Arity.fixed(signature.getParameterCount()); this.function = function; this.signature = signature; int cbIndex = -1; NativeCallbackFactory cbFactory = null; for (int i = 0; i < signature.getParameterCount(); ++i) { if (signature.getParameterType(i) instanceof CallbackInfo) { cbFactory = CallbackManager.getInstance().getCallbackFactory(implementationClass.getRuntime(), (CallbackInfo) signature.getParameterType(i)); cbIndex = i; break; } } this.cbIndex = cbIndex; this.cbFactory = cbFactory; }