MozillaZine.jp フォーラム
https://forums.mozillazine.jp/

[解決] JavaScript JITコンパイラ について(4.0b13pre にて修正済を確認)
https://forums.mozillazine.jp/viewtopic.php?f=2&t=11113
ページ 11

作成者:  K.Tsunoda [ 2011年2月10日(木) 19:55 ]
記事の件名:  [解決] JavaScript JITコンパイラ について(4.0b13pre にて修正済を確認)

[ FireFox3.6.13 , WindowsXP/SP3 ]

現在、JavaScript JIT機能のバグではないかと思われる事象にぶつかって困っています。

以下、トラブルの内容と調査過程の説明になります。

http://www.h3.dion.ne.jp/~sakatsu/holiday_topic.htm
http://www.h3.dion.ne.jp/~sakatsu/holid ... nglish.htm
2003年から上記サイトで「祝日リスト」を作成するJavaScriptを公開しています。
JavaScriptコードは、表示される「祝日リスト」のページ内にリンクを設けてあるので、
そこから閲覧できます。

先日、FireFox3.6でリストを作成すると一部で間違った結果が出る事が判りました。
実例 : 2010~2012年 ⇒
2010/3/22(月, 振替休日) が出て来ない(2010/3/21(日) : 春分の日)
2012/3/12(月, 振替休日) が出て来る(2012/3/11(日) : 只の日曜日)

しかし、JavaScriptコードを確認しましたがコードに誤りは無く、また、他の
ブラウザ(FireFox2[Win Me], IE8, Opera11 ,Safari5)で作成した場合には
常に正しい結果が作成される事も確認しました。

FireFox3.6でも、作成期間を変えたり(2008-2012)すれば正しい結果が得られる
事も判りました。また、2010/3/22, 2012/3/12 の日付に対してピンポイントで
祝日判定を行なえば、ここでも常に正しい結果が得られます。

document.write を要所要所に入れてみたところ、上記の例では
 2010/3/21(日)を「只の日曜」、2012/3/11(日)を「勤労感謝の日」
と判定していました(これは勿論間違いです)。

ところが、FireBugアドオンを入れて、document.write を console.log に替えて
みたら、それだけで正しく判定するようになりました。
 2010/3/21(日)を「春分の日」、2012/3/11(日)を「只の日曜日」

更に試行を重ねた結果、console.log を入れなくても、単に FireBug を有効に
するだけで正しい結果が出る事が判りました(無効にすると、また間違った
結果がでるようになります)。


その後、FireFox3.5で、JITコンパイラのバグにより
「HTMLタグをJavaScriptで処理する際に起こる
エラーにより、メモリの内容が破壊されてしまう」
という記事(窓の杜)
http://www.forest.impress.co.jp/docs/ne ... 02600.html
を見付けました。

試しにJIT機能を無効にしたところ、それだけで、常に正しい祝日リストを
出力するようになりました(この時には、FireBugは無効にしてあります)。
JIT機能を有効に戻すと、また間違った結果を出します。


「窓の杜」の記事末尾にあるリンク先には、JITのバグは 3.5.1 で修正された
という記述が見られますが、今回、わたしが出会った事象からは、上記のバグ
が未だ残っているように思えます。

FireBug を使った際に症状が出ないというのも、FireBug というデバッガが
介在する事によってJIT機能が無効になっていた(もしくはバイパスしていた)
と考えれば辻褄が合うように思えます。


この症状に関して、何か関連する情報をお持ちの方、アドバイス頂ければと思います。
宜しくお願いします。

作成者:  K.Tsunoda [ 2011年2月19日(土) 18:06 ]
記事の件名:  Re: JavaScript JITコンパイラ について

追加情報です。

[FireFox 4.0 Beta11, WindowsXP/SP3 ] で確認してみたところ、
件の障害(誤った日付結果)は起きませんでした。



JaegerMonkey を無効にした場合(TraceMonkey のみで処理)
 [javascript.options.methodjit.content = false]
 [javascript.options.tracejit.content = true]

