dl/cfunc.c: fix conversion of Bignum

* ext/dl/cfunc.c (rb_dlcfunc_call): fix conversion from Bignum to
  pointer. sizeof(DLSTACK_TYPE) is larger than sizeof(long) on
  Windows x64 and higher bits over sizeof(long) of DLSTACK_TYPE was
  zero even if a pointer value was over 32 bits which causes SEGV on
  DL::TestCPtr#test_to_ptr_io. Adding a cast solves the bug.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41599 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shirosaki 2013-06-24 13:39:08 +00:00
Родитель 0e8807dba5
Коммит 8ad8407e60
2 изменённых файлов: 9 добавлений и 1 удалений

Просмотреть файл

@ -1,3 +1,11 @@
Mon Jun 24 22:04:02 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
* ext/dl/cfunc.c (rb_dlcfunc_call): fix conversion from Bignum to
pointer. sizeof(DLSTACK_TYPE) is larger than sizeof(long) on
Windows x64 and higher bits over sizeof(long) of DLSTACK_TYPE was
zero even if a pointer value was over 32 bits which causes SEGV on
DL::TestCPtr#test_to_ptr_io. Adding a cast solves the bug.
Mon Jun 24 22:04:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
* eval_error.c (warn_printf): use rb_vsprintf instead so ruby specific

Просмотреть файл

@ -372,7 +372,7 @@ rb_dlcfunc_call(VALUE self, VALUE ary)
rb_big_pack(arg, ls, sizeof(ls)/sizeof(*ls));
d = 0;
for (j = 0; j < (int)(sizeof(ls)/sizeof(*ls)); j++)
d |= ls[j] << (j * sizeof(long) * CHAR_BIT);
d |= (DLSTACK_TYPE)ls[j] << (j * sizeof(long) * CHAR_BIT);
stack[i] = d;
}
else {