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

source_changes at macosforge.org source_changes at macosforge.org
Sat Apr 4 18:30:21 PDT 2009


Revision: 1365
          http://trac.macosforge.org/projects/ruby/changeset/1365
Author:   lsansonetti at apple.com
Date:     2009-04-04 18:30:20 -0700 (Sat, 04 Apr 2009)
Log Message:
-----------
implemented implicit enumeratorization

Modified Paths:
--------------
    MacRuby/branches/experimental/enumerator.c
    MacRuby/branches/experimental/include/ruby/intern.h
    MacRuby/branches/experimental/roxor.cpp
    MacRuby/branches/experimental/string.c
    MacRuby/branches/experimental/test_vm/block.rb

Modified: MacRuby/branches/experimental/enumerator.c
===================================================================
--- MacRuby/branches/experimental/enumerator.c	2009-04-05 01:12:05 UTC (rev 1364)
+++ MacRuby/branches/experimental/enumerator.c	2009-04-05 01:30:20 UTC (rev 1365)
@@ -27,7 +27,7 @@
 
 struct enumerator {
     VALUE obj;
-    ID    meth;
+    SEL   sel;
     VALUE args;
     VALUE fib;
     VALUE dst;
@@ -81,7 +81,8 @@
 	--argc;
 	meth = *argv++;
     }
-    return rb_enumeratorize(obj, meth, argc, argv);
+    // TODO
+    return rb_enumeratorize(obj, 0, argc, argv);
 }
 
 static VALUE
@@ -206,13 +207,15 @@
 }
 
 static VALUE
-enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv)
+enumerator_init(VALUE enum_obj, VALUE obj, SEL sel, int argc, VALUE *argv)
 {
     struct enumerator *ptr = enumerator_ptr(enum_obj);
 
-    ptr->obj  = obj;
-    ptr->meth = rb_to_id(meth);
-    if (argc) GC_WB(&ptr->args, rb_ary_new4(argc, argv));
+    GC_WB(&ptr->obj, obj);
+    ptr->sel = sel;
+    if (argc > 0) {
+	GC_WB(&ptr->args, rb_ary_new4(argc, argv));
+    }
     ptr->fib = 0;
     ptr->dst = Qnil;
     ptr->no_next = Qfalse;
@@ -243,7 +246,17 @@
 	meth = *argv++;
 	--argc;
     }
-    return enumerator_init(obj, recv, meth, argc, argv);
+    ID meth_id = rb_to_id(meth);
+    SEL meth_sel;
+    if (argc == 0) {
+	meth_sel = sel_registerName(rb_id2name(meth_id));
+    }
+    else {
+	char buf[100];
+	snprintf(buf, sizeof buf, "%s:", rb_id2name(meth_id));
+	meth_sel = sel_registerName(buf);
+    }
+    return enumerator_init(obj, recv, meth_sel, argc, argv);
 }
 
 /* :nodoc: */
@@ -259,18 +272,21 @@
     }
     ptr1 = enumerator_ptr(obj);
 
-    ptr1->obj  = ptr0->obj;
-    ptr1->meth = ptr0->meth;
-    ptr1->args = ptr0->args;
+    GC_WB(&ptr1->obj, ptr0->obj);
+    ptr1->sel = ptr0->sel;
+    if (ptr0->args != 0) {
+	GC_WB(&ptr1->args, ptr0->args);
+    }
     ptr1->fib  = 0;
 
     return obj;
 }
 
 VALUE
-rb_enumeratorize(VALUE obj, VALUE meth, int argc, VALUE *argv)
+rb_enumeratorize(VALUE obj, SEL sel, int argc, VALUE *argv)
 {
-    return enumerator_init(enumerator_allocate(rb_cEnumerator), obj, meth, argc, argv);
+    return enumerator_init(enumerator_allocate(rb_cEnumerator), obj, sel,
+	    argc, argv);
 }
 
 /*
@@ -290,12 +306,12 @@
 
     if (!rb_block_given_p()) return obj;
     e = enumerator_ptr(obj);
-    if (e->args) {
+    if (e->args != 0) {
 	argc = RARRAY_LEN(e->args);
 	argv = RARRAY_PTR(e->args);
     }
-    return rb_block_call(e->obj, e->meth, argc, (VALUE *)argv,
-			 enumerator_each_i, (VALUE)e);
+    return rb_objc_block_call(e->obj, e->sel, NULL, argc, (VALUE *)argv,
+	    enumerator_each_i, (VALUE)e);
 }
 
 static VALUE
@@ -325,12 +341,12 @@
 
     RETURN_ENUMERATOR(obj, 0, 0);
     e = enumerator_ptr(obj);
-    if (e->args) {
+    if (e->args != 0) {
 	argc = RARRAY_LEN(e->args);
 	argv = RARRAY_PTR(e->args);
     }
-    return rb_block_call(e->obj, e->meth, argc, (VALUE *)argv,
-			 enumerator_with_index_i, (VALUE)&memo);
+    return rb_objc_block_call(e->obj, e->sel, NULL, argc, (VALUE *)argv,
+	    enumerator_with_index_i, (VALUE)&memo);
 }
 
 #if 0

Modified: MacRuby/branches/experimental/include/ruby/intern.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/intern.h	2009-04-05 01:12:05 UTC (rev 1364)
+++ MacRuby/branches/experimental/include/ruby/intern.h	2009-04-05 01:30:20 UTC (rev 1365)
@@ -186,11 +186,10 @@
 VALUE rb_fiber_alive_p(VALUE);
 /* enum.c */
 /* enumerator.c */
