* 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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27514 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
4af243a8af
commit
e02f7f79c2
@ -1,3 +1,10 @@
|
|||||||
|
Tue Apr 27 22:40:54 2010 Yusuke Endoh <mame@tsg.ne.jp>
|
||||||
|
|
||||||
|
* 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 <mame@tsg.ne.jp>
|
Tue Apr 27 21:24:40 2010 Yusuke Endoh <mame@tsg.ne.jp>
|
||||||
|
|
||||||
* eval.c (ruby_cleanup): before cleanup, check signal buffer and run
|
* eval.c (ruby_cleanup): before cleanup, check signal buffer and run
|
||||||
|
9
iseq.c
9
iseq.c
@ -177,9 +177,16 @@ set_relation(rb_iseq_t *iseq, const VALUE parent)
|
|||||||
/* set class nest stack */
|
/* set class nest stack */
|
||||||
if (type == ISEQ_TYPE_TOP) {
|
if (type == ISEQ_TYPE_TOP) {
|
||||||
/* toplevel is private */
|
/* 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_file = 0;
|
||||||
iseq->cref_stack->nd_visi = NOEX_PRIVATE;
|
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) {
|
else if (type == ISEQ_TYPE_METHOD || type == ISEQ_TYPE_CLASS) {
|
||||||
iseq->cref_stack = NEW_BLOCK(0); /* place holder */
|
iseq->cref_stack = NEW_BLOCK(0); /* place holder */
|
||||||
|
@ -197,6 +197,19 @@ class TestRequire < Test::Unit::TestCase
|
|||||||
assert_raise(ArgumentError) { at_exit }
|
assert_raise(ArgumentError) { at_exit }
|
||||||
end
|
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
|
def test_tainted_loadpath
|
||||||
t = Tempfile.new(["test_ruby_test_require", ".rb"])
|
t = Tempfile.new(["test_ruby_test_require", ".rb"])
|
||||||
abs_dir, file = File.split(t.path)
|
abs_dir, file = File.split(t.path)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user