From b118ba9fb33836f7e037f24770efced7cb91a371 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 25 Feb 2022 17:53:55 +0900 Subject: [PATCH] rational.c: avoid indirect calls using `mrb_funcall()`. --- mrbgems/mruby-complex/src/complex.c | 4 ++-- mrbgems/mruby-rational/src/rational.c | 14 +++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/mrbgems/mruby-complex/src/complex.c b/mrbgems/mruby-complex/src/complex.c index 6a02b1e93..17bd40d94 100644 --- a/mrbgems/mruby-complex/src/complex.c +++ b/mrbgems/mruby-complex/src/complex.c @@ -326,7 +326,7 @@ complex_div(mrb_state *mrb, mrb_value self) mrb_int mrb_div_int(mrb_state *mrb, mrb_int x, mrb_int y); mrb_value mrb_rational_new(mrb_state *mrb, mrb_int n, mrb_int d); -mrb_value mrb_rational_div(mrb_state *mrb, mrb_value x); +mrb_value mrb_rational_div(mrb_state *mrb, mrb_value x, mrb_value y); /* 15.2.8.3.4 */ /* @@ -345,7 +345,7 @@ cpx_int_div(mrb_state *mrb, mrb_value x) switch (mrb_type(y)) { #ifdef MRB_USE_RATIONAL case MRB_TT_RATIONAL: - return mrb_rational_div(mrb, mrb_rational_new(mrb, a, 1)); + return mrb_rational_div(mrb, mrb_rational_new(mrb, a, 1), y); #endif case MRB_TT_COMPLEX: x = complex_new(mrb, (mrb_float)a, 0); diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c index e66046543..ff9b6bd91 100644 --- a/mrbgems/mruby-rational/src/rational.c +++ b/mrbgems/mruby-rational/src/rational.c @@ -601,10 +601,9 @@ rational_mul(mrb_state *mrb, mrb_value x) } mrb_value -mrb_rational_div(mrb_state *mrb, mrb_value x) +mrb_rational_div(mrb_state *mrb, mrb_value x, mrb_value y) { struct mrb_rational *p1 = rational_ptr(mrb, x); - mrb_value y = mrb_get_arg1(mrb); switch (mrb_type(y)) { case MRB_TT_INTEGER: @@ -642,7 +641,12 @@ mrb_rational_div(mrb_state *mrb, mrb_value x) } } -#define rational_div mrb_rational_div +mrb_value rational_div(mrb_state *mrb, mrb_value x) +{ + mrb_value y = mrb_get_arg1(mrb); + return mrb_rational_div(mrb, x, y); +} + mrb_int mrb_div_int(mrb_state *, mrb_int, mrb_int); #ifndef MRB_USE_COMPLEX @@ -662,7 +666,7 @@ rational_int_div(mrb_state *mrb, mrb_value x) } switch (mrb_type(y)) { case MRB_TT_RATIONAL: - return rational_div(mrb, rational_new(mrb, a, 1)); + return rational_div(mrb, rational_new(mrb, a, 1), y); default: #ifdef MRB_NO_FLOAT case MRB_TT_FLOAT: @@ -690,7 +694,7 @@ rational_int_quo(mrb_state *mrb, mrb_value x) switch (mrb_type(y)) { case MRB_TT_RATIONAL: x = rational_new(mrb, a, 1); - return mrb_funcall_id(mrb, x, MRB_OPSYM(div), 1, y); + return mrb_rational_div(mrb, x, y); default: #ifdef MRB_NO_FLOAT mrb_raise(mrb, E_TYPE_ERROR, "non integer multiplication");