summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-08-12 08:13:28 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-08-12 08:13:28 +0000
commite439bc27dc5f6814b49309b4ad32b8d3ca54e9a4 (patch)
tree127adbc9559d0dd3f365f14a9ce9b5bc778f34e6 /numeric.c
parentec14c2c9b925f6add71f7f4d25e0a281f8adb252 (diff)
* parse.y (f_larglist): allow optional arguments even when
parentheses are omitted. based on Nobu's patch from http://www.rubyist.net/~nobu/t/20050805.html * parse.y (parser_yylex): update & maintain lpar_beg for detect lambda parameters. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8971 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/numeric.c b/numeric.c
index 88f4109c2f..671b4055d6 100644
--- a/numeric.c
+++ b/numeric.c
@@ -2289,7 +2289,12 @@ fix_equal(x, y)
if (FIXNUM_P(y)) {
return (FIX2LONG(x) == FIX2LONG(y))?Qtrue:Qfalse;
}
- else {
+ switch (TYPE(y)) {
+ case T_BIGNUM:
+ return rb_big_eq(y, x);
+ case T_FLOAT:
+ return (double)FIX2LONG(x) == RFLOAT(y)->value ? Qtrue : Qfalse;
+ default:
return num_equal(x, y);
}
}
@@ -2314,7 +2319,12 @@ fix_cmp(x, y)
if (a > b) return INT2FIX(1);
return INT2FIX(-1);
}
- else {
+ switch (TYPE(y)) {
+ case T_BIGNUM:
+ return rb_big_cmp(rb_int2big(FIX2LONG(x)), y);
+ case T_FLOAT:
+ return rb_dbl_cmp((double)FIX2LONG(x), RFLOAT(y)->value);
+ default:
return rb_num_coerce_cmp(x, y);
}
}
@@ -2337,7 +2347,12 @@ fix_gt(x, y)
if (a > b) return Qtrue;
return Qfalse;
}
- else {
+ switch (TYPE(y)) {
+ case T_BIGNUM:
+ return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) > 0 ? Qtrue : Qfalse;
+ case T_FLOAT:
+ return (double)FIX2LONG(x) > RFLOAT(y)->value ? Qtrue : Qfalse;
+ default:
return rb_num_coerce_relop(x, y);
}
}
@@ -2360,7 +2375,12 @@ fix_ge(x, y)
if (a >= b) return Qtrue;
return Qfalse;
}
- else {
+ switch (TYPE(y)) {
+ case T_BIGNUM:
+ return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) >= 0 ? Qtrue : Qfalse;
+ case T_FLOAT:
+ return (double)FIX2LONG(x) >= RFLOAT(y)->value ? Qtrue : Qfalse;
+ default:
return rb_num_coerce_relop(x, y);
}
}
@@ -2383,7 +2403,12 @@ fix_lt(x, y)
if (a < b) return Qtrue;
return Qfalse;
}
- else {
+ switch (TYPE(y)) {
+ case T_BIGNUM:
+ return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) < 0 ? Qtrue : Qfalse;
+ case T_FLOAT:
+ return (double)FIX2LONG(x) < RFLOAT(y)->value ? Qtrue : Qfalse;
+ default:
return rb_num_coerce_relop(x, y);
}
}
@@ -2406,7 +2431,12 @@ fix_le(x, y)
if (a <= b) return Qtrue;
return Qfalse;
}
- else {
+ switch (TYPE(y)) {
+ case T_BIGNUM:
+ return FIX2INT(rb_big_cmp(rb_int2big(FIX2LONG(x)), y)) <= 0 ? Qtrue : Qfalse;
+ case T_FLOAT:
+ return (double)FIX2LONG(x) <= RFLOAT(y)->value ? Qtrue : Qfalse;
+ default:
return rb_num_coerce_relop(x, y);
}
}