summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--eval.c3
-rw-r--r--ext/-test-/bug-3571/bug.c23
-rw-r--r--ext/-test-/bug-3571/extconf.rb1
-rw-r--r--test/-ext-/test_bug-3571.rb21
-rw-r--r--vm_eval.c1
-rw-r--r--vm_insnhelper.c2
7 files changed, 57 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index a9233492596..b748baea9fc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Jul 14 20:23:08 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (frame_func_id), vm_eval.c (rb_iterate),
+ vm_insnhelper.c (vm_yield_with_cfunc): as the name of a C-level
+ block, use the current method ID at the creation point.
+ [ruby-dev:41852]
+
Wed Jul 14 18:18:05 2010 NARUSE, Yui <naruse@ruby-lang.org>
* regexec.c (match_at): add end point to enclen's argument.
diff --git a/eval.c b/eval.c
index 95d1b8c8600..25969217cab 100644
--- a/eval.c
+++ b/eval.c
@@ -756,10 +756,13 @@ frame_func_id(rb_control_frame_t *cfp)
{
rb_iseq_t *iseq = cfp->iseq;
if (!iseq) {
+ if (!cfp->me) return 0;
return cfp->me->def->original_id;
}
while (iseq) {
if (RUBY_VM_IFUNC_P(iseq)) {
+ NODE *ifunc = (NODE *)iseq;
+ if (ifunc->nd_aid) return ifunc->nd_aid;
return rb_intern("<ifunc>");
}
if (iseq->defined_method_id) {
diff --git a/ext/-test-/bug-3571/bug.c b/ext/-test-/bug-3571/bug.c
new file mode 100644
index 00000000000..72d6bd10219
--- /dev/null
+++ b/ext/-test-/bug-3571/bug.c
@@ -0,0 +1,23 @@
+#include <ruby.h>
+
+static VALUE
+bug_i(VALUE i, VALUE arg)
+{
+ rb_notimplement();
+ return ID2SYM(rb_frame_this_func());
+}
+
+static VALUE
+bug_start(VALUE self, VALUE hash)
+{
+ VALUE ary = rb_ary_new3(1, Qnil);
+ rb_block_call(ary, rb_intern("map"), 0, 0, bug_i, self);
+ return ary;
+}
+
+void
+Init_bug(void)
+{
+ VALUE mBug = rb_define_module("Bug");
+ rb_define_module_function(mBug, "start", bug_start, 0);
+}
diff --git a/ext/-test-/bug-3571/extconf.rb b/ext/-test-/bug-3571/extconf.rb
new file mode 100644
index 00000000000..6390fce2191
--- /dev/null
+++ b/ext/-test-/bug-3571/extconf.rb
@@ -0,0 +1 @@
+create_makefile("-test-/bug-3571/bug")
diff --git a/test/-ext-/test_bug-3571.rb b/test/-ext-/test_bug-3571.rb
new file mode 100644
index 00000000000..cd43d0330de
--- /dev/null
+++ b/test/-ext-/test_bug-3571.rb
@@ -0,0 +1,21 @@
+require 'test/unit'
+require_relative '../ruby/envutil'
+
+class Test_BUG_3571 < Test::Unit::TestCase
+ def test_block_call_id
+ bug3571 = '[ruby-dev:41852]'
+ src = <<SRC
+begin
+ Bug.start
+rescue NotImplementedError => e
+ STDERR.puts e.message, e.backtrace[$0.size..-1]
+end
+SRC
+ out = [
+ "start() function is unimplemented on this machine",
+ "-:2:in `start'",
+ "-:2:in `<main>'",
+ ]
+ assert_in_out_err(%w"-r-test-/bug-3571/bug", src, [], out, bug3571)
+ end
+end
diff --git a/vm_eval.c b/vm_eval.c
index 8024cef2531..122837b4498 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -832,6 +832,7 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1,
rb_thread_t *th = GET_THREAD();
rb_control_frame_t *volatile cfp = th->cfp;
+ node->nd_aid = rb_frame_this_func();
TH_PUSH_TAG(th);
state = TH_EXEC_TAG();
if (state == 0) {
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index c801cd9c8aa..2e01703f7ca 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -717,7 +717,7 @@ vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block,
blockarg = Qnil;
}
- vm_push_frame(th, 0, VM_FRAME_MAGIC_IFUNC,
+ vm_push_frame(th, (rb_iseq_t *)ifunc, VM_FRAME_MAGIC_IFUNC,
self, (VALUE)block->dfp,
0, th->cfp->sp, block->lfp, 1);