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>
|
Wed Jul 14 18:18:05 2010 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* regexec.c (match_at): add end point to enclen's argument.
|
* 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;
|
rb_iseq_t *iseq = cfp->iseq;
|
||||||
if (!iseq) {
|
if (!iseq) {
|
||||||
|
if (!cfp->me) return 0;
|
||||||
return cfp->me->def->original_id;
|
return cfp->me->def->original_id;
|
||||||
}
|
}
|
||||||
while (iseq) {
|
while (iseq) {
|
||||||
if (RUBY_VM_IFUNC_P(iseq)) {
|
if (RUBY_VM_IFUNC_P(iseq)) {
|
||||||
|
NODE *ifunc = (NODE *)iseq;
|
||||||
|
if (ifunc->nd_aid) return ifunc->nd_aid;
|
||||||
return rb_intern("<ifunc>");
|
return rb_intern("<ifunc>");
|
||||||
}
|
}
|
||||||
if (iseq->defined_method_id) {
|
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_thread_t *th = GET_THREAD();
|
||||||
rb_control_frame_t *volatile cfp = th->cfp;
|
rb_control_frame_t *volatile cfp = th->cfp;
|
||||||
|
|
||||||
|
node->nd_aid = rb_frame_this_func();
|
||||||
TH_PUSH_TAG(th);
|
TH_PUSH_TAG(th);
|
||||||
state = TH_EXEC_TAG();
|
state = TH_EXEC_TAG();
|
||||||
if (state == 0) {
|
if (state == 0) {
|
||||||
|
|
|
@ -717,7 +717,7 @@ vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block,
|
||||||
blockarg = Qnil;
|
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,
|
self, (VALUE)block->dfp,
|
||||||
0, th->cfp->sp, block->lfp, 1);
|
0, th->cfp->sp, block->lfp, 1);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue