2013年10月26日

XCode 5 で SpiderMonkey 17 をビルドする

Mavericks に更新して XCode も更新してさて UnMHT for QuickLook のために SpiderMonkey 17 をビルド、という所で clang が新しくなったからなのか、goto でエラーが出ました。

error: indirect goto might cross protected scopes
DO_NEXT_OP(len);

このバグ、mozilla-central では既に直ってるヤツっぽいんだけど、SpiderMonkey に単体版は今のところ 17 なので、なんとかしてビルドしないといけないワケです。ちなみに SpiderMonkey 24 は来月出るそうなので、それが出ればそっちを使えば OK でしょう。

さて、問題になるのは DO_NEXT_OP マクロ内で使われる DO_OP マクロの中の goto です。調べてみると、DO_OP マクロは JS_THREADED_INTERP によって2種類が使い分けられているようで、JS_THREADED_INTERP がオフの場合の DO_OP マクロには goto が入っていません。

ということで jsinterp.cpp の 909 行目の

# if JS_VERSION >= 160 && (                                                   \



# if JS_VERSION >= 160 && !defined(__clang_major__) && (                      \

のように変更して clang を使っている場合に JS_THREADED_INTERP をオフにするようにすればビルドできるようになります。