yarv-dev:704
From: Minero Aoki <aamine loveruby.net>
Date: Mon, 26 Dec 2005 03:03:49 +0900 (JST)
Subject: [yarv-dev:704] open> super in define_method in sclass
青木です。
[ruby-core:03856] と同じコードで落ちました。
~/c/yarv % cat t
class X
def a
end
def b
class << self
define_method(:a) {
super
}
end
end
end
x = X.new
x.b
x.a
~/c/yarv % ./miniruby t
t:7: DBG> : "t:15:in `<main>'"
-- stack frame ------------
0x2a95ee2010 (0000): 00000001
0x2a95ee2018 (0001): 2a95eaeeb0
0x2a95ee2020 (0002): 00000004
0x2a95ee2028 (0003): 00000001
0x2a95ee2030 (0004): 2a95eaeeb0
0x2a95ee2038 (0005): 0069b739 <- dfp
0x2a95ee2040 (0006): 00000004 <- bp
-- control frame ----------
c:0004 p:0005 s:0007 b:0006 l:-171 d:0005 PROC i:block in singletonclass s: -
c:0003 p:0039 s:0004 b:0004 l:0003 d:0003 TOP i:<main> s: -
c:0002 p:-001 s:0001 b:0001 l:0000 d:0000 FINISH i:- s: -
c:0001 p:-001 s:0000 b:-001 l:0000 d:0000 ------ i:- s: -
---------------------------
[BUG] Segmentation fault
ruby 1.9.0 (2005-11-18) [x86_64-linux]
zsh: 1493 abort (core dumped) ./miniruby t
ちなみに ruby 1.9 では 2004-11-30 に次のように修正されています。
--- eval.c 29 Nov 2004 06:09:40 -0000 1.734
+++ eval.c 30 Nov 2004 04:01:16 -0000 1.735
@@ -3250,6 +3250,9 @@
}
}
if (nd_type(node) == NODE_ZSUPER) {
+ if (ruby_frame->flags & FRAME_DMETH) {
+ rb_raise(rb_eRuntimeError, "super: specify arguments explicitly");
+ }
argc = ruby_frame->argc;
argv = ruby_scope->local_vars + 2;
}
@@ -5550,6 +5553,7 @@
break;
case NODE_BMETHOD:
+ ruby_frame->flags |= FRAME_DMETH;
result = proc_invoke(body->nd_cval, rb_ary_new4(argc, argv), recv, k
lass);
break;
つまり引数のチェックが足りてないようです。
--
青木峰郎
--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml
-> 704 2005-12-26 03:03 [aamine loveruby.net ] open> super in define_method in sclass 729 2005-12-28 11:04 ┗[ko1 atdot.net ] fixed> Re: open> super in define_method in sclass 807 2006-02-04 18:07 ┗[aamine loveruby.net ] close> Re: super in define_method in sclass