1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28642 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2010-07-14 11:23:10 +00:00
parent e53a46a58b
commit 0f36e8fc03
7 changed files with 57 additions and 1 deletions

View file

@ -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.

3
eval.c
View file

@ -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) {

23
ext/-test-/bug-3571/bug.c Normal file
View file

@ -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);
}

View file

@ -0,0 +1 @@
create_makefile("-test-/bug-3571/bug")

View file

@ -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

View file

@ -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) {

View file

@ -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);