Share context/JS bindings

Hannes Wallnöfer hannes.wallnoefer at oracle.com
Tue Jun 14 07:53:04 UTC 2016


Hi Axel,

The problem seems to be that bindings.clear() uses the ECMAScript delete operation to clear the bindings, and that will only delete a property if it is configurable. However, var declarations are non-configurable and therefore „survive“.

I’m not sure how to work around this, and possibly we should fix our implementation of clear to include non-configurable (declared) variables.

Regards,
Hannes

> Am 14.06.2016 um 09:09 schrieb Axel Dörfler <axeld at pinc-software.de>:
> 
> Hi there,
> 
> I'm trying to reduce the overhead of running JavaScript code. It looks like the best thing you can do is a) share a single engine, and b) reuse the script context.
> 
> I'm using a per-thread context like this:
> 
>    public static ScriptContext createJavaScriptContext() {
>        ScriptContext context = new SimpleScriptContext();
>        Bindings bindings = perThreadGlobalScope.get();
>        if (bindings == null) {
>            bindings = getJavaScriptEngine().createBindings();
>            perThreadGlobalScope.set(bindings);
>        } else
>            bindings.clear();
> 
>        context.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
> 
>        return context;
>    }
> 
> Now I'm facing the problem that JavaScript variables are shared between different uses.
> Ie. a:
> 
>    var found;
>    print found;
>    found = 1;
> 
> Would print "1" on the second run.
> 
> Is there a way to avoid this?
> 
> Bye,
>   Axel.



More information about the nashorn-dev mailing list