summaryrefslogtreecommitdiffhomepage
path: root/src/numeric.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-08-03 16:11:02 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-08-03 16:11:02 +0900
commitb70fd09f474b8e1461d995af43a212cfa4b028a0 (patch)
treeba14b463e5e6b2cad0812de1ea2c7fec01283250 /src/numeric.c
parent2092bc7fe8a1cb188acf6248764173c1ccbb9040 (diff)
downloadmruby-b70fd09f474b8e1461d995af43a212cfa4b028a0.tar.gz
mruby-b70fd09f474b8e1461d995af43a212cfa4b028a0.zip
Revert "numeric.c: simplifies `int_mod` definition."
This reverts commit 3738d62a86a54524d5d7738ddbafe4700ca6a889. The change changed the behavior with floating point numbers.
Diffstat (limited to 'src/numeric.c')
-rw-r--r--src/numeric.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/numeric.c b/src/numeric.c
index b4faab254..ca39e318e 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -1113,15 +1113,27 @@ intdivmod(mrb_state *mrb, mrb_int x, mrb_int y, mrb_int *divp, mrb_int *modp)
static mrb_value
int_mod(mrb_state *mrb, mrb_value x)
{
- mrb_int a, b, mod;
+ mrb_value y = mrb_get_arg1(mrb);
+ mrb_int a, b;
- mrb_get_args(mrb, "i", &b);
a = mrb_integer(x);
- mod = a % b;
- if ((a < 0) != (b < 0) && mod != 0) {
- mod += b;
+ if (mrb_integer_p(y) && a != MRB_INT_MIN && (b=mrb_integer(y)) != MRB_INT_MIN) {
+ mrb_int mod = a % b;
+ if ((a < 0) != (b < 0) && mod != 0) {
+ mod += b;
+ }
+ return mrb_int_value(mrb, mod);
+ }
+#ifdef MRB_NO_FLOAT
+ mrb_raise(mrb, E_TYPE_ERROR, "non integer modulo");
+#else
+ else {
+ mrb_float mod;
+
+ flodivmod(mrb, (mrb_float)a, mrb_as_float(mrb, y), NULL, &mod);
+ return mrb_float_value(mrb, mod);
}
- return mrb_int_value(mrb, mod);
+#endif
}
/*