Ruby ネイティブ C メソッドである power mod に取り組んでいます。これが私が得たものです:
#define TO_BIGNUM(x) (FIXNUM_P(x) ? rb_int2big(FIX2LONG(x)) : x)
#define CONST2BIGNUM(x) (TO_BIGNUM(INT2NUM(x)))
VALUE method_big_power_mod(VALUE self, VALUE base, VALUE exp, VALUE mod){
VALUE res = TO_BIGNUM(INT2NUM(1));
base = TO_BIGNUM(base);
exp = TO_BIGNUM(exp);
mod = TO_BIGNUM(mod);
while (rb_big_cmp(exp, CONST2BIGNUM(0))) {
if (rb_big_modulo(exp, CONST2BIGNUM(2))) {
VALUE mul = rb_big_mul(res, base);
res = rb_big_modulo(mul, mod);
}
base = rb_big_modulo(rb_big_pow(base, CONST2BIGNUM(2)), mod);
exp = rb_big_div(exp, CONST2BIGNUM(2));
}
return res;
}
毎回セグメンテーション違反になります。問題をrb_big_modulo
通話に切り分けました。gdb stacktrace は、bigdivrem
を呼び出した後にメソッドでクラッシュすると言っていrb_big_modulo
ます。のソースを調べてみましたbignum.c
が、クラッシュの原因がわかりません。私は何か間違ったことをしていますか?