Also, since you can theoretically extend the Java object (I think?) in Nashorn 
with dynamic properties, how could the runtime know that the missing property 
was a missing "built in" property/method on the object or a not-yet-or-never 
added property on the dynamic object?

-----Original Message-----
From: nashorn-dev [mailto:[email protected]] On Behalf Of 
Mike Rettig
Sent: Wednesday, September 03, 2014 11:30 AM
To: Hannes Wallnoefer
Cc: [email protected]
Subject: Re: Inconsistent missing property handling with java objects

There are a couple reasons why it is problematic for me. The java objects are 
not dynamic objects. The interface is static. Allowing silent failures leads to 
all sorts of time consuming and frustrating bugs. Nashorn doesn't wrap the java 
objects, so it should treat them like java objects.
Referencing an unknown property on a java object should fail (as it did in 
Rhino). The current behavior is the worst of both worlds. The java object is 
not wrapped so there are no extension points (e.g. __noSuchProperty___), but in 
the case of a missing property it behaves like a js object by silently failing.

Anyone know the reasoning behind this design decision?

Thanks,

Mike




On Wed, Sep 3, 2014 at 10:00 AM, Hannes Wallnoefer < 
[email protected]> wrote:

> Hi Mike,
>
> It was just a design decision to handle missing Java properties this 
> way in Nashorn.
>
> The behaviour is implemented in NashornBottomLinker.linkBean method.
> Unfortunately there's currently no way to configure Nashorn to behave 
> the way you want it to.
>
> Regards,
> Hannes
>
> Am 2014-09-03 um 16:13 schrieb Mike Rettig:
>
>  With nashorn, it seems that the assignment and accessing of missing
>> properties on java objects is handled as 'undefined'.
>>
>> Example:
>>
>>          String engine = "nashorn";
>>          ScriptEngineManager engineManager =
>>                  new ScriptEngineManager();
>>          final ScriptEngine nashorn = engineManager.getEngineByName( 
>> engine);
>>          nashorn.eval("var d=new java.util.Date();");
>>          nashorn.eval("d.badProp=1233");
>>          nashorn.eval("print(d.badProp)");
>>
>>
>> This will print 'undefined'. It doesn't fail on the 'badProp' on the 
>> Date object. With Rhino, this would fail on the assignment of the bad 
>> property with the following error:
>>
>> "Exception in thread "main" javax.script.ScriptException:
>> sun.org.mozilla.javascript.internal.EvaluatorException: Java class 
>> "java.util.Date" has no public instance field or method named "badProp".
>> (<Unknown source>#1) in <Unknown source> at line number 1"
>>
>> I want the script to fail when the bad property is referenced.  I've 
>> tried 'use strict', the rhino compatibility script, and attempting to 
>> define __noSuchProperty__ on the java object. I can create a wrapper 
>> object that simply delegates to the java object and throws if a 
>> property is undefined, but that seems excessive.
>>
>> Is this the correct behavior? Is there a way to work around this 
>> behavior in nashorn?
>>
>> Thanks,
>>
>> Mike
>>
>
>

Reply via email to