Not all locals live in the scope object. If you look at the code Nashorn emits[*] you will see that Nashorn strives to use JVM bytecode local variables whenever it can. Only function local variables that need to be visible in a nested lexical context (e.g. nested function) will be pushed into the scope object.
Attila. -- [*] Use the --print-code command line switch to jjs. Programmatically, use "-Dnashorn.args=--print-code" or use NashornScriptEngineFactory explicitly and invoke its getScriptEngine(String...) method to pass command line arguments. On Sep 30, 2014, at 10:36 AM, Kuperman Sergey <[email protected]> wrote: > Kuperman Sergey <seastranger@...> writes: > >> >> Hello ! I am not sure it is the right place to ask but i will try anyway ) >> My team is trying to develop a JS debugger poc running Nashorn , and we >> encountered an issue when trying to implement evaluation in function context: >> We run some JS function with: >> ScriptEngineManager sem = new ScriptEngineManager(); >> ScriptEngine engine = sem.getEngineByName("nashorn"); >> engine.eval("load (\"src/com/sap/rdl/runjs/file.js\");"); >> in another app we set a breakpoint in a function, and try to invoke eval() >> function from DebuggerSupport.java , while passing to it :scope variable we >> received from the relevant frame's visibleVariables (JDI). >> eval succeeds when global or upper scope defined variables are involved, but >> if i use an expression with local function variable, i receive ECMAException >> no such variable defined.. it seems to me that eval needs local vars to be >> defined within the scope but they are not .. >> Is there anything i could do to make it work ? >> >> Thanks in advance >> >> Sergey >> SAP RDL development team >> >> > > A little further investigation shows, that nashorn :scope loads variables > lazily - only when needed or if eval function is used inside js. > Is there a way to force :scope to contain all vars regardless of use ? I > mean except using dummy eval statement that would be an ugly workaround.. > thanks in advance > Sergey > >
