diff options
author | Sutou Kouhei <kou@clear-code.com> | 2020-12-25 06:01:12 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2021-05-18 12:48:40 +0900 |
commit | b2de5999d88d81310b3c9f0c1f14451d7eca8e6e (patch) | |
tree | 99475ef28aaf965624efc8021c586e27428b9a9f /ext/fiddle | |
parent | 212d836cd72742dcdf44187e0cebd7caed26bb41 (diff) | |
download | ruby-b2de5999d88d81310b3c9f0c1f14451d7eca8e6e.tar.gz |
[ruby/fiddle] closure: accept symbol as type
https://github.com/ruby/fiddle/commit/dc2da6633e
Diffstat (limited to 'ext/fiddle')
-rw-r--r-- | ext/fiddle/closure.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c index 40cee55e9a..fc2965591e 100644 --- a/ext/fiddle/closure.c +++ b/ext/fiddle/closure.c @@ -221,6 +221,7 @@ initialize(int rbargc, VALUE argv[], VALUE self) { VALUE ret; VALUE args; + VALUE normalized_args; VALUE abi; fiddle_closure * cl; ffi_cif * cif; @@ -239,21 +240,26 @@ initialize(int rbargc, VALUE argv[], VALUE self) cl->argv = (ffi_type **)xcalloc(argc + 1, sizeof(ffi_type *)); + normalized_args = rb_ary_new_capa(argc); for (i = 0; i < argc; i++) { - int type = NUM2INT(RARRAY_AREF(args, i)); - cl->argv[i] = INT2FFI_TYPE(type); + VALUE arg = rb_fiddle_type_ensure(RARRAY_AREF(args, i)); + rb_ary_push(normalized_args, arg); + cl->argv[i] = rb_fiddle_int_to_ffi_type(NUM2INT(arg)); } cl->argv[argc] = NULL; + ret = rb_fiddle_type_ensure(ret); rb_iv_set(self, "@ctype", ret); - rb_iv_set(self, "@args", args); + rb_iv_set(self, "@args", normalized_args); cif = &cl->cif; pcl = cl->pcl; - result = ffi_prep_cif(cif, NUM2INT(abi), argc, - INT2FFI_TYPE(NUM2INT(ret)), - cl->argv); + result = ffi_prep_cif(cif, + NUM2INT(abi), + argc, + rb_fiddle_int_to_ffi_type(NUM2INT(ret)), + cl->argv); if (FFI_OK != result) rb_raise(rb_eRuntimeError, "error prepping CIF %d", result); |