From 6085ffb968b1601830d053e933b234137fe2d5ef Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 4 Nov 2024 22:22:03 +0900 Subject: [PATCH] mruby-bigint (mrb_bint_add_n): avoid allocating mpz_z --- mrbgems/mruby-bigint/core/bigint.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index cc7a094a1..be8956c24 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -1483,8 +1483,22 @@ mrb_bint_add_n(mrb_state *mrb, mrb_value x, mrb_value y) { mpz_t a, b, z; - y = mrb_as_bint(mrb, y); bint_as_mpz(RBIGINT(x), &a); + if (mrb_integer_p(y)) { + mrb_int i = mrb_integer(y); + if (LOW(i) == i) { + mpz_init_set(mrb, &z, &a); + if ((i > 0) ^ (z.sn > 0)) { + mpz_sub_int(mrb, &z, i); + } + else { + mpz_add_int(mrb, &z, i); + } + struct RBigint *v = bint_new(mrb, &z); + return mrb_obj_value(v); + } + } + y = mrb_as_bint(mrb, y); bint_as_mpz(RBIGINT(y), &b); mpz_init(mrb, &z); mpz_add(mrb, &z, &a, &b);