すみません。大嘘を書きました。このプログラムを通さないのは、Spidermonkey だけでした。Rhino と Firefox は大丈夫です。ということで、タイトルからRhino と Firefox を削除しました。ごめんなさい。
—–
以下の短い JavaScript のプログラムを見て下さい。
(function () {
var Array = [];
return function () { return Object; };
})();
何も面白いことをしないプログラムです。%%真面目に確認していないけれども、たぶん Safari, Chrome では問題ないけれども、Mozilla 系列だと全滅します。%%真面目に確認したところ、Spidermonkey のみでエラーが再現しました。((Rhino と Firefox も類似のエラーでこけるはずなので、再調査の上、報告します。))
たとえば、Spidermonkey でこれを実行すると以下のわけのわからないエラーを出力します。
TypeError: Array is not a constructor
で、以下のように変更するとこのエラーは消えます。
– Array という名前の変数を別な無難なもの、たとえば array に変更する。
– 3行目の関数の本体から組込みのオブジェクト名を除去する。たとえば、return Object のかわりに return Array とするのは大丈夫です。以下がエラーが消える例です。
(function () {
var Array = [];
})();
(function () { return Object; })();
ブロックのなかで組込みのオブジェクトと同名の変数を宣言し、そのブロックで別の組込みのオブジェクトを参照しているとエラーになるような気がします。
ちなみに ECMA では、組込みオブジェクトの名前は予約語ではないようです。
あまり詳しくないので自信を持って言えないのだけど、バグだよね?バグ?よく知られた話なんですか?
ひょっとして tracemonkey になって直ったのかも?spidermonkey も直ってくれるといいな。というか、tracemonkey の CUI 版があればいいのか。もしかしてある?
自力で解決しました。コマンド行版の tracemonkey はコンパイルできそうです。さっき Diigo にブックマークしましたけれども、一応、こちらにも紹介しておきます。
http://ptspts.blogspot.com/2009/10/how-to-compile-tracemonkey-for-linux.html
こんなのもあります。Macは明示的にはサポートしてないようだけど。
http://code.google.com/p/jslibs/
ありがとう!SpiderMonkey に皮をかぶせて拡張しやすくしたのかな。きっと Mac OS X でも動くんだろうね。ライブラリの動的ロードではまるかな?これは使えそう。
ちょっとドキュメントが不明瞭なんだけど、最新版ではSpiderMonkeyではなく TraceMonkeyを使っているようです。
おぉ、そうなの!それはますます素晴しい。さて何を作ろう。