Mozilla Flux

Mozilla関係の情報に特化したブログです。

Beta 4でアドオンの互換性に影響が出るかも

JavaScriptの父Brendan Eich氏が、パッチの開発をマラソンに喩えるほど苦しんだのが、"Bug 452498 - TM: Can we jit heavyweight functions? (upvar, part deux)"だ。TraceMonkeyの適用範囲を広げて将来のスピードアップの土台作りをするものなのだが、それに加えて処理の適正化を図る意味もあるらしい。

わずかながら後者の影響を被ったのがThunderbird 3の開発版で、本来はFirefox 3.5と同じくGecko 1.9.1をベースにするアプリケーションではあるが、TrunkのGecko 1.9.2a1preをベースにしたビルドも作成していたことから、問題が発覚した。それが"Bug 487202 - Thunderbird trunk builds broken: mail3PaneWindowCommands.js - Error: redeclaration of let folder"である。

mail3PaneWindowCommands.jsというJavaScriptがエラーを出すようになったというもので、「RESOLVED INVALID」(バグとして不適当)として処理された"Bug 487264 - var vs. let"の説明によれば、Bug 452498のパッチが次のような再宣言をエラーにすることの余波であるようだ。

var x;
let x;

たとえば、既に「let x」と定義された場面で、次のようなコードを書くことはできない。

var x;
if(x)return; //x is already used, incompatible
else x = {};

(09/04/11追記)
トップレベルやfunction body直下など、こうしたコードでも例外的にエラーが出ないケースは多く認められている。他の追記やコメント欄も参照。<追記終>

Bug 452498のパッチは、現在Trunkに入っているが、近々Branch(Gecko 1.9.1)に入るため、Firefox 3.5でも同じ状況となる。何しろこのパッチの完成を待っていてFirefox 3.1 Beta 3のリリースが遅れたほどの重要な修正なので、入れないという選択肢はあり得ない。また、Brendan Eich氏によれば、規格上は前記のケースでエラーを出すほうが正しい処理なのであり、その意味でも元のように変更されることはない。

しかし、Mozilla Corporationの技術担当副社長Mike Shaver氏は、この変更がアドオンの互換性に影響するかもしれないと懸念している。Beta 3に対応していれば正式版との互換性に支障がない、とアピールしてしまった手前、Beta 3に対応済みの有名なアドオンが、Firefox 3.5 Beta 4で動かすとエラーを吐くといった話が出てくるのは困るというわけだ。

かといって、何か打つ手があるわけでもない。影響がどの程度になりそうかは、パッチがShiretoko(3.5b4pre)に投入された時点で、大まかに見えてきそうではあるが。

(09/04/10追記)
コメント欄でアドオン開発者のみなさんから貴重なご意見・情報をいただいた。お礼申し上げます。どうやらアドオンへの影響はさほどではないようだ。

ところで、ご指摘を受けて、Brendan Eich氏のコメントを見直してみたのだが、素人の筆者はどうにも混乱してしまう。このままでは本文の訂正もできないので、わからない点を追記する。詳しい方に教えていただければ幸いである。

まず、Eich氏はこう述べている。

https://bugzilla.mozilla.org/show_bug.cgi?id=487202#c18
upvar2 made it an error for var to "shadow" let, e.g. { let x; { var x; } }

https://bugzilla.mozilla.org/show_bug.cgi?id=487202#c9
The vice versa would be { var x; { let x; } } which is alowed. The case you mean is not vice versa: { var x; let x; } and it's not allowed.

ここまでだと、ローカルな範囲でlet xと再宣言するものだけがOKと言っているように読める。しかし、どうやら違うらしい。

https://bugzilla.mozilla.org/show_bug.cgi?id=487264#c9
There has been no change to multiple let x; declaration handling at top level, nor to let x; vs. var x; at top level.

https://bugzilla.mozilla.org/show_bug.cgi?id=487202#c18

$ ./Darwin_DBG.OBJ/js
js> var x;
js> let x;
js> var x; let x
js> let x; var x 
js> 

No errors.

{ var x; let x; } は許されないと言っていたのに、上のケースではエラーは出ないという。トップレベルだけは特別なのか。

https://bugzilla.mozilla.org/show_bug.cgi?id=487264#c6
Making 'let' vs. 'var' in same block (including top-level body, an implicit block) an error *helps* catch such bugs at development time.

トップレベルでも同じブロックだとチェックに引っかかるそうだ。こうなると筆者にはお手上げである。結局、どんなコードがエラーになるのだろうか。

(09/04/11追記)
コメント欄で あ さんからご指摘をいただいた。最後に引用した部分は将来の話で、今のところはトップレベルとfunction body直下ではエラーにならないという。