1
0
Fork 0
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:
nobu 2012-09-25 00:59:29 +00:00
parent 80440ed07f
commit 1e56548995
4 changed files with 28 additions and 4 deletions

View file

@ -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>
* iseq.c (rb_iseq_defined_string): the index of defined_strings must

View file

@ -1035,6 +1035,9 @@ invokesuper
flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
klass = GET_CFP()->klass;
if (NIL_P(klass)) {
vm_super_outside();
}
if (!NIL_P(RCLASS_REFINED_CLASS(klass))) {
klass = RCLASS_REFINED_CLASS(klass);
}

View file

@ -1,4 +1,5 @@
require 'test/unit'
require_relative 'envutil'
class TestSuper < Test::Unit::TestCase
class Base
@ -347,4 +348,14 @@ class TestSuper < Test::Unit::TestCase
assert_equal 'hoge', foo.new.bar
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

View file

@ -1459,6 +1459,12 @@ vm_search_normal_superclass(VALUE klass)
return RCLASS_SUPER(klass);
}
static void
vm_super_outside(void)
{
rb_raise(rb_eNoMethodError, "super called outside of method");
}
static void
vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq,
VALUE sigval,
@ -1472,7 +1478,7 @@ vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq,
}
if (iseq == 0) {
rb_raise(rb_eNoMethodError, "super called outside of method");
vm_super_outside();
}
id = iseq->defined_method_id;
@ -1492,8 +1498,7 @@ vm_search_superclass(rb_control_frame_t *reg_cfp, rb_iseq_t *iseq,
while (1) {
lcfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(lcfp);
if (RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, lcfp)) {
rb_raise(rb_eNoMethodError,
"super called outside of method");
vm_super_outside();
}
if (lcfp->ep == tep) {
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] */
if (!lcfp->me) {
rb_raise(rb_eNoMethodError, "super called outside of method");
vm_super_outside();
}
id = lcfp->me->def->original_id;