From: Hajimu UMEMOTO Date: 2006-01-20T14:10:42+09:00 Subject: [ruby-dev:28243] FUNCTION_CALL_MAY_RETURN_TWICE 梅本です。 FreeBSD の ports に最近 http://www.freebsd.org/cgi/cvsweb.cgi/ports/lang/ruby18/files/patch-eval.c?rev=1.3&content-type=text/x-cvsweb-markup というパッチが追加されたのですが、それ以降、xcgroup が落ちるようになっ たと報告を受けました。 /usr/local/lib/ruby/1.8/timeout.rb:52: [BUG] Segmentation fault ruby 1.8.4 (2005-12-24) [i386-freebsd6] ちなみに、patch-eval.c が追加される直前の ports では問題なく動作して いました。 # xcgroup は、XCAST6 (http://sourceforge.net/projects/xcast6/) のグルー # プを管理するプログラムです。マイナーなプログラムで申し訳ありません。 # # http://cvs.sourceforge.net/viewcvs.py/xcast6/xcgroup/ FreeBSD の ports に patch-eval.c が入った時の commit log には Fix build on sparc64 とあるのですが、パッチを見ると、FUNCTION_CALL_MAY_RETURN_TWICE を追加 する部分が、sparc64 以外の arch にも影響しています。 patch-eval.c と同等の修正が Ruby の Repo. にも入っています。 http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/eval.c.diff?r1=1.870;r2=1.871 http://lists.freebsd.org/pipermail/freebsd-sparc64/2006-January/003731.html から始まるスレッドを見ると、 http://lists.freebsd.org/pipermail/freebsd-sparc64/2006-January/003739.html で投稿されている元々のパッチでは FUNCTION_CALL_MAY_RETURN_TWICE を getcontext(&(j)->context), の前から後にずらしているだけだったのが、 amd64 ではダメだということで、getcontext() の前後に加えるように変更さ れ、Ruby Repo. に commit されたようです。 試しに、更に Index: eval.c diff -u -p eval.c.orig eval.c --- eval.c.orig Fri Jan 20 12:35:30 2006 +++ eval.c Fri Jan 20 12:37:05 2006 @@ -166,7 +166,6 @@ int function_call_may_return_twice_false #endif #define ruby_longjmp(env, val) rb_jump_context(env, val) #define ruby_setjmp(j) ((j)->status = 0, \ - FUNCTION_CALL_MAY_RETURN_TWICE, \ getcontext(&(j)->context), \ FUNCTION_CALL_MAY_RETURN_TWICE, \ (j)->status) という変更を加えたところ、問題なく xcgroup が動作するようになりました。 どうやら、getcontext() の前後に加えると、i386 で問題があるようです。 FUNCTION_CALL_MAY_RETURN_TWICE をどこに入れるか、arch 毎に分けないとい けないように思うのですが、いかがでしょうか? -- 梅本 肇 @ インターネット互助会横浜 http://www.imasy.org/~ume/ ume@mahoroba.org ume@{,jp.}FreeBSD.org プログラムは書いた人の意図ではなく書かれた通り動く I hate Modula-3 :-)