件の障害が出て来ました。
ただ、オプション切替直後 or ブラウザ表示直後には障害が出ますが、
続けて再実行すると障害は出ずに正しい結果が表示されます。
また、その際にも、
 この障害有り:2010/3/22(月, 振替休日) が出て来ない(2010/3/21(日) : 春分の日)
 この障害無し:2012/3/12(月, 振替休日) が出て来る(2012/3/11(日) : 只の日曜日)
という結果で、FireFox3.6.13 の時とは若干異なる挙動でした。



JaegerMonkey/TraceMonkey 両方を無効にした場合
 [javascript.options.methodjit.content = false]
 [javascript.options.tracejit.content = false]

FireFox3.6.13 で JIT を無効にした場合と同じく、障害は出ませんでした。

作成者:  K.Tsunoda [ 2011年2月20日(日) 15:45 ]
記事の件名:  Re: JavaScript JITコンパイラ について

Bugzilla@Mozilla へBug報告しようと思っています。

今、BugListに類似報告がないか見ていますが、良く判りませんね。

スクリプトのサイトは英語ページもありますので、そちらを指定しています。
(なお、単に日本語部分を英語に直してあるだけのスクリプトなんですが、それだけで
日本語ページでの実行とは、不具合の出方の挙動が若干異なります。これも謎ですが)

一応、下記の「下書き」を書いてみたんですが、何分、英訳ツール頼みなもので、なかなか
良い表現が出来ていない部分もあるかもしれません。

「ここは、こうした方が良い」といったアドバイスなど頂ければ助かります。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Product: Core or FireFox

Component: JavaScript Engine or General

Hardware Platform: x86

Operating System: Windows XP

Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 ( .NET CLR 3.5.30729)

URL: http://www.h3.dion.ne.jp/~sakatsu/holid ... nglish.htm

Summary: If TraceMonkey is valid, a practice result of Script is wrong. (FireFox3.6.13)


Details:
==================================================
There is a script making a list on a holiday in Japan in my HP.
(The definition of the holiday in Japan is listed in my HP.)
http://www.h3.dion.ne.jp/~sakatsu/holid ... nglish.htm
http://www.h3.dion.ne.jp/~sakatsu/Japan ... ake_Eng.js
http://www.h3.dion.ne.jp/~sakatsu/Japan ... Chk_Eng.js

It is confirmed that this script works definitely in IE8, Opera11, Safari5(WinXP) and FireFox2(WinMe).

However, wrong data are output when I make "a holiday list" in FireFox3.6.13,
and besides, a result changes whenever a script works.

1st practice after FireFox start : Only (a)
2nd practice : (a)&(b)
3rd practice : A right result

1st practice after reloading : Only (a)
2nd practice : A right result

A wrong example : [2010-2012 years]
Loop count of example is [365+365+366=1096].
(a) 2010 Mar. 22(Mon and "Holiday in lieu") is not output.
(2010 Mar. 21(Sun) is "Vernal Equinox Day".)
(b) 2012 Mar. 12(Mon and "Holiday in lieu") is output.
(2012 Mar. 11(Sun) is the normal sunday.)

["Holiday in Lieu" ( or "Substitute Holiday" ) ]
Definition : When Sunday becomes a holiday by the law, the next day( Monday ) becomes in the holiday.

The practice result (by documents.write) of the following step to judge "Holiday in Lieu."
JapanHolidayChk_Eng.js [Line No. 73] HolidayName = prvHolidayChk(YesterDay);
(a) prvHolidayChk(YesterDay(="2010/3/21")) is a null character("").
(b) prvHolidayChk(YesterDay(="2012/3/11")) is "National Foundation Day".
These are wrong results.

When I investigated it with FireBug, malfunction does not appear.
The practice result (by console.log of FireBug 1.6.2) of the step to judge "Holiday in Lieu."
(a) prvHolidayChk(YesterDay(="2010/3/21")) is "Vernal Equinox Day".
(b) prvHolidayChk(YesterDay(="2012/3/11")) is a null character("").
These are right results.
In addition, malfunction did not appear even if I did not insert console.log
when I started FireBug. Will FireBug invalidate TraceMonkey temporarily?


