ScriptObjectMirror - reformatted for plain text
A. Sundararajan
sundararajan.athijegannathan at oracle.com
Mon Jul 14 10:56:44 UTC 2014
Hi Rod,
Nashorn allows only script objects (i.e., objects created by a JS
constructor or JS object literal expression) as scope expression for
"with" statement. Arbitrary objects like "context" (which is an instance
of javax.script.ScriptContext) can not be used as 'scope' expression for
'with'.
In jdk9, support has been added to support script objects mirror other
script engines or other globals (which are instances of ScriptObjectMirror).
What is ScriptObjectMirror?
it is java API for an underlying JS object (which is an instance of
ScriptObject).
For eg. you can a ScriptObjectMirror like this:
ScriptObjectMirror sobj = (ScriptObjectMirror) engine.eval("({ foo:
233 })");
More info here:
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes
Hope this helps,
-Sundar
On Friday 11 July 2014 12:49 PM, Rod Nim wrote:
> Dear Nashorn devs;
>
> I'm wanting to invoke a JS function that looks like this:
>
> function myFunc(context) {
> with(context) {
> return a + b;
> }
> }
>
> Where a and b are values my Java "context" object supplies.
>
> I've tried passing in "context" from Java (via Invocable) as a Map; and am getting:
>
> javax.script.ScriptException: TypeError: Cannot apply "with" to non script object in <eval>
>
> Fair enough. So I tried my own instance of JSObject but Nasorn isn't happy with that either, same exception.
>
> So myArg needs to be an instance of ScriptObjectMirror. But ScriptObjectMirror is final!
>
> Any way to get me out of his corner?
>
> Thank you in advance for your help. I know you're a very busy team and answering "user" questions like this is not a core priority, in fact I almost feel embarrassed to ask.
>
> Thanks again.
>
> Rod
More information about the nashorn-dev
mailing list