diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-05-02 08:25:15 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-05-02 08:25:15 +0000 |
commit | 765ff64b107753a67c354463aabb8144cf70f120 (patch) | |
tree | 31ab874a59169b88cb693746f4fe842798b6d3eb /ext/dl | |
parent | 59fc499c6364fc8d8acd52302b21570cfa7577d1 (diff) |
* ext/dl/cfunc.c (rb_dlcfunc_call): ignore signedness.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27588 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/dl')
-rw-r--r-- | ext/dl/cfunc.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/ext/dl/cfunc.c b/ext/dl/cfunc.c index e1cf9d1629..f2579da191 100644 --- a/ext/dl/cfunc.c +++ b/ext/dl/cfunc.c @@ -6,6 +6,8 @@ #include <errno.h> #include "dl.h" +VALUE rb_big2ulong_pack(VALUE x); + VALUE rb_cDLCFunc; static ID id_last_error; @@ -348,11 +350,21 @@ rb_dlcfunc_call(VALUE self, VALUE ary) } for( i = 0; i < RARRAY_LEN(ary); i++ ){ + VALUE arg; if( i >= DLSTACK_SIZE ){ rb_raise(rb_eDLError, "too many arguments (stack overflow)"); } - rb_check_safe_obj(RARRAY_PTR(ary)[i]); - stack[i] = NUM2LONG(RARRAY_PTR(ary)[i]); + arg = rb_to_int(RARRAY_PTR(ary)[i]); + rb_check_safe_obj(arg); + if (FIXNUM_P(arg)) { + stack[i] = (DLSTACK_TYPE)FIX2LONG(arg); + } + else if (RB_TYPE_P(arg, T_BIGNUM)) { + stack[i] = (DLSTACK_TYPE)rb_big2ulong_pack(arg); + } + else { + Check_Type(arg, T_FIXNUM); + } } /* calltype == CFUNC_CDECL */ |