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

source_changes at macosforge.org source_changes at macosforge.org
Tue Jul 7 19:52:12 PDT 2009


Revision: 2001
          http://trac.macosforge.org/projects/ruby/changeset/2001
Author:   lsansonetti at apple.com
Date:     2009-07-07 19:52:12 -0700 (Tue, 07 Jul 2009)
Log Message:
-----------
optimized dummy calls to <=>:

Modified Paths:
--------------
    MacRuby/branches/experimental/array.c
    MacRuby/branches/experimental/compar.c
    MacRuby/branches/experimental/enum.c
    MacRuby/branches/experimental/include/ruby/intern.h
    MacRuby/branches/experimental/range.c

Modified: MacRuby/branches/experimental/array.c
===================================================================
--- MacRuby/branches/experimental/array.c	2009-07-08 02:18:07 UTC (rev 2000)
+++ MacRuby/branches/experimental/array.c	2009-07-08 02:52:12 UTC (rev 2001)
@@ -25,8 +25,6 @@
 VALUE rb_cNSArray;
 VALUE rb_cNSMutableArray;
 
-static ID id_cmp;
-
 #define ARY_DEFAULT_SIZE 16
 
 void
@@ -1536,19 +1534,17 @@
 static int
 sort_2(const void *ap, const void *bp, void *dummy)
 {
-    VALUE retval;
     VALUE a = (VALUE)ap, b = (VALUE)bp;
-    int n;
 
     /* FIXME optimize!!! */
     if (TYPE(a) == T_STRING) {
-	if (TYPE(b) == T_STRING) return rb_str_cmp(a, b);
+	if (TYPE(b) == T_STRING) {
+	    return rb_str_cmp(a, b);
+	}
     }
 
-    retval = rb_funcall(a, id_cmp, 1, b);
-    n = rb_cmpint(retval, a, b);
-
-    return n;
+    VALUE retval = rb_objs_cmp(a, b);
+    return rb_cmpint(retval, a, b);
 }
 
 /*
@@ -2546,7 +2542,7 @@
 	len = RARRAY_LEN(ary2);
     }
     for (i=0; i<len; i++) {
-	VALUE v = rb_funcall(rb_ary_elt(ary1, i), id_cmp, 1, rb_ary_elt(ary2, i));
+	VALUE v = rb_objs_cmp(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i));
 	if (v != INT2FIX(0)) {
 	    return v;
 	}
@@ -3814,6 +3810,4 @@
     /* to return mutable copies */
     rb_objc_define_method(rb_cArray, "dup", rb_ary_dup_imp, 0);
     rb_objc_define_method(rb_cArray, "clone", rb_ary_clone, 0);
-
-    id_cmp = rb_intern("<=>");
 }

Modified: MacRuby/branches/experimental/compar.c
===================================================================
--- MacRuby/branches/experimental/compar.c	2009-07-08 02:18:07 UTC (rev 2000)
+++ MacRuby/branches/experimental/compar.c	2009-07-08 02:52:12 UTC (rev 2001)
@@ -34,14 +34,24 @@
 	     rb_obj_classname(x), classname);
 }
 
+VALUE
+rb_objs_cmp(VALUE x, VALUE y)
+{
+    return rb_vm_call_with_cache(cmp_cache, x, cmp, 1, &y);
+}
+
 static VALUE
 cmp_eq(VALUE *a)
 {
     //VALUE c = rb_funcall(a[0], cmp, 1, a[1]);
     VALUE c = rb_vm_call_with_cache(cmp_cache, a[0], cmp, 1, &a[1]);
 
-    if (NIL_P(c)) return Qfalse;
-    if (rb_cmpint(c, a[0], a[1]) == 0) return Qtrue;
+    if (NIL_P(c)) {
+	return Qfalse;
+    }
+    if (rb_cmpint(c, a[0], a[1]) == 0) {
+	return Qtrue;
+    }
     return Qfalse;
 }
 

Modified: MacRuby/branches/experimental/enum.c
===================================================================
--- MacRuby/branches/experimental/enum.c	2009-07-08 02:18:07 UTC (rev 2000)
+++ MacRuby/branches/experimental/enum.c	2009-07-08 02:52:12 UTC (rev 2001)
@@ -16,7 +16,7 @@
 #include "id.h"
 
 VALUE rb_mEnumerable;
-static ID id_each, id_eqq, id_cmp, id_next, id_size;
+static ID id_each, id_eqq, id_next, id_size;
 
 static VALUE
 enum_values_pack(int argc, VALUE *argv)
@@ -716,7 +716,7 @@
 	rb_raise(rb_eRuntimeError, "sort_by reentered");
     }
 #endif
