From ab95e042caea261cbdde4d5892be3c28d1cc2ada Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 29 Jul 2024 15:48:42 +0900 Subject: [PATCH] mruby-bigint (mrb_bint_xor): add fast path with fixnums --- mrbgems/mruby-bigint/core/bigint.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index b6064fd0f..d3589dd25 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -1615,11 +1615,20 @@ mrb_bint_neg(mrb_state *mrb, mrb_value x) mrb_value mrb_bint_xor(mrb_state *mrb, mrb_value x, mrb_value y) { - struct RBigint *b3 = bint_new(mrb); struct RBigint *b1 = RBIGINT(x); + if (mrb_integer_p(y)) { + mrb_int z = mrb_integer(y); + if (z == 0) return x; + // if (z == -1) return ; + if (0 < z && (mp_dbl_limb)z < DIG_BASE) { + z ^= b1->mp.p[0]; + return mrb_int_value(mrb, z); + } + } y = mrb_as_bint(mrb, y); struct RBigint *b2 = RBIGINT(y); + struct RBigint *b3 = bint_new(mrb); mpz_xor(mrb, &b3->mp, &b1->mp, &b2->mp); return bint_norm(mrb, b3); }