[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