diff --git a/ChangeLog b/ChangeLog index e7c0c379a9..387c5af448 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Apr 27 22:40:54 2010 Yusuke Endoh + + * iseq.c (set_relation): do not use top_wrapper as bottom of cref, + which caused constant lookup error when "wrapped load" is used; + instead, use Object as bottom, and push top_wrapper on Object. + [ruby-core:25039] + Tue Apr 27 21:24:40 2010 Yusuke Endoh * eval.c (ruby_cleanup): before cleanup, check signal buffer and run diff --git a/iseq.c b/iseq.c index d6644f220f..c26850c045 100644 --- a/iseq.c +++ b/iseq.c @@ -177,9 +177,16 @@ set_relation(rb_iseq_t *iseq, const VALUE parent) /* set class nest stack */ if (type == ISEQ_TYPE_TOP) { /* toplevel is private */ - iseq->cref_stack = NEW_BLOCK(th->top_wrapper ? th->top_wrapper : rb_cObject); + iseq->cref_stack = NEW_BLOCK(rb_cObject); iseq->cref_stack->nd_file = 0; iseq->cref_stack->nd_visi = NOEX_PRIVATE; + if (th->top_wrapper) { + NODE *cref = NEW_BLOCK(th->top_wrapper); + cref->nd_file = 0; + cref->nd_visi = NOEX_PRIVATE; + cref->nd_next = iseq->cref_stack; + iseq->cref_stack = cref; + } } else if (type == ISEQ_TYPE_METHOD || type == ISEQ_TYPE_CLASS) { iseq->cref_stack = NEW_BLOCK(0); /* place holder */ diff --git a/test/ruby/test_require.rb b/test/ruby/test_require.rb index 458c61998f..fbe71a2db5 100644 --- a/test/ruby/test_require.rb +++ b/test/ruby/test_require.rb @@ -197,6 +197,19 @@ class TestRequire < Test::Unit::TestCase assert_raise(ArgumentError) { at_exit } end + def test_load2 # [ruby-core:25039] + t = Tempfile.new(["test_ruby_test_require", ".rb"]) + t.puts "Hello = 'hello'" + t.puts "class Foo" + t.puts " p Hello" + t.puts "end" + t.close + + assert_in_out_err([], <<-INPUT, %w("hello"), []) + load(#{ t.path.dump }, true) + INPUT + end + def test_tainted_loadpath t = Tempfile.new(["test_ruby_test_require", ".rb"]) abs_dir, file = File.split(t.path)