-VALUE rb_enumeratorize(VALUE, VALUE, int, VALUE *);
+VALUE rb_enumeratorize(VALUE, SEL, int, VALUE *);
 #define RETURN_ENUMERATOR(obj, argc, argv) do {				\
 	if (!rb_block_given_p())					\
-	    return rb_enumeratorize(obj, ID2SYM(rb_frame_this_func()),	\
-				    argc, argv);			\
+	    return rb_enumeratorize(obj, sel, argc, argv);		\
     } while (0)
 /* error.c */
 VALUE rb_exc_new(VALUE, const char*, long);

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-04-05 01:12:05 UTC (rev 1364)
+++ MacRuby/branches/experimental/roxor.cpp	2009-04-05 01:30:20 UTC (rev 1365)
@@ -5205,8 +5205,8 @@
 }
 
 static inline VALUE
-__rb_vm_rcall(VALUE self, NODE *node, IMP pimp, const rb_vm_arity_t &arity,
-	      int argc, const VALUE *argv)
+__rb_vm_rcall(VALUE self, SEL sel, NODE *node, IMP pimp,
+	      const rb_vm_arity_t &arity, int argc, const VALUE *argv)
 {
     // TODO investigate why this function is not inlined!
     if ((arity.real != argc) || (arity.max == -1)) {
@@ -5263,25 +5263,25 @@
 
     switch (argc) {
 	case 0:
-	    return (*imp)(self, 0);
+	    return (*imp)(self, sel);
 	case 1:
-	    return (*imp)(self, 0, argv[0]);
+	    return (*imp)(self, sel, argv[0]);
 	case 2:
-	    return (*imp)(self, 0, argv[0], argv[1]);		
+	    return (*imp)(self, sel, argv[0], argv[1]);		
 	case 3:
-	    return (*imp)(self, 0, argv[0], argv[1], argv[2]);
+	    return (*imp)(self, sel, argv[0], argv[1], argv[2]);
 	case 4:
-	    return (*imp)(self, 0, argv[0], argv[1], argv[2], argv[3]);
+	    return (*imp)(self, sel, argv[0], argv[1], argv[2], argv[3]);
 	case 5:
-	    return (*imp)(self, 0, argv[0], argv[1], argv[2], argv[3], argv[4]);
+	    return (*imp)(self, sel, argv[0], argv[1], argv[2], argv[3], argv[4]);
 	case 6:
-	    return (*imp)(self, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
+	    return (*imp)(self, sel, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
 	case 7:
-	    return (*imp)(self, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
+	    return (*imp)(self, sel, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
 	case 8:
-	    return (*imp)(self, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]);
+	    return (*imp)(self, sel, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]);
 	case 9:
-	    return (*imp)(self, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]);
+	    return (*imp)(self, sel, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]);
     }	
     printf("invalid argc %d\n", argc);
     abort();
@@ -5544,7 +5544,7 @@
 	    }
 	}
 
-	return __rb_vm_rcall(self, rcache.node, rcache.imp, rcache.arity,
+	return __rb_vm_rcall(self, sel, rcache.node, rcache.imp, rcache.arity,
 			     argc, argv);
     }
     else if (cache->flag == MCACHE_OCALL) {

Modified: MacRuby/branches/experimental/string.c
===================================================================
--- MacRuby/branches/experimental/string.c	2009-04-05 01:12:05 UTC (rev 1364)
+++ MacRuby/branches/experimental/string.c	2009-04-05 01:30:20 UTC (rev 1365)
@@ -1950,7 +1950,7 @@
 }
 
 static VALUE
-str_gsub(int argc, VALUE *argv, VALUE str, int bang)
+str_gsub(SEL sel, int argc, VALUE *argv, VALUE str, int bang)
 {
     VALUE pat, val, repl, match, dest, hash = Qnil;
     struct re_registers *regs;
@@ -2086,7 +2086,7 @@
 static VALUE
 rb_str_gsub_bang(VALUE str, SEL sel, int argc, VALUE *argv)
 {
-    return str_gsub(argc, argv, str, 1);
+    return str_gsub(sel, argc, argv, str, 1);
 }
 
 
@@ -2126,7 +2126,7 @@
 static VALUE
 rb_str_gsub(VALUE str, SEL sel, int argc, VALUE *argv)
 {
-    return str_gsub(argc, argv, str, 0);
+    return str_gsub(sel, argc, argv, str, 0);
 }
 
 

Modified: MacRuby/branches/experimental/test_vm/block.rb
===================================================================
--- MacRuby/branches/experimental/test_vm/block.rb	2009-04-05 01:12:05 UTC (rev 1364)
+++ MacRuby/branches/experimental/test_vm/block.rb	2009-04-05 01:30:20 UTC (rev 1365)
@@ -178,4 +178,7 @@
     }
   end
   f(1, true)
-}
\ No newline at end of file
+}
+
+# Enumerator 
+assert "[\"f\", \"o\", \"o\"]", "p 'foo'.chars.to_a"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090404/31bfe76c/attachment-0001.html>


More information about the macruby-changes mailing list