On 10/12/13 16:04, Attila Szegedi wrote:
Indeed. These objects aren't native JavaScript objects; they don't even implement JSObject or extend ScriptObject - they're host objects (just as any POJO technically is). Nashorn's execution model is such that it can handle objects of multiple kinds - native JS objects, POJOs, statics, etc. without ever wrapping them internally thanks to a variety of dynamic linkers it employs, so these objects don't have a wrapped representation. Just as you couldn't pass the result of "new java.util.ArrayList()" to a method expecting JSObject, neither can you pass the objects representing statics, as they don't have a wrapped JSObject representation. This is in general true for anything coming from the script host environment - in this case, the JVM.

If you want to opportunistically wrap in a mirror anything that can be wrapped in a mirror (and get a graceful NOP otherwise), declare your Java API to accept Object, and invoke ScriptUtils.wrap() explicitly - that'll wrap ScriptObject instances into mirrors, and return any other object unchanged.

Thanks, I adapted the code to use ScriptUtils.wrap() and encountered a strange situation where JSON.stringify returns undefined for a valid JS object. Maybe another scope problem?

Here is a reproducer: https://gist.github.com/purplefox/7893408

Basically I have two scripts:

In one I have a function which takes an argument and displays the result of JSON.stringify on it. The first script exports the function by calling a setFunction() method on a Java object which wraps the object using ScriptUtils as you suggested.

I then invoke another script in a different context and pass in the wrapped foo function and the script calls it, when it does the output is as follows:

Before call, conf stringified is {"f":"bar"}
config.f is bar
in foo, conf stringified is undefined

Weird!

Reply via email to