* 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:
mame 2010-04-27 13:42:29 +00:00
Родитель 4af243a8af
Коммит e02f7f79c2
3 изменённых файлов: 28 добавлений и 1 удалений

Просмотреть файл

@ -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>
* eval.c (ruby_cleanup): before cleanup, check signal buffer and run

9
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 */

Просмотреть файл

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