[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

20 messages 2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Hidetoshi NAGAI <nagai@...> 2007/02/25

永井@知能.九工大です.

[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Nobuyoshi Nakada <nobu@...> 2007/02/25

なかだです。

[ruby-dev:30433] Re: ruby-1.8 で SEGV

From: Chikanaga Tomoyuki <chikanag@...>
Date: 2007-02-26 09:12:48 UTC
List: ruby-dev #30433
日本コントロールシステム(株)の近永と申します。
よろしくおねがいします。

[ruby-dev:30404] の件の続報です。
まだ思うように再現させられず四苦八苦していますが、struct SCOPE のあたりが
怪しいと考えて eval.c を読んでいてすこしひっかかるところを発見しました。

proc_invoke でスコープのコピーをしている所で、flags をコピーしていない点が
気になりました。
全体を把握していないので、0クリアのままでいいのか、コピーすべきか
はっきり分らないのですが、SCOPE_DONT_RECYCLE 等が消えてしまうと
よくないような気がします。
どうでしょうか。

的外れな指摘でしたら申し訳ありません。

もしここだったら、特異クラスに対する module_eval 内でブロック渡しの
define_method を使っているところがあるので、そこが問題なのだろうと
推測してこれから再現スクリプトを探索してみようと思いますが、取り急ぎ
報告させて頂きました。

--- eval.c.orig 2007-02-19 18:28:43.000000000 +0900
+++ eval.c      2007-02-26 17:28:49.000000000 +0900
@@ -8547,11 +8547,12 @@
     if (klass) _block.frame.last_class = klass;
     _block.frame.argc = RARRAY(tmp)->len;
     _block.frame.flags = ruby_frame->flags;
-    if (_block.frame.argc && (ruby_frame->flags & FRAME_DMETH)) {
+    if (_block.frame.argc && DMETHOD_P()) {
         NEWOBJ(scope, struct SCOPE);
         OBJSETUP(scope, tmp, T_SCOPE);
         scope->local_tbl = _block.scope->local_tbl;
         scope->local_vars = _block.scope->local_vars;
+        scope->flags = _block.scope->flags;
         _block.scope = scope;
     }
     /* modify current frame */

-- 
日本コントロールシステム(株)
近永 智之 <[email protected]>

In This Thread