まつもと ゆきひろです

In message "[ruby-dev:7742] [BUG] Segmentation fault (again...)"
    on 99/08/21, Yasuhiro Fukuma <yasuf / big.or.jp> writes:

|以下が落ちます。
|
|  % cat bug.rb
|  eval "Thread.new { GC.start }", binding

このように再現性のあるスクリプトがあると助かります。Frameが
ヒープ上にある時にもスタック上にあるものとしてアドレス演算し
てました。

パッチです。

--- /tmp/eval.c	Wed Aug 18 23:14:34 1999
+++ eval.c	Sat Aug 21 11:16:00 1999
@@ -5984,4 +6018,4 @@
 
-#define ADJ(addr) (void*)(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr)
-#define STACK(addr) (th->stk_pos<(addr) && (addr)<th->stk_pos+th->stk_len)
+#define STACK(addr) (th->stk_pos<(VALUE*)(addr) && (VALUE*)(addr)<th->stk_pos+th->stk_len)
+#define ADJ(addr) (void*)(STACK(addr)?(((VALUE*)(addr)-th->stk_pos)+th->stk_ptr):(VALUE*)(addr))