By design, JSObject properties are either Strings or integers.  When you use

   jsobj.foo = 33

or

   jsobj["foo"] = 33

JSObject.setMember(String, Object) method will be called for the same by Nashorn's linker. If you use

   jobj[1] = 33;

then JSObject.setSlot(int, Object) method will be called

If you use anything else as property (say a script object as in your example), that would be ignored.

Hope this explains,
-Sundar

Serguei Mourachov wrote:
On 11/6/2014 8:22 AM, A. Sundararajan wrote:
Will you please post full source of your JSObject? (just enough to reproduce issue you're talking about).

-Sundar

On Wednesday 05 November 2014 05:14 AM, Serguei Mourachov wrote:
It looks like some operations that are available for native Nashorn objects, are not implemented for JSObject. For example, following script works and prints '6': engine.eval("var obj={};var key={}; obj[key]=6;print(obj[key])"); In case when 'obj' is an implementation of JSObject, the script runs without any error, printing 'null'.

SM



here is the sample code:

    public static void main(String[] args) throws Exception {
NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
        ScriptEngine engine = factory.getScriptEngine();

        Bindings b = engine.getBindings(ScriptContext.ENGINE_SCOPE);

        AbstractJSObject jsobj = new AbstractJSObject(){
            Map<String, Object> map = new HashMap<>();

            @Override
            public void setMember(String name, Object value) {
                map.put(name, value);
            }

            @Override
            public Object getMember(String name) {
                return map.get(name);
            }

            @Override
            public void removeMember(String name) {
                map.remove(name);
            }

            @Override
            public boolean hasMember(String name) {
                return map.containsKey(name);
            }
        };
        b.put("jsobj", jsobj);
engine.eval("var obj={}; var key={}; obj[key]=6;print(obj[key])");
        engine.eval("jsobj[key]=6;print(jsobj[key])");

    }

if you replace var key={} with var key='foo' the code works as expected

SM



Reply via email to