From eab7025e2227edd157966c197e0fd96edea2d325 Mon Sep 17 00:00:00 2001 From: tduehr Date: Wed, 15 Jan 2014 16:17:11 -0600 Subject: make function calls with enum arguments JustWork matches behavior of JRuby FFI --- ext/ffi_c/Call.c | 81 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 17 deletions(-) diff --git a/ext/ffi_c/Call.c b/ext/ffi_c/Call.c index 679bfba..820d977 100644 --- a/ext/ffi_c/Call.c +++ b/ext/ffi_c/Call.c @@ -126,19 +126,30 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, switch (paramType->nativeType) { case NATIVE_INT8: - param->s8 = NUM2INT(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->s8 = NUM2INT(value); + } else { + param->s8 = NUM2INT(argv[argidx]); + } + ++argidx; ADJ(param, INT8); break; - case NATIVE_INT16: - param->s16 = NUM2INT(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->s16 = NUM2INT(value); + + } else { + param->s16 = NUM2INT(argv[argidx]); + } + ++argidx; ADJ(param, INT16); break; - case NATIVE_INT32: if (unlikely(type == T_SYMBOL && enums != Qnil)) { VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); @@ -152,7 +163,6 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, ADJ(param, INT32); break; - case NATIVE_BOOL: if (type != T_TRUE && type != T_FALSE) { rb_raise(rb_eTypeError, "wrong argument type (expected a boolean parameter)"); @@ -161,49 +171,86 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes, ADJ(param, INT8); break; - case NATIVE_UINT8: - param->u8 = NUM2UINT(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u8 = NUM2UINT(value); + } else { + param->u8 = NUM2UINT(argv[argidx]); + } + ADJ(param, INT8); ++argidx; break; - case NATIVE_UINT16: - param->u16 = NUM2UINT(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u16 = NUM2UINT(value); + } else { + param->u16 = NUM2UINT(argv[argidx]); + } + ADJ(param, INT16); ++argidx; break; - case NATIVE_UINT32: - param->u32 = NUM2UINT(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u32 = NUM2UINT(value); + } else { + param->u32 = NUM2UINT(argv[argidx]); + } + ADJ(param, INT32); ++argidx; break; - case NATIVE_INT64: - param->i64 = NUM2LL(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->i64 = NUM2LL(value); + } else { + param->i64 = NUM2LL(argv[argidx]); + } + ADJ(param, INT64); ++argidx; break; - case NATIVE_UINT64: - param->u64 = NUM2ULL(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + param->u64 = NUM2ULL(value); + } else { + param->u64 = NUM2ULL(argv[argidx]); + } + ADJ(param, INT64); ++argidx; break; case NATIVE_LONG: - *(ffi_sarg *) param = NUM2LONG(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + *(ffi_sarg *) param = NUM2LONG(value); + } else { + *(ffi_sarg *) param = NUM2LONG(argv[argidx]); + } + ADJ(param, LONG); ++argidx; break; case NATIVE_ULONG: - *(ffi_arg *) param = NUM2ULONG(argv[argidx]); + if (unlikely(type == T_SYMBOL && enums != Qnil)) { + VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]); + *(ffi_sarg *) param = NUM2ULONG(value); + } else { + *(ffi_arg *) param = NUM2ULONG(argv[argidx]); + } + ADJ(param, LONG); ++argidx; break; -- cgit v1.2.1