summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--KNOWNBUGS.rb26
-rw-r--r--bootstraptest/test_method.rb31
-rw-r--r--eval.c8
4 files changed, 44 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog
index 1c362eb717..122f3758b8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Mon Jun 16 01:49:39 2008 Koichi Sasada <ko1@atdot.net>
+
+ * 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@atdot.net>
* vm_dump.c (vm_stack_dump_raw): disable verbose debug output.
diff --git a/KNOWNBUGS.rb b/KNOWNBUGS.rb
index 54ae030f66..7f6fa9274a 100644
--- a/KNOWNBUGS.rb
+++ b/KNOWNBUGS.rb
@@ -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
diff --git a/bootstraptest/test_method.rb b/bootstraptest/test_method.rb
index 8b5d584e31..28cd2fbaf6 100644
--- a/bootstraptest/test_method.rb
+++ b/bootstraptest/test_method.rb
@@ -1026,3 +1026,34 @@ assert_not_match /method_missing/, %q{
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]'
diff --git a/eval.c b/eval.c
index f6424372f7..3e9512e5f8 100644
--- a/eval.c
+++ b/eval.c
@@ -545,7 +545,9 @@ int
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_f_block_given_p(void)
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 {