summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-20 12:31:26 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-20 12:31:26 +0000
commit69c8fd073faf694a3443d14bca0b3a7eebd2dc26 (patch)
tree833953f9dc255870f6cfa9d83cfa191459a70daf
parentdccba5cced11535ea6bc249d07d96b330fdf6481 (diff)
downloadruby-69c8fd073faf694a3443d14bca0b3a7eebd2dc26.tar.gz
ruby-69c8fd073faf694a3443d14bca0b3a7eebd2dc26.tar.xz
ruby-69c8fd073faf694a3443d14bca0b3a7eebd2dc26.zip
* vm_eval.c (rb_iterate): pass current block when the argument bl_proc
is NULL. This behavior can be used to make enumerator faster [ruby-dev:39874] * enumerator.c (enumerator_each): pass current block directly instead of trampoline block (enumerator_each_i). * io.c (argf_each_line, argf_each_byte, argf_each_char): ditto. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@26128 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog11
-rw-r--r--enumerator.c8
-rw-r--r--io.c6
-rw-r--r--vm_eval.c18
4 files changed, 26 insertions, 17 deletions
diff --git a/ChangeLog b/ChangeLog
index efb5c4f22..d10ab9bec 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Sun Dec 20 21:26:05 2009 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * vm_eval.c (rb_iterate): pass current block when the argument bl_proc
+ is NULL. This behavior can be used to make enumerator faster
+ [ruby-dev:39874]
+
+ * enumerator.c (enumerator_each): pass current block directly instead
+ of trampoline block (enumerator_each_i).
+
+ * io.c (argf_each_line, argf_each_byte, argf_each_char): ditto.
+
Sat Dec 19 14:59:30 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
* gem_prelude.rb (Kernel#gem): should make gem private. a patch
diff --git a/enumerator.c b/enumerator.c
index 7c50f3dda..34d16c057 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -330,12 +330,6 @@ enumerator_allocate(VALUE klass)
}
static VALUE
-enumerator_each_i(VALUE v, VALUE enum_obj, int argc, VALUE *argv)
-{
- return rb_yield_values2(argc, argv);
-}
-
-static VALUE
enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv)
{
struct enumerator *ptr;
@@ -473,7 +467,7 @@ static VALUE
enumerator_each(VALUE obj)
{
if (!rb_block_given_p()) return obj;
- return enumerator_block_call(obj, enumerator_each_i, obj);
+ return enumerator_block_call(obj, 0, obj);
}
static VALUE
diff --git a/io.c b/io.c
index 643455eca..3b8bd2566 100644
--- a/io.c
+++ b/io.c
@@ -9148,7 +9148,7 @@ argf_each_line(int argc, VALUE *argv, VALUE argf)
RETURN_ENUMERATOR(argf, argc, argv);
for (;;) {
if (!next_argv()) return argf;
- rb_block_call(ARGF.current_file, rb_intern("each_line"), argc, argv, rb_yield, 0);
+ rb_block_call(ARGF.current_file, rb_intern("each_line"), argc, argv, 0, 0);
ARGF.next_p = 1;
}
}
@@ -9182,7 +9182,7 @@ argf_each_byte(VALUE argf)
RETURN_ENUMERATOR(argf, 0, 0);
for (;;) {
if (!next_argv()) return argf;
- rb_block_call(ARGF.current_file, rb_intern("each_byte"), 0, 0, rb_yield, 0);
+ rb_block_call(ARGF.current_file, rb_intern("each_byte"), 0, 0, 0, 0);
ARGF.next_p = 1;
}
}
@@ -9212,7 +9212,7 @@ argf_each_char(VALUE argf)
RETURN_ENUMERATOR(argf, 0, 0);
for (;;) {
if (!next_argv()) return argf;
- rb_block_call(ARGF.current_file, rb_intern("each_char"), 0, 0, rb_yield, 0);
+ rb_block_call(ARGF.current_file, rb_intern("each_char"), 0, 0, 0, 0);
ARGF.next_p = 1;
}
}
diff --git a/vm_eval.c b/vm_eval.c
index 4721de7c7..f64aa4afe 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -820,20 +820,24 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1,
{
int state;
volatile VALUE retval = Qnil;
- NODE *node = NEW_IFUNC(bl_proc, data2);
rb_thread_t *th = GET_THREAD();
rb_control_frame_t *volatile cfp = th->cfp;
+ rb_block_t *blockptr;
+ if (bl_proc) {
+ blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp);
+ blockptr->iseq = (void *)NEW_IFUNC(bl_proc, data2);
+ blockptr->proc = 0;
+ }
+ else {
+ blockptr = GC_GUARDED_PTR_REF(th->cfp->lfp[0]);
+ }
+ *(rb_block_t *volatile *)&blockptr = blockptr;
TH_PUSH_TAG(th);
state = TH_EXEC_TAG();
if (state == 0) {
iter_retry:
- {
- rb_block_t *blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp);
- blockptr->iseq = (void *)node;
- blockptr->proc = 0;
- th->passed_block = blockptr;
- }
+ th->passed_block = *(rb_block_t *volatile *)&blockptr;
retval = (*it_proc) (data1);
}
else {