<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>HI, my code loads a Nashorn Script Engine binding values
representing metadata fields and allows user to write Javascript
to modify those metadata fields by passing the script to the eval
method and then checking for modified metadata values. It was
working fine but as I have increased the number of values added to
the bindings I have unexpected issues that some binding variables
values are missing or changed despite the script not modifying
these values.</p>
<p>I am now able to mimic the problem with self contained example</p>
<pre class="default s-code-block"><code data-highlighted="yes"
class="hljs language-csharp">import javax.script.ScriptContext;
import javax.script.ScriptEngine;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span
class="hljs-title">JsTest</span>
{
<span class="hljs-function"><span class="hljs-keyword">public</span> <span
class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span
class="hljs-title">main</span>(<span class="hljs-params">String[] args</span>) throws Exception</span>
{
<span class="hljs-built_in">int</span> numberOfBindingVars = Integer.parseInt(args[<span
class="hljs-number">0</span>]);
ScriptEngine engine;
<span class="hljs-keyword">for</span>(<span
class="hljs-built_in">int</span> i=<span class="hljs-number">0</span>; i<<span
class="hljs-number">10</span>; i++)
{
engine = <span class="hljs-keyword">new</span> org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory().getScriptEngine();
<span class="hljs-keyword">for</span>(<span
class="hljs-built_in">int</span> k=<span class="hljs-number">0</span>;k<numberOfBindingVars;k++)
{
engine.put(<span class="hljs-string">"var"</span>+k,<span
class="hljs-string">"1963"</span>);
}
System.<span class="hljs-keyword">out</span>.println(String.format(<span
class="hljs-string">"Bindings %d"</span>, engine.getBindings(ScriptContext.ENGINE_SCOPE).size()));
<span class="hljs-keyword">for</span>(<span
class="hljs-built_in">int</span> k=<span class="hljs-number">0</span>;k<numberOfBindingVars;k++)
{
<span class="hljs-keyword">if</span>(engine.<span
class="hljs-keyword">get</span>(<span class="hljs-string">"var"</span>+k)==<span
class="hljs-literal">null</span>)
{
System.<span class="hljs-keyword">out</span>.println(<span
class="hljs-string">"Missing var"</span>+k);
}
}
}
}
}
Running this with parameter **400** works fine and gives me
Bindings 400
Bindings 400
Bindings 400
Bindings 400
Bindings 400
Bindings 400
Bindings 400
Bindings 400
Bindings 400
Bindings 400
But if I increase parameter to **500** the binding count is inconsistent , although wierdly checking for each value doesnt reveal any missing.
Bindings 500
Bindings 499
Bindings 498
Bindings 497
Bindings 496
Bindings 495
Bindings 494
Bindings 500
Bindings 499
Bindings 498
And if run with **1000** I get inconsistent count again, also unable to find certain vars around the 500 mark
Bindings 1000
Bindings 999
Missing var448
Bindings 1000
Bindings 999
Missing var448
Bindings 998
Missing var448
Missing var449
Bindings 997
Missing var448
Missing var449
Missing var450
Bindings 996
Missing var448
Missing var449
Missing var450
Missing var451
Bindings 995
Missing var448
Missing var449
Missing var450
Missing var451
Missing var452
Bindings 994
Missing var448
Missing var449
Missing var450
Missing var451
Missing var452
Missing var453
Bindings 993
Missing var448
Missing var449
Missing var450
Missing var451
Missing var452
Missing var453
Missing var454
In all cases works okay the first time, but with the 500 and 1000 calls thesubsequent iterations are incorrect.
Seems like there is some other Nashorn process trimming the size of the bindings?</code>
</pre>
<p></p>
</body>
</html>