static FunctionInvoker getFunctionInvoker(Type returnType) { if (returnType instanceof Type.Builtin) { return getFunctionInvoker(returnType.getNativeType()); } else if (returnType instanceof CallbackInfo) { return new CallbackInvoker((CallbackInfo) returnType); } else if (returnType instanceof org.jruby.ext.ffi.Enum) { return new EnumInvoker((org.jruby.ext.ffi.Enum) returnType); } else if (returnType instanceof StructByValue) { return new StructByValueInvoker((StructByValue) returnType); } throw returnType.getRuntime().newArgumentError("Cannot get FunctionInvoker for " + returnType); }
/** * Gets a marshaller to convert from a ruby type to a native type. * * @param type The native type to convert to. * @return A new <tt>Marshaller</tt> */ static final ParameterMarshaller getMarshaller( Type type, CallingConvention convention, IRubyObject enums) { if (type instanceof Type.Builtin) { return enums != null && !enums.isNil() ? getEnumMarshaller(type, enums) : getMarshaller(type.getNativeType()); } else if (type instanceof org.jruby.ext.ffi.CallbackInfo) { return new CallbackMarshaller((org.jruby.ext.ffi.CallbackInfo) type, convention); } else if (type instanceof org.jruby.ext.ffi.Enum) { return getEnumMarshaller( type, type.callMethod(type.getRuntime().getCurrentContext(), "to_hash")); } else if (type instanceof org.jruby.ext.ffi.StructByValue) { return StructByValueMarshaller.INSTANCE; } else { return null; } }
/** * Gets a marshaller to convert from a ruby type to a native type. * * @param type The native type to convert to. * @param enums The enum map * @return A new <tt>ParameterMarshaller</tt> */ static final ParameterMarshaller getEnumMarshaller(Type type, IRubyObject enums) { switch (type.getNativeType()) { case INT8: case UINT8: case INT16: case UINT16: case INT32: case UINT32: case INT64: case UINT64: if (!(enums instanceof RubyHash)) { throw type.getRuntime() .newArgumentError( "wrong argument type " + enums.getMetaClass().getName() + " (expected Hash)"); } return new EnumMarshaller(getMarshaller(type.getNativeType()), (RubyHash) enums); default: return getMarshaller(type.getNativeType()); } }
final boolean isFastIntParam(Type paramType) { if (paramType instanceof Type.Builtin) { switch (paramType.getNativeType()) { case CHAR: case UCHAR: case SHORT: case USHORT: case INT: case UINT: case BOOL: // case FLOAT: return true; case LONG: case ULONG: return Platform.getPlatform().longSize() == 32; } } return false; }
static boolean isEnumConversionRequired(Type type, Enums enums) { if (type instanceof Type.Builtin && enums != null && !enums.isEmpty()) { switch (type.getNativeType()) { case CHAR: case UCHAR: case SHORT: case USHORT: case INT: case UINT: case LONG: case ULONG: case LONG_LONG: case ULONG_LONG: return true; default: return false; } } return false; }
final boolean isFastIntResult(Type type) { if (type instanceof Type.Builtin) { switch (type.getNativeType()) { case VOID: case CHAR: case UCHAR: case SHORT: case USHORT: case INT: case UINT: case BOOL: return true; case POINTER: case STRING: return Platform.getPlatform().addressSize() == 32; case LONG: case ULONG: return Platform.getPlatform().longSize() == 32; } } return false; }
final IntResultConverter getIntResultConverter(Type type) { return type instanceof Type.Builtin ? getIntResultConverter(type.getNativeType()) : null; }