[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]