読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

es6-shim@0.33.1におけるNumberクラスの置換を無かったことにする

とりあえずes6-shimですよね。

というわけでRhino環境で使っている*1のですが、0.33.1から急にテストが通らなくなりました。 こんなエラーが出るようになった。

InternalError: Can't find method java.lang.Integer.valueOf()

え?何事?と思って調べてみると、この変更が問題でした。

http://github.com/paulmillr/es6-shim/commit/73598bee3e891fff458b7087893d80b9595e1283

Rhinoは基本クラスを置き換えることを想定していない模様です。

解決策

es6-shimに手を入れずに済む方法を考えてみたのですが、最終的にはこんな感じで落ち着きました。

import org.mozilla.javascript.*;


Context ctx = ContextFactory.getGlobal().enterContext();
TopLevel toplevel = new TopLevel();


ctx.evaluateString(toplevel, "var __Number__ = Number;", ...);
ctx.evaluateString(toplevel, readFromFile("es6-shim.min.js"), ...);
ctx.evaluateString(toplevel, "var Number = __Number__;", ...);


ctx.evaluateString(toplevel, "/* your appliation code is here */", ...);


Context.exit();

要するに、Numberクラスを一旦退避して、es6-shimが置き換えてしまった後に元のNumberクラスへ戻すという方法です。

これで元通りに動くようになりました。

余談

いつの間にかV8のDoubleConversionが取り込まれていて驚いた。

以前は public static native double java.lang.StrictMath#IEEEremainder(double f1, double f2)ボトルネックだったのです。ネイティブメソッドだったので。

http://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/v8dtoa/DoubleConversion.java

*1: Nashornはクセがありすぎて使ってません