js32.dllをバージョンアップ

最近エラーになるURLが増えてきたような感じがして困っていたので、ためしにJS32をバージョンアップしてみることに。
なんかスクリプトを使ってる特定のページでメモリ破壊が起こってるらしくて、malloc()で一般保護例外を吐いて止まる。


今まで使っていたのは、SpiderMonkey 1.5.0 RC5 (js-1.5-rc5.tar.gz)。これがパックされたのは2003/1/11だから、もうかれこれ5年前のソースを使っていることになる。
今最新のは 1.7.0 (js-1.7.0.tar.gz)。


とりあえずソースを展開して、プロジェクトは1.5の時のを持ってきて上書き。早速VC6.0でビルドするも、

error C2059: 構文エラー : ...

が大量に出る。
Releaseビルドは問題ないようだが、Debugビルドだと駄目なようだ。
JS_STATIC_ASSERT()マクロに問題があるようだが、原因はわからない。


jsutil.h


/*
 * Compile-time assert. "condition" must be a constant expression.
 * The macro should be used only once per source line in places where
 * a "typedef" declaration is allowed.
 */
#define JS_STATIC_ASSERT(condition)                                           \
    JS_STATIC_ASSERT_IMPL(condition, __LINE__)
#define JS_STATIC_ASSERT_IMPL(condition, line)                                \
    JS_STATIC_ASSERT_IMPL2(condition, line)
#define JS_STATIC_ASSERT_IMPL2(condition, line)                               \
    typedef int js_static_assert_line_##line[(condition) ? 1 : -1]

特に問題がありそうには見えないが、いろいろ試行錯誤したところ、JS_STATIS_ASSERT_IMPL()を経由するとダメっぽいので、この後に


#undef JS_STATIC_ASSERT
#define JS_STATIC_ASSERT(condition) JS_STATIC_ASSERT_IMPL2(condition, __LINE__)

を挿入して急場をしのぐ。とりあえずDebugでもビルドは通ったようだ。


これは1.5.0 RC5の時から同じだが、型矛盾のwarningがいくつか未解決で残るのが気になる。問題ないんだろうか?ちょっと不安。


jsgc.c(1514) : warning C4244: '=' : 'unsigned long ' から 'unsigned short ' に変換しました。データが失われているかもしれません。
jsobj.c(2106) : warning C4244: '=' : 'long ' から 'unsigned short ' に変換しました。データが失われているかもしれません。
jsobj.c(2107) : warning C4244: '=' : 'unsigned long ' から 'unsigned short ' に変換しました。データが失われているかもしれません。
jsopcode.c(1245) : warning C4146: 符号付きの値を代入する変数は、符号付き型にキャストしなければなりません。


で、バージョンアップして再リンクしなおして、動作確認。
とりあえず動くようだ。
メモリ破壊も直ってるっぽい。SpiderMonkey側のバグだったのかな...