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/