From: SASADA Koichi Date: 2011-06-16T18:38:33+09:00 Subject: [ruby-dev:43828] Re: [ruby-dev:43743] [Ruby 1.9 - Feature #4871][Open] envのコンパクト化  ささだです.  返事が遅くなって済みません. (2011/06/11 21:03), Kazuki Tsujimoto wrote: > rb_env_tのenvは以下の構造を持ちますが、env[2](prev env val)は不要ではないでしょうか。 > > /* > env{ > env[0] // special (block or prev env) > env[1] // env object > env[2] // prev env val > }; > */ > > > 根拠は次の通りです。 > > * prev env valに無条件にNULLを代入するようにコードを変更してもmake test、make test-allをパスする。 > * コードを読む限りこの値が使われるのはcheck_envの中で値をデバッグ用に出力するときのみ。 > * check_envはPROC_DEBUGが真でない限り呼ばれない。通常は偽。 > * そもそもcheck_envはYARVがマージされて以来変更されておらず、現在のenvの構造に対応できていない。 > > > prev env valを持たないようにした上でcheck_envをこの変更に対応させたパッチを添付します。 > > なお、check_envはstdout/stderr両方にデバッグメッセージを出力するため > flushのタイミングによっては出力が混在して見づらいので > 出力先をstderrに統一するためのパッチもあわせて用意しました。  この env->env[2] = prevenv は,GC の mark のために作ったんではないかと 思います.で,env->prev_envval があるのに何故あるのかというと,えっと, うーん.なんであるんだろう.env[1] = self_env も,切っちゃっていいような 気がしてきました.昔と構造が変わって,不要になったのかな.  この辺は構造が入り組んでいるので,とりあえず 1.9.3 はここは触らない, と刺せて下さい.それで,GC.stress で動かして,無事だったらその後入れる, というのはどうでしょうか.というか,この辺の再確認が必要かも.  check_env は仰るとおり,初期のデバッグ用に作ったものなので,最近使って いないので追従できていないのだと思います. -- // SASADA Koichi at atdot dot net