diff options
author | Wayne Meissner <wmeissner@gmail.com> | 2009-08-05 11:03:46 +1000 |
---|---|---|
committer | Wayne Meissner <wmeissner@gmail.com> | 2009-08-05 11:03:46 +1000 |
commit | 4dc43f8979e25a40a83b304fbbf0103297388950 (patch) | |
tree | 0fe864de11d3be54a32eb0fd2321154dd02909df /ext/ffi_c/MethodHandle.c | |
parent | b0f1dee9e690816d693e86ef605bfe81d2f64af4 (diff) | |
download | ffi-4dc43f8979e25a40a83b304fbbf0103297388950.tar.gz |
Fold two of the invoker paths into one
Diffstat (limited to 'ext/ffi_c/MethodHandle.c')
-rw-r--r-- | ext/ffi_c/MethodHandle.c | 74 |
1 files changed, 26 insertions, 48 deletions
diff --git a/ext/ffi_c/MethodHandle.c b/ext/ffi_c/MethodHandle.c index 3041ace..54c587a 100644 --- a/ext/ffi_c/MethodHandle.c +++ b/ext/ffi_c/MethodHandle.c @@ -89,7 +89,6 @@ static bool freePage(void *); static bool protectPage(void *); typedef void (*methodfn)(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data); -static void attached_method_invoke0(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data); static void attached_method_fast_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data); static void attached_method_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data); @@ -124,7 +123,7 @@ static ffi_type* methodHandleParamTypes[]= { &ffi_type_ulong, }; -static MethodHandlePool defaultMethodHandlePool, zeroMethodHandlePool, fastMethodHandlePool; +static MethodHandlePool defaultMethodHandlePool, fastMethodHandlePool; static int pageSize; @@ -145,9 +144,7 @@ rbffi_MethodHandle_Alloc(FunctionInfo* fnInfo, void* function) return NULL; } - if (arity == 0 && !fnInfo->blocking && !fnInfo->hasStruct) { - pool = &zeroMethodHandlePool; - } else if (arity <= MAX_METHOD_FIXED_ARITY && !fnInfo->blocking && !fnInfo->hasStruct) { + if (arity <= MAX_METHOD_FIXED_ARITY && !fnInfo->blocking && !fnInfo->hasStruct) { pool = &fastMethodHandlePool; } else { pool = &defaultMethodHandlePool; @@ -256,64 +253,47 @@ call_blocking_function(void* data) return Qnil; } -#endif - -static inline VALUE -ffi_invoke(FunctionInfo* fnInfo, void* function, void** ffiValues) -{ - FFIStorage retval; -#ifdef USE_RAW - ffi_raw_call(&fnInfo->ffi_cif, FFI_FN(function), &retval, (ffi_raw *) ffiValues[0]); -#else - ffi_call(&fnInfo->ffi_cif, FFI_FN(function), &retval, ffiValues); #endif - if (!fnInfo->ignoreErrno) { - rbffi_save_errno(); - } - - return rbffi_NativeValue_ToRuby(fnInfo->returnType, fnInfo->rbReturnType, &retval, - fnInfo->rbEnums); -} - -/* - * attached_method_invoke0 is used for functions with no arguments - */ -static void -attached_method_invoke0(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data) -{ - MethodHandle* handle = (MethodHandle *) user_data; - FFIStorage params[1]; - void* ffiValues[] = { ¶ms[0] }; - - *((VALUE *) retval) = ffi_invoke(handle->info, handle->function, ffiValues); -} - /* * attached_method_invoke is used as the <= MAX_METHOD_FIXED_ARITY argument fixed-arity fast path */ static void -attached_method_fast_invoke(ffi_cif* cif, void* retval, METHOD_PARAMS parameters, void* user_data) +attached_method_fast_invoke(ffi_cif* cif, void* mretval, METHOD_PARAMS parameters, void* user_data) { MethodHandle* handle = (MethodHandle *) user_data; FunctionInfo* fnInfo = handle->info; void* ffiValues[MAX_METHOD_FIXED_ARITY]; - FFIStorage params[MAX_METHOD_FIXED_ARITY]; + FFIStorage params[MAX_METHOD_FIXED_ARITY], retval; + + if (fnInfo->parameterCount > 0) { #ifdef USE_RAW - int argc = parameters[0].sint; - VALUE* argv = *(VALUE **) ¶meters[1]; + int argc = parameters[0].sint; + VALUE* argv = *(VALUE **) & parameters[1]; #else - int argc = *(ffi_sarg *) parameters[0]; - VALUE* argv = *(VALUE **) parameters[1]; + int argc = *(ffi_sarg *) parameters[0]; + VALUE* argv = *(VALUE **) parameters[1]; #endif - rbffi_SetupCallParams(argc, argv, - fnInfo->parameterCount, fnInfo->nativeParameterTypes, params, ffiValues, - fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); + rbffi_SetupCallParams(argc, argv, + fnInfo->parameterCount, fnInfo->nativeParameterTypes, params, ffiValues, + fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums); + } + +#ifdef USE_RAW + ffi_raw_call(&fnInfo->ffi_cif, FFI_FN(handle->function), &retval, (ffi_raw *) ffiValues[0]); +#else + ffi_call(&fnInfo->ffi_cif, FFI_FN(handle->function), &retval, ffiValues); +#endif + + if (!fnInfo->ignoreErrno) { + rbffi_save_errno(); + } - *((VALUE *) retval) = ffi_invoke(fnInfo, handle->function, ffiValues); + *((VALUE *) mretval) = rbffi_NativeValue_ToRuby(fnInfo->returnType, fnInfo->rbReturnType, + &retval, fnInfo->rbEnums); } /* @@ -416,11 +396,9 @@ rbffi_MethodHandle_Init(VALUE module) #if defined(HAVE_NATIVETHREAD) && !defined(_WIN32) pthread_mutex_init(&defaultMethodHandlePool.mutex, NULL); - pthread_mutex_init(&zeroMethodHandlePool.mutex, NULL); pthread_mutex_init(&fastMethodHandlePool.mutex, NULL); #endif /* USE_PTHREAD_LOCAL */ defaultMethodHandlePool.fn = attached_method_invoke; - zeroMethodHandlePool.fn = attached_method_invoke0; fastMethodHandlePool.fn = attached_method_fast_invoke; } |