[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