diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | test/ruby/test_module.rb | 19 | ||||
-rw-r--r-- | vm_insnhelper.c | 7 |
3 files changed, 30 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Thu Mar 31 18:06:12 2011 Shugo Maeda <shugo@ruby-lang.org> + + * vm_insnhelper.c (vm_get_ev_const): should ignore crefs with + the NODE_FL_CREF_PUSHED_BY_EVAL flag. + Thu Mar 31 16:49:56 2011 Shugo Maeda <shugo@ruby-lang.org> * vm_insnhelper.c (vm_get_ev_const): search root cref properly. diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb index 6d28616d86..10b2708804 100644 --- a/test/ruby/test_module.rb +++ b/test/ruby/test_module.rb @@ -1049,4 +1049,23 @@ class TestModule < Test::Unit::TestCase INPUT assert_in_out_err([], src, ["uninitialized constant A"], []) end + + def test_constant_lookup_in_module_in_class_eval + src = <<-INPUT + class A + B = 42 + end + + A.class_eval do + module C + begin + B + rescue NameError + puts "NameError" + end + end + end + INPUT + assert_in_out_err([], src, ["NameError"], []) + end end diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 508ad8584e..3398b958ab 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1164,7 +1164,12 @@ vm_get_ev_const(rb_thread_t *th, const rb_iseq_t *iseq, } cref = root_cref; while (cref && cref->nd_next) { - klass = cref->nd_clss; + if (cref->flags & NODE_FL_CREF_PUSHED_BY_EVAL) { + klass = Qnil; + } + else { + klass = cref->nd_clss; + } cref = cref->nd_next; if (!NIL_P(klass)) { |