In addition, a right result is provided in the follows.
(1) I judge "one day" of [2010 Mar. 22] or [2012 Mar. 12].
window.alert(ktHolidayName("2010/3/22"));

(2) I change a period (2008-2012 years etc.).


---------------------------------------------------
The malfunction did not appear when I changed config to invalidate TraceMonkey.
[javascript.options.jit.content = false]


---------------------------------------------------
The malfunction did not appear when I tried it in FireFox4.0Beta11.

When I invalidated JaegerMonkey, malfunction appeared (work only in TraceMonkey).
 [javascript.options.methodjit.content = false]
 [javascript.options.tracejit.content = true]

1st practice after FireFox start or reloading : Only (a)
2nd practice : A right result


When I invalidated both JaegerMonkey and TraceMonkey, malfunction did not appear.
 [javascript.options.methodjit.content = false]
 [javascript.options.tracejit.content = false]


---------------------------------------------------
I expect a correction of the malfunction of TraceMonkey.

==============================================


Reproducibility: Happen every time


Steps to Reproduce:
1. Browse the following site.
http://www.h3.dion.ne.jp/~sakatsu/holid ... nglish.htm

2. Type the year of the period into two TextBox. [from 2010 to 2012]

3. Click [Holiday List] button.

4. "A holiday list" is output by a new window.

5. Change config to invalidate TraceMonkey and execute step-2 to 4.




Actual Results:
(a) 2010 Mar. 22(Mon and "Holiday in lieu") is not output.
(2010 Mar. 21(Sun) is "Vernal Equinox Day".)
(b) 2012 Mar. 12(Mon and "Holiday in lieu") is output.
(2012 Mar. 11(Sun) is the normal sunday.)

Note: A result changes whenever a script works.

1st practice after FireFox start : Only (a)
2nd practice : (a)&(b)
3rd practice : A right result(following "Expected Results")

1st practice after reloading : Only (a)
2nd practice : A right result(following "Expected Results")


The malfunction did not appear (following "Expected Results")
when it changed config to invalidate TraceMonkey.


Expected Results:
(a) 2010 Mar. 22(Mon and "Holiday in lieu") is output.
(2010 Mar. 21(Sun) is "Vernal Equinox Day".)
(b) 2012 Mar. 12(Mon and "Holiday in lieu") is not output.
(2012 Mar. 11(Sun) is the normal sunday.)





Additional Information:

Security: off

Severity: Normal: It's a bug that should be fixed.

作成者:  pal [ 2011年2月20日(日) 16:12 ]
記事の件名:  Re: JavaScript JITコンパイラ について

適切な英語表現がわからないのであれば、以下に日本語で。
http://bugzilla.mozilla.gr.jp/

きちんと確認できれば、わかる人が本家の方に類似のものがないかを検索、あるいは、(なければ)登録してくれるでしょう。

作成者:  K.Tsunoda [ 2011年2月21日(月) 02:13 ]
記事の件名:  Re: JavaScript JITコンパイラ について

palさん、ありがとうございます。日本語でのサポートサイトもあったんですね。

