numeric.c (mrb_int_pow): make the function to take 2 operands.
MODIFY
mrbgems/mruby-numeric-ext/src/numeric_ext.c
mrbgems/mruby-numeric-ext/src/numeric_ext.c
@@ -43,7 +43,7 @@ int_remainder(mrb_state *mrb, mrb_value x)
#endif
}
-mrb_value mrb_int_pow(mrb_state *mrb, mrb_value x);
+mrb_value mrb_int_pow(mrb_state *mrb, mrb_value x, mrb_value y);
/*
* call-seq:
@@ -62,7 +62,7 @@ int_powm(mrb_state *mrb, mrb_value x)
mrb_int base, exp, mod, result = 1;
if (mrb_get_argc(mrb) == 1) {
- return mrb_int_pow(mrb, x);
+ return mrb_int_pow(mrb, x, mrb_get_arg1(mrb));
}
mrb_get_args(mrb, "io", &exp, &m);
if (exp < 0) mrb_raise(mrb, E_ARGUMENT_ERROR, "int.pow(n,m): n must be positive");

MODIFY
src/numeric.c
src/numeric.c
@@ -39,22 +39,11 @@ mrb_int_noconv(mrb_state *mrb, mrb_value y)
mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %Y into Integer", y);
}
-/*
- * call-seq:
- *
- * num ** other -> num
- *
- * Raises <code>num</code> the <code>other</code> power.
- *
- * 2.0**3 #=> 8.0
- */
mrb_value
-mrb_int_pow(mrb_state *mrb, mrb_value x)
+mrb_int_pow(mrb_state *mrb, mrb_value x, mrb_value y)
{
#ifdef MRB_USE_BIGINT
if (mrb_bigint_p(x)) {
- mrb_value y = mrb_get_arg1(mrb);
-
#ifndef MRB_NO_FLOAT
if (mrb_float_p(y)) {
return mrb_float_value(mrb, pow(mrb_bint_as_float(mrb, x), mrb_float(y)));
@@ -68,8 +57,6 @@ mrb_int_pow(mrb_state *mrb, mrb_value x)
mrb_int exp;
#ifndef MRB_NO_FLOAT
- mrb_value y = mrb_get_arg1(mrb);
-
if (mrb_float_p(y)) {
return mrb_float_value(mrb, pow((double)base, mrb_float(y)));
}
@@ -110,7 +97,21 @@ mrb_int_pow(mrb_state *mrb, mrb_value x)
}
return mrb_int_value(mrb, result);
}
-#define int_pow mrb_int_pow
+
+/*
+ * call-seq:
+ *
+ * num ** other -> num
+ *
+ * Raises <code>num</code> the <code>other</code> power.
+ *
+ * 2.0**3 #=> 8.0
+ */
+static mrb_value
+int_pow(mrb_state *mrb, mrb_value x)
+{
+ return mrb_int_pow(mrb, x, mrb_get_arg1(mrb));
+}
mrb_int
mrb_div_int(mrb_int x, mrb_int y)

numeric.c (mrb_int_pow): make the function to take 2 operands.