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:
parent
e53a46a58b
commit
0f36e8fc03
7 changed files with 57 additions and 1 deletions
|
@ -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
3
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) {
|
||||
|
|
23
ext/-test-/bug-3571/bug.c
Normal file
23
ext/-test-/bug-3571/bug.c
Normal 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);
|
||||
}
|
1
ext/-test-/bug-3571/extconf.rb
Normal file
1
ext/-test-/bug-3571/extconf.rb
Normal file
|
@ -0,0 +1 @@
|
|||
create_makefile("-test-/bug-3571/bug")
|
21
test/-ext-/test_bug-3571.rb
Normal file
21
test/-ext-/test_bug-3571.rb
Normal 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
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue