ささだです.

Yusuke ENDOH wrote:
> vm_invoke_block 経由で vm_callee_setup_arg が呼ばれる時は
> sp が argv の先端を指しているようなのですが、
> vm_setup_method 経由で vm_callee_setup_arg が呼ばれる時は
> sp が argv の終端 (の次) を指していると思います。
> 
> このため vm_setup_method 経由の場合、スタックの終端を超えた
> 範囲まで mark されてしまっているのではないかと思います。
> (vm_callee_setup_arg 中で th->mark_stack_len = iseq->arg_size;
>  しているため)
> 
> 以下のパッチで rb_gc() を入れても症状が出なくなりました。

 どうもありがとうございます.全くその通りです.スタック上には Ruby
オブジェクト以外置かないようにしていたつもりでしたが,ご指摘のとおり
穴があったようです.

 置かない様にしていたのは,まさに maybe にして GC を遅くしたくな
かったためでした.


> # reg_cfp と cfp の変数名の使い分けには意味があるんでしょうか。

 cfp は,普通に使うローカル変数,reg_cfp は VM 関数中で登場する,

#define REG_CFP (reg_cfp)

と宣言されているものです.本当は reg_cfp って直接書いちゃいけないん
ですよねぇ.

-- 
// SASADA Koichi at atdot dot net