summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortduehr <tduehr@gmail.com>2014-01-15 16:21:09 -0600
committertduehr <tduehr@gmail.com>2014-10-13 14:42:00 -0500
commitbfd4509b7d6e404f5ade3376471a4305bc93dae5 (patch)
tree0badac627e2d328c1140c84c97227eb33c1a0f6d
parenteab7025e2227edd157966c197e0fd96edea2d325 (diff)
downloadffi-bfd4509b7d6e404f5ade3376471a4305bc93dae5.tar.gz
make function calls with float arguments JustWork with enums
-rw-r--r--ext/ffi_c/Call.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/ext/ffi_c/Call.c b/ext/ffi_c/Call.c
index 820d977..b028811 100644
--- a/ext/ffi_c/Call.c
+++ b/ext/ffi_c/Call.c
@@ -246,7 +246,7 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
case NATIVE_ULONG:
if (unlikely(type == T_SYMBOL && enums != Qnil)) {
VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
- *(ffi_sarg *) param = NUM2ULONG(value);
+ *(ffi_arg *) param = NUM2ULONG(value);
} else {
*(ffi_arg *) param = NUM2ULONG(argv[argidx]);
}
@@ -256,19 +256,37 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
break;
case NATIVE_FLOAT32:
- param->f32 = (float) NUM2DBL(argv[argidx]);
+ if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+ VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+ param->f32 = (float) NUM2DBL(value);
+ } else {
+ param->f32 = (float) NUM2DBL(argv[argidx]);
+ }
+
ADJ(param, FLOAT32);
++argidx;
break;
case NATIVE_FLOAT64:
- param->f64 = NUM2DBL(argv[argidx]);
+ if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+ VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+ param->f64 = NUM2DBL(value);
+ } else {
+ param->f64 = NUM2DBL(argv[argidx]);
+ }
+
ADJ(param, FLOAT64);
++argidx;
break;
case NATIVE_LONGDOUBLE:
- param->ld = rbffi_num2longdouble(argv[argidx]);
+ if (unlikely(type == T_SYMBOL && enums != Qnil)) {
+ VALUE value = rb_funcall(enums, id_map_symbol, 1, argv[argidx]);
+ param->ld = rbffi_num2longdouble(value);
+ } else {
+ param->ld = rbffi_num2longdouble(argv[argidx]);
+ }
+
ADJ(param, LONGDOUBLE);
++argidx;
break;