mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
insns.def: super from at_exit
* insns.def (invokesuper): klass in cfp is not valid in at_exit and END blocks. [ruby-core:47680] [Bug #7064] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37030 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
80440ed07f
commit
1e56548995
4 changed files with 28 additions and 4 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Tue Sep 25 09:59:26 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* insns.def (invokesuper): klass in cfp is not valid in at_exit and
|
||||||
|
END blocks. [ruby-core:47680] [Bug #7064]
|
||||||
|
|
||||||
Tue Sep 25 08:11:11 2012 NARUSE, Yui <naruse@ruby-lang.org>
|
Tue Sep 25 08:11:11 2012 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
* iseq.c (rb_iseq_defined_string): the index of defined_strings must
|
* iseq.c (rb_iseq_defined_string): the index of defined_strings must
|
||||||
|
|
|
@ -1035,6 +1035,9 @@ invokesuper
|
||||||
flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
|
flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
|
||||||
|
|
||||||
klass = GET_CFP()->klass;
|
klass = GET_CFP()->klass;
|
||||||
|
if (NIL_P(klass)) {
|
||||||
|
vm_super_outside();
|
||||||
|
}
|
||||||
if (!NIL_P(RCLASS_REFINED_CLASS(klass))) {
|
if (!NIL_P(RCLASS_REFINED_CLASS(klass))) {
|
||||||
klass = RCLASS_REFINED_CLASS(klass);
|
klass = RCLASS_REFINED_CLASS(klass);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
require 'test/unit'
|
require 'test/unit'
|
||||||
|
require_relative 'envutil'
|
||||||
|
|
||||||
class TestSuper < Test::Unit::TestCase
|
class TestSuper < Test::Unit::TestCase
|
||||||
class Base
|
class Base
|
||||||
|
@ -347,4 +348,14 @@ class TestSuper < Test::Unit::TestCase
|
||||||
|
|
||||||
assert_equal 'hoge', foo.new.bar
|
assert_equal 'hoge', foo.new.bar
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_super_in_at_exit
|
||||||
|
bug7064 = '[ruby-core:47680]'
|
||||||
|
assert_normal_exit "at_exit {super}", bug7064
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_super_in_END
|
||||||
|
bug7064 = '[ruby-core:47680]'
|
||||||
|
assert_normal_exit "END {super}", bug7064
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1459,6 +1459,12 @@ vm_search_normal_superclass(VALUE klass)
|
||||||
return RCLASS_SUPER(klass);
|
return RCLASS_SUPER(klass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vm_super_outside(void)
|
||||||
|
{
|
||||||
|
rb_raise(rb_eNoMethodError, "super called outside of method");
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq,
|
vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq,
|
||||||
VALUE sigval,
|
VALUE sigval,
|
||||||
|
@ -1472,7 +1478,7 @@ vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iseq == 0) {
|
if (iseq == 0) {
|
||||||
rb_raise(rb_eNoMethodError, "super called outside of method");
|
vm_super_outside();
|
||||||
}
|
}
|
||||||
|
|
||||||
id = iseq->defined_method_id;
|
id = iseq->defined_method_id;
|
||||||
|
@ -1492,8 +1498,7 @@ vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq,
|
||||||
while (1) {
|
while (1) {
|
||||||
lcfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(lcfp);
|
lcfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(lcfp);
|
||||||
if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, lcfp)) {
|
if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, lcfp)) {
|
||||||
rb_raise(rb_eNoMethodError,
|
vm_super_outside();
|
||||||
"super called outside of method");
|
|
||||||
}
|
}
|
||||||
if (lcfp->ep == tep) {
|
if (lcfp->ep == tep) {
|
||||||
break;
|
break;
|
||||||
|
@ -1503,7 +1508,7 @@ vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq,
|
||||||
|
|
||||||
/* temporary measure for [Bug #2420] [Bug #3136] */
|
/* temporary measure for [Bug #2420] [Bug #3136] */
|
||||||
if (!lcfp->me) {
|
if (!lcfp->me) {
|
||||||
rb_raise(rb_eNoMethodError, "super called outside of method");
|
vm_super_outside();
|
||||||
}
|
}
|
||||||
|
|
||||||
id = lcfp->me->def->original_id;
|
id = lcfp->me->def->original_id;
|
||||||
|
|
Loading…
Add table
Reference in a new issue