* eval.c (rb_f_block_given_p): fix to skip class frame.

[ruby-core:14813]
* KNOWNBUGS.rb, bootstraptest/test_method.rb: move solved test.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17351 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2008-06-15 16:50:37 +00:00
Родитель 1c4f7a4c64
Коммит faa93e847d
4 изменённых файлов: 44 добавлений и 28 удалений

Просмотреть файл

@ -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.

Просмотреть файл

@ -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

Просмотреть файл

@ -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]'

8
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 {