From e439bc27dc5f6814b49309b4ad32b8d3ca54e9a4 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 12 Aug 2005 08:13:28 +0000 Subject: * 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 --- numeric.c | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'numeric.c') 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); } } -- cgit v1.2.3