とりあえず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はクセがありすぎて使ってません