diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-30 01:26:56 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-08-30 01:26:56 +0000 |
commit | 570d8f55b225dce01008c8fa879e85ad874ce18b (patch) | |
tree | 615954acafa78cfec78a9901c88da04e34f8f778 /time.c | |
parent | fc6be8cdeb2efa3ef9498b728f5d6c27881f29fc (diff) | |
download | ruby-570d8f55b225dce01008c8fa879e85ad874ce18b.tar.gz |
* time.c (eq): apply RTEST.
(ne): ditto.
(add): avoid method dispatch for bignums.
(sub): ditto.
(mul): ditto.
(mod): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24709 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'time.c')
-rw-r--r-- | time.c | 46 |
1 files changed, 40 insertions, 6 deletions
@@ -106,17 +106,51 @@ rb_localtime(const time_t *tm, struct tm *result) static ID id_divmod, id_mul, id_submicro, id_subnano; static ID id_eq, id_ne, id_quo, id_div, id_cmp, id_lshift; -#define eq(x,y) (rb_funcall((x), id_eq, 1, (y))) -#define ne(x,y) (rb_funcall((x), id_ne, 1, (y))) +#define eq(x,y) (RTEST(rb_funcall((x), id_eq, 1, (y)))) +#define ne(x,y) (RTEST(rb_funcall((x), id_ne, 1, (y)))) #define lt(x,y) (RTEST(rb_funcall((x), '<', 1, (y)))) #define gt(x,y) (RTEST(rb_funcall((x), '>', 1, (y)))) #define le(x,y) (!gt(x,y)) #define ge(x,y) (!lt(x,y)) -#define add(x,y) (rb_funcall((x), '+', 1, (y))) -#define sub(x,y) (rb_funcall((x), '-', 1, (y))) -#define mul(x,y) (rb_funcall((x), '*', 1, (y))) + +static VALUE +add(VALUE x, VALUE y) +{ + switch (TYPE(x)) { + case T_BIGNUM: return rb_big_plus(x, y); + default: return rb_funcall(x, '+', 1, y); + } +} + +static VALUE +sub(VALUE x, VALUE y) +{ + switch (TYPE(x)) { + case T_BIGNUM: return rb_big_minus(x, y); + default: return rb_funcall(x, '-', 1, y); + } +} + +static VALUE +mul(VALUE x, VALUE y) +{ + switch (TYPE(x)) { + case T_BIGNUM: return rb_big_mul(x, y); + default: return rb_funcall(x, '*', 1, y); + } +} + #define div(x,y) (rb_funcall((x), id_div, 1, (y))) -#define mod(x,y) (rb_funcall((x), '%', 1, (y))) + +static VALUE +mod(VALUE x, VALUE y) +{ + switch (TYPE(x)) { + case T_BIGNUM: return rb_big_modulo(x, y); + default: return rb_funcall(x, '%', 1, y); + } +} + #define neg(x) (sub(INT2FIX(0), (x))) #define cmp(x,y) (rb_funcall((x), id_cmp, 1, (y))) #define lshift(x,y) (rb_funcall((x), id_lshift, 1, (y))) |