Bugzilla-jp へ[#6785]で投稿しました。
http://bugzilla.mozilla.gr.jp/show_bug.cgi?id=6785

作成者:  K.Tsunoda [ 2011年2月21日(月) 17:42 ]
記事の件名:  Re: JavaScript JITコンパイラ について

Bugzilla-jp[#6785] から 本家[#635657] へ登録されました。
https://bugzilla.mozilla.org/show_bug.cgi?id=635657

中野さん、ありがとうございます。

しかし・・・・・ 実にシンプルにまとまるもんですね(汗)

作成者:  K.Tsunoda [ 2011年2月22日(火) 14:26 ]
記事の件名:  Re: JavaScript JITコンパイラ について

本家に寄せられているコメントの雰囲気は
引用:
早く直して欲しいというのは判るけれど、
FireFox4 が日の目を見るまでは、
TraceMonkeyへの新たな課題を出されても、
人でもなくて、開発作業は手一杯で、
今現在、手が回らないので、待つしかないですよ。

という事でしょうか・・・(残念)

作成者:  K.Tsunoda [ 2011年2月25日(金) 19:42 ]
記事の件名:  Re: JavaScript JITコンパイラ について

引用:
Comment 21
> Given the switch statement, this might be related to Bug 620757.
Yeah, I'm 95% sure it's a dupe.


現在、switch を全て if-else に置き換えてテストしています。
今のところは上手くいっています。間違った結果は出ないようです。

ただ、TraceMonkey の仕組みを考えれば、テスト条件をピックアップしてのチェックでは
確実性が無いと思われるので、全ケースで修正前と修正後を試して、修正後で間違いが
ゼロになるか確認する必要がありますね(修正前では間違っていなかったケースが、
修正後で間違ってしまう可能性が無いとは言えませんので)。

とりあえず、2000~2050年の範囲でのテスト
[2000-2000] [2000-2001] [2000-2002] ・・・
[2001-2001] [2001-2002] [2001-2003] ・・・
・・・
[2049-2049] [2049-2050] [2050-2050]

締めて、1250ケース*修正前/後=2500回 を確認中です。

自動実行のスクリプトを作ると、そのスクリプトのループがテストに悪影響(出る筈の間違い
が出なくなる)を及ぼす可能性もあるので、手作業で1件ずつ(毎回リロードして初期化
もさせています。続けて実行すると、それもまた結果に影響するのが判ってますので)実行
掛けてますので、全て済むまで数日掛かりそうです。

全部終わったら、結果を報告します。

作成者:  pal [ 2011年2月25日(金) 19:52 ]
記事の件名:  Re: JavaScript JITコンパイラ について

いろいろ検証して云々ということは、ここではんかう、登録なさったバグ、あるいは、本家のバグでやりとりしていただけませんか?

ここでお書きになっても、仕方ないと思います。
開発者、あるいはバグ担当者の方々は、基本的には、あまり(わざわざ)ここをご覧にはなられていないと思いますので。

作成者:  pal [ 2011年2月25日(金) 19:54 ]
記事の件名:  Re: JavaScript JITコンパイラ について

[誤字]
(誤) ここではんかう
(正) ここではなく

作成者:  K.Tsunoda [ 2011年3月03日(木) 08:43 ]
記事の件名:  Re: [解決] JavaScript JITコンパイラ について

このバグの根本理由が
引用:
ループ内の2番目の switch がTraceMonkeyの誤解釈により
「Value=5 の時に Case 3 のブロックに飛ぶ」といった間違った動きをする。

という事であると判りました。下記はその「まとめ」です。
http://www.h3.dion.ne.jp/~sakatsu/FireFox_TMBugTest.htm

Bugzilla-jp(#6785) および 本家Bugzilla(#635657)に、この報告を上げてあります。

回避方法として「switch の if-else への書き換え」も判りましたので
本スレッドは、これで「解決」とします。

作成者:  Masayuki [ 2011年3月03日(木) 15:37 ]
記事の件名:  Re: JavaScript JITコンパイラ について

K.Tsunoda さんが書きました:
Bugzilla-jp[#6785] から 本家[#635657] へ登録されました。
https://bugzilla.mozilla.org/show_bug.cgi?id=635657

中野さん、ありがとうございます。

しかし・・・・・ 実にシンプルにまとまるもんですね(汗)


こちらにスレッドあるの気づいてませんでした。

報告と、テスト作成は弊社の加藤誠です。私自身、JSは完全に専門外なのでサポートできず、すみません。

作成者:  K.Tsunoda [ 2011年3月11日(金) 22:03 ]
記事の件名:  Re: 4.0b13pre にて修正

[4.0b13pre] で下記テストをしたところ、本件のバグが修正されている事を確認できました。

・ FireFox_TMBugTest.htm および 祝日一覧作成スクリプト
・ JaegerMonkey(ON) & TraceMonkey(ON)
・ JaegerMonkey(OFF) & TraceMonkey(ON)

ページ 11 All times are UTC + 9 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/