JavaImporterの繰り返し生成時、with__noSuchProperty__ placeholderエラー
JDK 1.8.0_20で下記のJavascriptソースのようにJavaImporterインスタンスを繰り返し生成すると、
(実際のソースは違いますが、理解しやすさのため、ウェブからサンプルを持ってきました)
/* ファイル名 : test.js 実行 : jrunscript test.js 期待値 : 出力なし。 */ var constant = 0.50; var ind = 0.0; for (var i = 0; i < 50; i++) { var math = new JavaImporter(java.lang.StrictMath); ind += 10.0; with (math) { StrictMath.exp(-constant*ind); } } for (var i = 0; i < 50; i++) { var math = new JavaImporter(java.lang.StrictMath); try { math.Foo(); } catch (e) { if (! (e instanceof TypeError)) { throw e; } } }
下記のようが例外がスローされました。
Exception in thread "main" java.lang.AssertionError: __noSuchProperty__ placeholder called
at jdk.nashorn.internal.objects.NativeJavaImporter.__noSuchProperty__(NativeJavaImporter.java:105)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:557)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:209)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:378)
at jdk.nashorn.internal.runtime.ScriptObject.invokeNoSuchProperty(ScriptObject.java:2113)
at jdk.nashorn.internal.runtime.ScriptObject.megamorphicGet(ScriptObject.java:1805)
at jdk.nashorn.internal.scripts.Script$test.runScript(test.js:8)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:535)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:209)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:378)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:568)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:525)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:521)
at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:187)
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
at com.sun.tools.script.shell.Main.evaluateReader(Main.java:332)
at com.sun.tools.script.shell.Main.evaluateStream(Main.java:368)
at com.sun.tools.script.shell.Main.processSource(Main.java:285)
at com.sun.tools.script.shell.Main.access$100(Main.java:37)
at com.sun.tools.script.shell.Main$2.run(Main.java:200)
at com.sun.tools.script.shell.Main.main(Main.java:48)
繰り返し生成というのはJavascript側でfor文を利用した繰り返しだけでなく、
Java側でJavascriptソースを実行するjavax.script.ScriptEngineのオブジェクトを
ThreadLocalやマップなどにキャッシュして繰り返し使用することも含みます。
JDKのバグのようで、JDK 1.8.0_40から直ったらしいです。
https://bugs.java.com/view_bug.do?bug_id=8060101
試しにJDK 1.8.0_60で上記のJavascriptソースを実行したら、エラーは出ませんでした。