[macruby-changes] [2128] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Fri Jul 31 22:21:29 PDT 2009


Revision: 2128
          http://trac.macosforge.org/projects/ruby/changeset/2128
Author:   lsansonetti at apple.com
Date:     2009-07-31 22:21:26 -0700 (Fri, 31 Jul 2009)
Log Message:
-----------
optimize numeric coerce dispatch calls

Modified Paths:
--------------
    MacRuby/branches/experimental/include/ruby/intern.h
    MacRuby/branches/experimental/numeric.c

Modified: MacRuby/branches/experimental/include/ruby/intern.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/intern.h	2009-08-01 04:01:30 UTC (rev 2127)
+++ MacRuby/branches/experimental/include/ruby/intern.h	2009-08-01 05:21:26 UTC (rev 2128)
@@ -407,7 +407,7 @@
 void rb_num_zerodiv(void);
 VALUE rb_num_coerce_bin(VALUE, VALUE, ID);
 VALUE rb_num_coerce_cmp(VALUE, VALUE, ID);
-VALUE rb_num_coerce_relop(VALUE, VALUE, ID);
+VALUE rb_num_coerce_relop(VALUE, VALUE, SEL);
 VALUE rb_float_new(double);
 VALUE rb_num2fix(VALUE);
 VALUE rb_fix2str(VALUE, int);

Modified: MacRuby/branches/experimental/numeric.c
===================================================================
--- MacRuby/branches/experimental/numeric.c	2009-08-01 04:01:30 UTC (rev 2127)
+++ MacRuby/branches/experimental/numeric.c	2009-08-01 05:21:26 UTC (rev 2128)
@@ -18,6 +18,7 @@
 #include "objc.h"
 #include <ruby/node.h>
 #include "vm.h"
+#include "id.h"
 
 #ifdef HAVE_FLOAT_H
 #include <float.h>
@@ -80,7 +81,8 @@
 }
 #endif
 
-static ID id_coerce, id_to_i, id_eq;
+static SEL sel_coerce;
+static ID id_to_i, id_eq;
 
 VALUE rb_cNumeric;
 VALUE rb_cCFNumber;
@@ -178,7 +180,7 @@
 static VALUE
 coerce_body(VALUE *x)
 {
-    return rb_funcall(x[1], id_coerce, 1, x[0]);
+    return rb_vm_call(x[1], sel_coerce, 1, &x[0], false);
 }
 
 static VALUE
@@ -231,12 +233,12 @@
 }
 
 VALUE
-rb_num_coerce_relop(VALUE x, VALUE y, ID func)
+rb_num_coerce_relop(VALUE x, VALUE y, SEL sel)
 {
     VALUE c, x0 = x, y0 = y;
 
     if (!do_coerce(&x, &y, Qfalse) ||
-	NIL_P(c = rb_funcall(x, func, 1, y))) {
+	NIL_P(c = rb_vm_call(x, sel, 1, &y, false))) {
 	rb_cmperr(x0, y0);
 	return Qnil;		/* not reached */
     }
@@ -1032,7 +1034,7 @@
 	break;
 
       default:
-	return rb_num_coerce_relop(x, y, '>');
+	return rb_num_coerce_relop(x, y, selGT);
     }
     if (isnan(a)) return Qfalse;
     return (a > b)?Qtrue:Qfalse;
@@ -1067,7 +1069,7 @@
 	break;
 
       default:
-	return rb_num_coerce_relop(x, y, rb_intern(">="));
+	return rb_num_coerce_relop(x, y, selGE);
     }
     if (isnan(a)) return Qfalse;
     return (a >= b)?Qtrue:Qfalse;
@@ -1101,7 +1103,7 @@
 	break;
 
       default:
-	return rb_num_coerce_relop(x, y, '<');
+	return rb_num_coerce_relop(x, y, selLT);
     }
     if (isnan(a)) return Qfalse;
     return (a < b)?Qtrue:Qfalse;
@@ -1136,7 +1138,7 @@
 	break;
 
       default:
-	return rb_num_coerce_relop(x, y, rb_intern("<="));
+	return rb_num_coerce_relop(x, y, selLE);
     }
     if (isnan(a)) return Qfalse;
     return (a <= b)?Qtrue:Qfalse;
@@ -2615,7 +2617,7 @@
       case T_FLOAT:
 	return (double)FIX2LONG(x) > RFLOAT_VALUE(y) ? Qtrue : Qfalse;
       default:
-	return rb_num_coerce_relop(x, y, '>');
+	return rb_num_coerce_relop(x, y, selGT);
     }
 }
 
@@ -2640,7 +2642,7 @@
       case T_FLOAT:
 	return (double)FIX2LONG(x) >= RFLOAT_VALUE(y) ? Qtrue : Qfalse;
       default:
-	return rb_num_coerce_relop(x, y, rb_intern(">="));
+	return rb_num_coerce_relop(x, y, selGE);
     }
 }
 
@@ -2665,7 +2667,7 @@
       case T_FLOAT:
 	return (double)FIX2LONG(x) < RFLOAT_VALUE(y) ? Qtrue : Qfalse;
       default:
-	return rb_num_coerce_relop(x, y, '<');
+	return rb_num_coerce_relop(x, y, selLT);
     }
 }
 
@@ -2690,7 +2692,7 @@
       case T_FLOAT:
 	return (double)FIX2LONG(x) <= RFLOAT_VALUE(y) ? Qtrue : Qfalse;
       default:
-	return rb_num_coerce_relop(x, y, rb_intern("<="));
+	return rb_num_coerce_relop(x, y, selLE);
     }
 }
 
@@ -3255,7 +3257,7 @@
 void
 Init_Numeric(void)
 {
-    id_coerce = rb_intern("coerce");
+    sel_coerce = sel_registerName("coerce:");
     id_to_i = rb_intern("to_i");
     id_eq = rb_intern("==");
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090731/746e9e87/attachment-0001.html>


More information about the macruby-changes mailing list