ワナベと申します。

MinGW上のHEADで以下のスクリプトを走らせると、何のエラーメッセージもなしに強制終了してしまいました。

def hoge(x)
  a=proc {|n| hoge(n - 1) if n > 0 }
  a.call(x)
end
hoge(100000)
puts "ok"

SystemStackErrorが投げられないのはおかしいと思い、一応パッチを書いてみました。
チェックのコストや、チェックする場所の妥当性、根本の問題などはよくわかっていません。
コンパイル時のオプションで対応する方がいいような気もしています。

Index: eval_intern.h
===================================================================
--- eval_intern.h       (revision 15787)
+++ eval_intern.h       (working copy)
@@ -187,7 +187,8 @@
 }

 #define CHECK_STACK_OVERFLOW(cfp, margin) do \
-  if (((VALUE *)(cfp)->sp) + (margin) + sizeof(rb_control_frame_t) >=
((VALUE *)cfp)) { \
+  if (((VALUE *)(cfp)->sp) + (margin) + sizeof(rb_control_frame_t) >=
((VALUE *)cfp) || ruby_stack_check()) { \
+      rb_thread_raised_set(GET_THREAD(), RAISED_STACKOVERFLOW); \
       rb_exc_raise(sysstack_error); \
   } \
 while (0)


-- 
ワナベ