きりかノート 3冊め

おあそびプログラミング

RubyCocoa 今週のコミット ..2014-07-03 standaloneify.rbのruby-2.x対応

1週間以上前にテスト全部とおるようになったんだけど、実際にアプリ試してみるとダメなところあったりで対処中。今はstandaloneify.rbを対応してるとこ。

  • ruby-2.xで"$0 not initialized"を修正。(r2581)
  • ruby-2.xでクラッシュするのを修正。(r2582)

簡単に説明。

rubyで実行中に$0の値を設定すると、プロセスの表示名(なんていうんだ?)を変更することができる。これを利用してstandaloneify.rbを実行中にターゲットのアプリのパスを$0に設定して、NSBundle.mainBundleがアプリになるようにしてたりする。これがruby-2.x上では"$0 not initialized"とエラーになってしまうようになった。

これはruby-2.0以降では実行しているプロセスがrubyコマンドのとき(正確にはruby_sysinit()されたとき)のみ、$0への代入を許可しているため。対応としては

  • $0へ代入しない。
  • ruby_sysinit()で初期化するようにする。

あたりなんだけど、とりあえず前者から試してみて対応できたのでそのようにした。CocoaではNSProcessInfoでrubyの$0と同様に実行中のプロセスの$0を変更できるのでそれを利用した。

次にクラッシュの件。standaloneify時のアプリで文字列Stringのインスタンスを生成すると落ちるというもので、これは数日調べてもぜんぜんわからなかった。なんだけど、ruby_run_node()での実行が終わったあとに操作してるのが問題ぽくて、そもそもstandaloneify時には必要ない処理だったのでクラッシュする箇所に到達する前にexit()するようにしたら直った。気付けば簡単なことなんだけど、これは苦戦した。。

あと残ってるのはどうもThreadの動作があやしくて、サンプルのSimpleAppからしてスレッド使ったとこがちゃんと動かない。たぶんこれ直したらリリースできると思う。