サイログ。

~雑多な記事置き場~

拡張ライブラリで無限ループ

先日、v1.4.5でMiyako.main_loopメソッドを実装したのですが、
breakしたときに脱出する方法が分からない。
というわけで、eval.cをソースハック〜♪


検索してみたら、rb_loopなんていうメソッドを発見。
どんなカラクリかな〜・・・え???


(元ソースより抜粋)

for(;;){
  rb_yield(Qnil);
}


こんだけ???


狐につままれながらも、以下のコードを作って、実際にESCキー押したら、たしかにbreakしました。

(C側)

staic VALUE miyako_main_loop(VALUE self){
  while(1){
    rb_funcall(mInput, id_update, 0); // mInput = Miyako::Input
    rb_yield(Qnil);
    rb_funcall(mScreen, id_update, 0); // mScreen = Miyako::Screen
  }
}


(Ruby側)
include Miyako

Miyako.main_loop do
break if Input.quit? || Input.pushed_any?(:esc)
end


Rubyのナカでは、どこで脱出してんの???
ホワイ???