ruby-changes:5844
From: ko1 <ko1@a...>
Date: Mon, 16 Jun 2008 01:51:00 +0900 (JST)
Subject: [ruby-changes:5844] Ruby:r17351 (trunk): * eval.c (rb_f_block_given_p): fix to skip class frame.
ko1 2008-06-16 01:50:37 +0900 (Mon, 16 Jun 2008) New Revision: 17351 Modified files: trunk/ChangeLog trunk/KNOWNBUGS.rb trunk/bootstraptest/test_method.rb trunk/eval.c Log: * eval.c (rb_f_block_given_p): fix to skip class frame. [ruby-core:14813] * KNOWNBUGS.rb, bootstraptest/test_method.rb: move solved test. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=17351&r2=17350&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_method.rb?r1=17351&r2=17350&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/eval.c?r1=17351&r2=17350&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/KNOWNBUGS.rb?r1=17351&r2=17350&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 17350) +++ ChangeLog (revision 17351) @@ -1,3 +1,10 @@ +Mon Jun 16 01:49:39 2008 Koichi Sasada <ko1@a...> + + * eval.c (rb_f_block_given_p): fix to skip class frame. + [ruby-core:14813] + + * KNOWNBUGS.rb, bootstraptest/test_method.rb: move solved test. + Mon Jun 16 01:48:08 2008 Koichi Sasada <ko1@a...> * vm_dump.c (vm_stack_dump_raw): disable verbose debug output. Index: bootstraptest/test_method.rb =================================================================== --- bootstraptest/test_method.rb (revision 17350) +++ bootstraptest/test_method.rb (revision 17351) @@ -1026,3 +1026,34 @@ STDERR.reopen(STDOUT) variable_or_mehtod_not_exist } + +assert_equal '[false, false, false, false, true, true]', %q{ + class C + define_method(:foo) { + block_given? + } + end + + C.new.foo {} + + class D + def foo + D.module_eval{ + define_method(:m1){ + block_given? + } + } + end + def bar + D.module_eval{ + define_method(:m2){ + block_given? + } + } + end + end + + D.new.foo + D.new.bar{} + [C.new.foo, C.new.foo{}, D.new.m1, D.new.m1{}, D.new.m2, D.new.m2{}] +}, '[ruby-core:14813]' Index: eval.c =================================================================== --- eval.c (revision 17350) +++ eval.c (revision 17351) @@ -545,7 +545,9 @@ rb_block_given_p(void) { rb_thread_t *th = GET_THREAD(); - if (GC_GUARDED_PTR_REF(th->cfp->lfp[0])) { + + if ((th->cfp->lfp[0] & 0x02) == 0 && + GC_GUARDED_PTR_REF(th->cfp->lfp[0])) { return Qtrue; } else { @@ -588,7 +590,9 @@ rb_control_frame_t *cfp = th->cfp; cfp = vm_get_ruby_level_caller_cfp(th, RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)); - if (cfp != 0 && GC_GUARDED_PTR_REF(cfp->lfp[0])) { + if (cfp != 0 && + (cfp->lfp[0] & 0x02) == 0 && + GC_GUARDED_PTR_REF(cfp->lfp[0])) { return Qtrue; } else { Index: KNOWNBUGS.rb =================================================================== --- KNOWNBUGS.rb (revision 17350) +++ KNOWNBUGS.rb (revision 17351) @@ -3,32 +3,6 @@ # So all tests will cause failure. # -assert_equal 'ok', %q{ - class C - define_method(:foo) { - if block_given? - :ng - else - :ok - end - } - end - C.new.foo {} -}, '[ruby-core:14813]' - -assert_equal 'ok', %q{ - class C - define_method(:foo) { - if block_given? - :ng - else - :ok - end - } - end - C.new.foo -}, '[ruby-core:14813]' - assert_equal %q{[:bar, :foo]}, %q{ def foo klass = Class.new do -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/