[#23332] to_str再考 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

15 messages 2004/04/05

[#23380] [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

17 messages 2004/04/15
[#23400] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。落ちる場所がわかりました。

[#23402] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[#23403] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — nobu.nakada@... 2004/04/16

なかだです。

[#23405] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[#23407] Re: [SEGV] make test-all (bccwin32 ruby1.9.0) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/04/16

山本です。

[ruby-dev:23410] define_method to Module (Re: Re: `to_s': method `to_s' overridden (TypeError))

From: nobu.nakada@...
Date: 2004-04-20 00:13:46 UTC
List: ruby-dev #23410
なかだです。

At Tue, 10 Feb 2004 11:29:06 +0900,
Nobuyoshi-Nakada wrote in [ruby-dev:22850]:
> > |> |そういえば、次の `to_s': method `to_s' overridden (TypeError) というの
> > |> |はなぜ起こるんでしょうか?
> > |> 
> > |> なぜか明示的にチェックしてますね。なんでチェックを入れたのか
> > |> 全然思い出せないんですけど。3年前の自分は別人だ。
> > |
> > |どうせチェックするなら、define_methodの時点でしたほうがいいんじゃ
> > |ないでしょうか。
> > 
> > その意見には賛成です。でも、このパッチの挙動にいまいち自信が
> > 持てないので(元は自分が書いたコードなのに)、1.8.1には入れま
> > せん。
> 
> これはどうしましょうか。define_methodの時点でチェックするなら、
> NODE_DMETHOD自体不要になるような気がするのですが。

今の今まで気づかなかったのですが、CVS HEADでclassのメソッドを
moduleにdefine_methodできなくなってます。

  $ ruby -v -e 'class Foo;def foo;end;end;module Bar;define_method(:foo, Foo.instance_method(:foo));end'
  ruby 1.9.0 (2004-04-19) [i686-linux]
  -e:1:in `define_method': bind argument must be a subclass of Foo (TypeError)
	from -e:1

確認なのですが、メソッドの定義元かdefine_method先のどちらかが
moduleなら継承関係がなくてもOKということですよね。


Index: eval.c
===================================================================
RCS file: /cvs/ruby/src/ruby/eval.c,v
retrieving revision 1.658
diff -u -2 -p -r1.658 eval.c
--- eval.c	14 Apr 2004 04:06:24 -0000	1.658
+++ eval.c	20 Apr 2004 00:03:24 -0000
@@ -9099,5 +9099,5 @@ rb_mod_define_method(argc, argv, mod)
 		rb_raise(rb_eTypeError, "cannot bind singleton method to a different class");
 	    }
-	    if (RCLASS(rklass)->super && !RTEST(rb_class_inherited_p(mod, rklass))) {
+	    if (RCLASS(mod)->super && !RTEST(rb_class_inherited_p(mod, rklass))) {
 		rb_raise(rb_eTypeError, "bind argument must be a subclass of %s",
 			 rb_class2name(rklass));


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread