diff options
author | tduehr <tduehr@gmail.com> | 2014-01-15 16:17:11 -0600 |
---|---|---|
committer | tduehr <tduehr@gmail.com> | 2014-10-13 14:42:00 -0500 |
commit | eab7025e2227edd157966c197e0fd96edea2d325 (patch) | |
tree | 165443d9d17f37ed168e2a7bde4623455a53bdf0 | |
parent | e2dd3a1b052925be2a3ac48f7bf8af0649583f8e (diff) | |
download | ffi-eab7025e2227edd157966c197e0fd96edea2d325.tar.gz |
make function calls with enum arguments JustWork
matches behavior of JRuby FFI
-rw-r--r-- | ext/ffi_c/Call.c | 81 |
1 files 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; |