Looks like a reasonable compromise!

+1

-Sundar


On 6/15/2016 8:50 PM, Hannes Wallnöfer wrote:
> I’ve uploaded a new webrev that reintroduces the Global.initscontext field 
> instead of reusing the current context thread local so it will behave the 
> same from all threads. Please review.
>
> http://cr.openjdk.java.net/~hannesw/8150219/webrev.01/
>
> Thanks,
> Hannes
>
>
>> Am 14.06.2016 um 10:22 schrieb Hannes Wallnöfer 
>> <hannes.wallnoe...@oracle.com>:
>>
>> Thanks for the comments, Sundar.
>>
>> I agree that using the existing ScriptContext thread local is a bit of a 
>> hack. I chose this path because it allowed me to keep the changes minimal 
>> and fix the problem for the most predominant and reasonable use case.
>>
>> What I absolutely do not agree with is to have a method to evaluate a script 
>> with a non-default ScriptContext and then ignore that ScriptContext on 
>> invocation of a function obtained from that evaluation. This breaks about 
>> every assumption a somewhat experienced JavaScript developer would have, and 
>> it also is a regression against JDK up to u71. 
>>
>> Note that my change does not go back to the behavior of pre-u72, so engine’s 
>> default ScriptContext is still used for all globals created the „normal“ way 
>> (e.g. using NashornScriptEngine.createBindings method, or the default global 
>> created in NashornScriptEngine constructor). The only case we set the engine 
>> this way is for evals with a non-default ScriptEngine which does not already 
>> have a Nashorn global. This is of course also reflected by the tests you 
>> added for JDK-8138616 still passing.
>>
>> I hope we can find some common ground here.
>>
>> Hannes
>>
>>
>>> Am 14.06.2016 um 04:32 schrieb Sundararajan Athijegannathan 
>>> <sundararajan.athijegannat...@oracle.com>:
>>>
>>> Sorry, I'm not sure I'm comfortable with this fix :(
>>>
>>> Global.setScriptContext sets the ScriptContext for the *current thread*
>>> [because that Global class methods set thread local]. This means that
>>> this ReferenceError goes away only for the thread in a new Global is
>>> created and associated with that ScriptContext. For other threads,
>>> you'll continue to get ReferenceError.
>>>
>>> The root of the issue is the Invocable's methods are expected to use the
>>> default ScriptContext. That means that if you eval code or put globals
>>> in  another ScriptContext, you can't do Invocable calls on it! That is
>>> the limitation of javax.script. While eval's have ScriptContext,
>>> Bindings accepting variants, there are no similar methods exists for
>>> Invocable and Compilable. These two use script engine's default
>>> ScriptContext!
>>>
>>> BTW, there is clear Nashorn alternative - which is to use
>>> jdk.scripting.api.scripting.ScriptObjectMirror's call or eval method.
>>> These take care of using the right global in which the function was
>>> defined - lexical scoping is respected as expected!
>>>
>>> Besides the current "fix" works only the particular thread which feels
>>> wrong as well.
>>>
>>> -Sundar
>>>
>>> On 6/14/2016 1:04 AM, Attila Szegedi wrote:
>>>> +1
>>>>
>>>>> On 13 Jun 2016, at 18:56, Hannes Wallnöfer <hannes.wallnoe...@oracle.com> 
>>>>> wrote:
>>>>>
>>>>> Please review 8150219: ReferenceError in 1.8.0_72:
>>>>>
>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8150219
>>>>> Webrev: http://cr.openjdk.java.net/~hannesw/8150219/webrev.00/
>>>>>
>>>>> This is a bit of a compromise that partially restores the behavior we had 
>>>>> before JDK-8138616 by associating a ScriptContext with a Nashorn Global, 
>>>>> but only in the very specific case where a script is evaluated with a 
>>>>> non-default ScriptContext that does not have a Nashorn Global yet, and 
>>>>> the Global is created for that specific ScriptContext. Also, we use the 
>>>>> existing setScriptContext method and ThreadLocal field in Global instead 
>>>>> of introducing an extra field as we had it before. 
>>>>>
>>>>> The purpose is to make functions obtained from such globals use the 
>>>>> ScriptContext they were evaluated with. 
>>>>>
>>>>> Thanks,
>>>>> Hannes
>>>>>

Reply via email to