summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortduehr <tduehr@gmail.com>2014-01-15 16:17:11 -0600
committertduehr <tduehr@gmail.com>2014-10-13 14:42:00 -0500
commiteab7025e2227edd157966c197e0fd96edea2d325 (patch)
tree165443d9d17f37ed168e2a7bde4623455a53bdf0
parente2dd3a1b052925be2a3ac48f7bf8af0649583f8e (diff)
downloadffi-eab7025e2227edd157966c197e0fd96edea2d325.tar.gz
make function calls with enum arguments JustWork
matches behavior of JRuby FFI
-rw-r--r--ext/ffi_c/Call.c81
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;