-    return rb_cmpint(rb_funcall(a, id_cmp, 1, b), a, b);
+    return rb_cmpint(rb_objs_cmp(a, b), a, b);
 }
 
 /*
@@ -996,7 +996,7 @@
 	*memo = i;
     }
     else {
-	cmp = rb_funcall(i, id_cmp, 1, *memo);
+	cmp = rb_objs_cmp(i, *memo);
 	if (rb_cmpint(cmp, i, *memo) < 0) {
 	    *memo = i;
 	}
@@ -1069,7 +1069,7 @@
 	*memo = i;
     }
     else {
-	cmp = rb_funcall(i, id_cmp, 1, *memo);
+	cmp = rb_objs_cmp(i, *memo);
 	if (rb_cmpint(cmp, i, *memo) > 0) {
 	    *memo = i;
 	}
@@ -1142,11 +1142,11 @@
 	memo[1] = i;
     }
     else {
-	n = rb_cmpint(rb_funcall(i, id_cmp, 1, memo[0]), i, memo[0]);
+	n = rb_cmpint(rb_objs_cmp(i, memo[0]), i, memo[0]);
 	if (n < 0) {
 	    memo[0] = i;
 	}
-	n = rb_cmpint(rb_funcall(i, id_cmp, 1, memo[1]), i, memo[1]);
+	n = rb_cmpint(rb_objs_cmp(i, memo[1]), i, memo[1]);
 	if (n > 0) {
 	    memo[1] = i;
 	}
@@ -1232,7 +1232,7 @@
 	memo[0] = v;
 	memo[1] = i;
     }
-    else if (rb_cmpint(rb_funcall(v, id_cmp, 1, memo[0]), v, memo[0]) < 0) {
+    else if (rb_cmpint(rb_objs_cmp(v, memo[0]), v, memo[0]) < 0) {
 	memo[0] = v;
 	memo[1] = i;
     }
@@ -1275,7 +1275,7 @@
 	memo[0] = v;
 	memo[1] = i;
     }
-    else if (rb_cmpint(rb_funcall(v, id_cmp, 1, memo[0]), v, memo[0]) > 0) {
+    else if (rb_cmpint(rb_objs_cmp(v, memo[0]), v, memo[0]) > 0) {
 	memo[0] = v;
 	memo[1] = i;
     }
@@ -1321,11 +1321,11 @@
 	memo[3] = i;
     }
     else {
-	if (rb_cmpint(rb_funcall(v, id_cmp, 1, memo[0]), v, memo[0]) < 0) {
+	if (rb_cmpint(rb_objs_cmp(v, memo[0]), v, memo[0]) < 0) {
 	    memo[0] = v;
 	    memo[2] = i;
 	}
-	if (rb_cmpint(rb_funcall(v, id_cmp, 1, memo[1]), v, memo[1]) > 0) {
+	if (rb_cmpint(rb_objs_cmp(v, memo[1]), v, memo[1]) > 0) {
 	    memo[1] = v;
 	    memo[3] = i;
 	}
@@ -1862,7 +1862,6 @@
 
     id_eqq  = rb_intern("===");
     id_each = rb_intern("each");
-    id_cmp  = rb_intern("<=>");
     id_next = rb_intern("next");
     id_size = rb_intern("size");
 }

Modified: MacRuby/branches/experimental/include/ruby/intern.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/intern.h	2009-07-08 02:18:07 UTC (rev 2000)
+++ MacRuby/branches/experimental/include/ruby/intern.h	2009-07-08 02:52:12 UTC (rev 2001)
@@ -178,6 +178,7 @@
 /* compar.c */
 int rb_cmpint(VALUE, VALUE, VALUE);
 NORETURN(void rb_cmperr(VALUE, VALUE));
+VALUE rb_objs_cmp(VALUE x, VALUE y);
 /* cont.c */
 VALUE rb_fiber_new(VALUE (*)(ANYARGS), VALUE);
 VALUE rb_fiber_resume(VALUE fib, int argc, VALUE *args);

Modified: MacRuby/branches/experimental/range.c
===================================================================
--- MacRuby/branches/experimental/range.c	2009-07-08 02:18:07 UTC (rev 2000)
+++ MacRuby/branches/experimental/range.c	2009-07-08 02:52:12 UTC (rev 2001)
@@ -16,7 +16,7 @@
 #include "id.h"
 
 VALUE rb_cRange;
-static ID id_cmp, id_succ, id_beg, id_end, id_excl;
+static ID id_succ, id_beg, id_end, id_excl;
 static SEL selUpto = 0;
 static void *cacheUpto = NULL;
 
@@ -37,7 +37,7 @@
 static VALUE
 range_check(VALUE *args)
 {
-    return rb_funcall(args[0], id_cmp, 1, args[1]);
+    return rb_objs_cmp(args[0], args[1]);
 }
 
 static void
@@ -144,7 +144,7 @@
 static int
 r_lt(VALUE a, VALUE b)
 {
-    VALUE r = rb_funcall(a, id_cmp, 1, b);
+    VALUE r = rb_objs_cmp(a, b);
 
     if (NIL_P(r))
 	return Qfalse;
@@ -157,7 +157,7 @@
 r_le(VALUE a, VALUE b)
 {
     int c;
-    VALUE r = rb_funcall(a, id_cmp, 1, b);
+    VALUE r = rb_objs_cmp(a, b);
 
     if (NIL_P(r))
 	return Qfalse;
@@ -552,7 +552,7 @@
     else {
 	VALUE b = RANGE_BEG(range);
 	VALUE e = RANGE_END(range);
-	int c = rb_cmpint(rb_funcall(b, id_cmp, 1, e), b, e);
+	int c = rb_cmpint(rb_objs_cmp(b, e), b, e);
 
 	if (c > 0 || (c == 0 && EXCL(range)))
 	    return Qnil;
@@ -587,7 +587,7 @@
     }
     else {
 	VALUE b = RANGE_BEG(range);
-	int c = rb_cmpint(rb_funcall(b, id_cmp, 1, e), b, e);
+	int c = rb_cmpint(rb_objs_cmp(b, e), b, e);
 
 	if (c > 0)
 	    return Qnil;
@@ -918,7 +918,6 @@
 void
 Init_Range(void)
 {
-    id_cmp = rb_intern("<=>");
     id_succ = rb_intern("succ");
     id_beg = rb_intern("begin");
     id_end = rb_intern("end");
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090707/4c6dafe8/attachment-0001.html>


More information about the macruby-changes mailing list