setNashornGlobal usage

A. Sundararajan sundararajan.athijegannathan at oracle.com
Thu Jul 18 05:32:52 PDT 2013


ScriptContext.ENGINE_SCOPE is set to be wrapper over Nashorn's Global 
object. So, from current ScriptContext instance, ENGINE_SCOPE bindings 
is fetched and set to be current Nashorn  Global instance - 
(Context.setGlobal call). And reset global after eval as you mentioned.

ScriptContext.GLOBAL_SCOPE can be any Bindings object. That is used if a 
global variable is referred in script - but not defined/assigned in 
script. Nashorn Global instance's __noSuchProperty__ hook method will 
look for mapping in GLOBAL_SCOPE, if available and use the same.

Simple sample below (lazy to write Java for a small example ;-) )

var m = new javax.script.ScriptEngineManager();
var e = m.getEngineByName("nashorn");

var globals = 
e.getContext().getBindings(javax.script.ScriptContext.GLOBAL_SCOPE);
globals.put("x", "hello");
e.eval("print(x)");

PS. The word 'global' for Nashorn should not be confused with ENGINE vs 
GLOBAL scope terms jsr223 API. jsr223 ENGINE_SCOPE is associated with 
nashorn's Global scope object.

Hope this helps,
-Sundar

On Thursday 18 July 2013 03:42 PM, Benjamin Sieffert wrote:
> Hi, I'm still working on this with Tobias.
>
> Our current understanding of what happens is as follows:
> When invocation or evaluation is requested on a NashornScriptEngine, it
> will:
> 1. Fetch its current context (protected AbstractScriptEngine member field)
> scope: ScriptContext.ENGINE_SCOPE
> 2. Set this context as the global nashorn context in the current thread
> (internal.runtime.Context.setGlobal() -> ThreadLocal<ScriptObject>
> currentGlobal)
> 3. Do the evaluation
> 4. Reset the global nashorn context in the current thread (most likely to
> null, since ThreadLocal<ScriptObject> currentGlobal gets initialized to
> nothing but an empty ThreadLocal<>())
>
> Is this rougly correct?
> If yes, question is, why does the context that is explicitly engine-scoped
> become the global scope during execution?
> (On a sidenote, we tried to do some things with using GLOBAL_SCOPE bindings
> with Nashorn in the past and it didn't work. Seems like you aren't
> using/supporting this at all?)
>
> ps: Here's the profiler output missing in Tobias' Mail: evernote
> dotcom/shard/s4/sh/1eaec11d-9732-43c3-b33d-c7e4d6e07d5f/264ff0ba4e4721525a411b5cbcb9fe6a
>
> Best regards,
> Benjamin



More information about the nashorn-dev mailing list