Differences between Rhino and Nashorn when using Bindings.remove(x)

Eric Woudenberg eaw at woudy.org
Mon May 12 04:44:01 UTC 2014


It appears that in Rhino, doing "myvar = undefined" is the same as doing 
EngineBindings.remove(myvar), however in Nashorn the 
EngineBindings.remove() operation behaves quite differently.

I've attached a Jython program that I've run under jdk7 and jdk8 that 
point up the differences (in /RED italics/):

>      JAVA 7 (RHINO) JAVA 8 (NASHORN)
>
Case 1: No longer able to store a value after Bindings.remove().
> +----Expr "myvar = 33" +----Expr "myvar = 33"
>
>   myvar = 33                              myvar = 33
>   Bindings.remove(myvar)                  Bindings.remove(myvar)
>     Engine.eval('myvar'): FAILED            Engine.eval('myvar'): FAILED
>     typeof(myvar)=undefined typeof(myvar)=undefined
>     myvar in bindings: False                myvar in bindings: False
>   myvar = 33                              myvar = 33
> /Engine.eval('myvar'): 33                Engine.eval('myvar'): FAILED//
> //    typeof(myvar)=number typeof(myvar)=undefined//
> //    myvar in bindings: True                 myvar in bindings: False/
>
Case 2: Bindings.remove() does not remove the value.
> +----Expr "var myvar=33" +----Expr "var myvar=33"
>
>   var myvar=33                            var myvar=33
> Bindings.remove(myvar) Bindings.remove(myvar)
> /Engine.eval('myvar'): FAILED Engine.eval('myvar'): 33//
> //    typeof(myvar)=undefined typeof(myvar)=number//
> //    myvar in bindings: False                myvar in bindings: True/
>   var myvar=33                            var myvar=33
>     Engine.eval('myvar'): 33                Engine.eval('myvar'): 33
>     typeof(myvar)=number                    typeof(myvar)=number
>     myvar in bindings: True                 myvar in bindings: True

We previously used Bindings.remove('myvar') and could not understand 
Nashorn's behavior. We've switched to using "myvar = undefined" and 
everything seems fine now.

Nonetheless, can someone explain why doing Bindings.remove("var") shows 
this behavior?

Thank you,
Eric Woudenberg

-------------- next part --------------
# Investigate the funny behavior of remove

from javax.script import ScriptEngineManager, ScriptContext

#from java.lang import System
#System.setProperty('nashorn.args','--global-per-engine')

def show(ref):
    try:
        print "    Engine.eval('%s'):" % ref, Engine.eval('%s' % ref) 
    except:
        print "FAILED"
    print '    typeof(%s)=%s' % (ref, Engine.eval('typeof(%s)' % ref))
    print '    myvar in bindings:', 'myvar' in Bindings

def run_setundefined(expr, ref):
    print '\n  %s' % expr
    Engine.eval(expr, Bindings)

    Engine.eval('%s=undefined' % ref)
    print "  %s=undefined" % ref
    show(ref)

    Engine.eval(expr, Bindings)
    print '  %s' % expr
    show(ref)
    
def run_removebinding(expr, ref):
    print '\n  %s' % expr
    Engine.eval(expr, Bindings)
    #show(ref)

    Bindings.remove(ref)
    print "  Bindings.remove(%s)" % ref
    show(ref)

    Engine.eval(expr, Bindings)
    print '  %s' % expr
    show(ref)
    
def main():
    global Engine, Bindings
    Engine = ScriptEngineManager().getEngineByName("JavaScript")

    ref =  'myvar'
    sequence = 'myvar = 33', 'var myvar=33', 'this.myvar = 33'
    print '********** using Bindings.remove(myvar) **********'
    for expr in sequence:
        Bindings = Engine.createBindings()
        Engine.setBindings(Bindings, ScriptContext.ENGINE_SCOPE)
        print '\n+----Expr "%s"' % expr
        run_removebinding(expr, ref)

    print '\n********** using "myvar = undefined" **********'
    for expr in sequence:
        Bindings = Engine.createBindings()
        Engine.setBindings(Bindings, ScriptContext.ENGINE_SCOPE)
        print '\n+----Expr "%s" Ref %s ' % (expr, ref)
        run_setundefined(expr, ref)


main()




More information about the nashorn-dev mailing list