summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-30 01:26:56 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-30 01:26:56 +0000
commit570d8f55b225dce01008c8fa879e85ad874ce18b (patch)
tree615954acafa78cfec78a9901c88da04e34f8f778
parentfc6be8cdeb2efa3ef9498b728f5d6c27881f29fc (diff)
* 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
-rw-r--r--ChangeLog9
-rw-r--r--time.c46
2 files changed, 49 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 00d1a3a14f..1c364af085 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Sun Aug 30 10:24:43 2009 Tanaka Akira <akr@fsij.org>
+
+ * time.c (eq): apply RTEST.
+ (ne): ditto.
+ (add): avoid method dispatch for bignums.
+ (sub): ditto.
+ (mul): ditto.
+ (mod): ditto.
+
Sun Aug 30 09:45:11 2009 Tanaka Akira <akr@fsij.org>
* bignum.c (bigmul1_single): new function specialized respect to
diff --git a/time.c b/time.c
index e67a7bc5f7..bc2e769491 100644
--- a/time.c
+++ b/time.c
@@ -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)))