mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
mruby-bigint: add new functions mrb_bint_add_d, mrb_bint_sub_d
Those functions do not normalize the return value to avoid repeated conversions between Bigints and (small) Integers.
This commit is contained in:
@@ -183,6 +183,8 @@ mrb_value mrb_bint_new_str(mrb_state *mrb, const char *x, mrb_int len, mrb_int b
|
||||
mrb_value mrb_as_bint(mrb_state *mrb, mrb_value x);
|
||||
mrb_value mrb_bint_add(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
mrb_value mrb_bint_sub(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
mrb_value mrb_bint_add_d(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
mrb_value mrb_bint_sub_d(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
mrb_value mrb_bint_mul(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
mrb_value mrb_bint_div(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
mrb_value mrb_bint_divmod(mrb_state *mrb, mrb_value x, mrb_value y);
|
||||
|
||||
@@ -1179,8 +1179,9 @@ mrb_bint_as_uint64(mrb_state *mrb, mrb_value x)
|
||||
return u;
|
||||
}
|
||||
|
||||
/* unnormalize version of mrb_bint_add */
|
||||
mrb_value
|
||||
mrb_bint_add(mrb_state *mrb, mrb_value x, mrb_value y)
|
||||
mrb_bint_add_d(mrb_state *mrb, mrb_value x, mrb_value y)
|
||||
{
|
||||
#ifndef MRB_NO_FLOAT
|
||||
if (mrb_float_p(y)) {
|
||||
@@ -1194,11 +1195,19 @@ mrb_bint_add(mrb_state *mrb, mrb_value x, mrb_value y)
|
||||
struct RBigint *b2 = RBIGINT(y);
|
||||
struct RBigint *b3 = bint_new(mrb);
|
||||
mpz_add(mrb, &b3->mp, &b->mp, &b2->mp);
|
||||
return bint_norm(mrb, b3);
|
||||
return mrb_obj_value(b3);
|
||||
}
|
||||
|
||||
mrb_value
|
||||
mrb_bint_sub(mrb_state *mrb, mrb_value x, mrb_value y)
|
||||
mrb_bint_add(mrb_state *mrb, mrb_value x, mrb_value y)
|
||||
{
|
||||
x = mrb_bint_add_d(mrb, x, y);
|
||||
return bint_norm(mrb, RBIGINT(x));
|
||||
}
|
||||
|
||||
/* unnormalize version of mrb_bint_sub */
|
||||
mrb_value
|
||||
mrb_bint_sub_d(mrb_state *mrb, mrb_value x, mrb_value y)
|
||||
{
|
||||
#ifndef MRB_NO_FLOAT
|
||||
if (mrb_float_p(y)) {
|
||||
@@ -1212,7 +1221,14 @@ mrb_bint_sub(mrb_state *mrb, mrb_value x, mrb_value y)
|
||||
struct RBigint *b2 = RBIGINT(y);
|
||||
struct RBigint *b3 = bint_new(mrb);
|
||||
mpz_sub(mrb, &b3->mp, &b->mp, &b2->mp);
|
||||
return bint_norm(mrb, b3);
|
||||
return mrb_obj_value(b3);
|
||||
}
|
||||
|
||||
mrb_value
|
||||
mrb_bint_sub(mrb_state *mrb, mrb_value x, mrb_value y)
|
||||
{
|
||||
x = mrb_bint_sub_d(mrb, x, y);
|
||||
return bint_norm(mrb, RBIGINT(x));
|
||||
}
|
||||
|
||||
mrb_value
|
||||
|
||||
Reference in New Issue
Block a user