Multi-threaded Nashorn: o.constructor === o.constructor gives false

≡放荡痞女 提交于 2019-12-24 04:09:14

问题


I'm experimenting with multi-threaded scripts loading and evaluation in Nashorn and get kind of shocking behavior:

// having some object o loaded in another thread
print(o.constructor === o.constructor); // false
print(o.constructor === Object); // false as well
print(o.foo === o.foo); // true - OK

How can this be possible within single script engine? o above is just an object created using object literal notation (in another thread). Printing o.constructor gives usual function Object() { [native code] };.

At the same time:

print({}.constructor === {}.constructor); // true

Any ideas?

Update

It turned out this was unrelated to multi-threading at all. See my answer below for details.


回答1:


It turned out this does not relate to multi-threading at all. Here is a simple Scala program which reproduces the problem:

object Test extends App {
  val engine = new ScriptEngineManager().getEngineByName("nashorn")
  var o = engine.eval("({ foo: 'bar' })")
  var result = engine.eval("(o.constructor === o.constructor)", new SimpleBindings() {
    put("o", o)
  })
  print(result) // false
}

I was using bindings parameter incorrectly. Instead, I should take existing bindings and update 'em in-place. I'm still not convinced this should result in o.constructor === o.constructor to be false, but at least it works now. Corrected version:

object Test extends App {
  val engine = new ScriptEngineManager().getEngineByName("nashorn")
  var o = engine.eval("({ foo: 'bar' })")

  val bindings =  engine.getBindings(ScriptContext.ENGINE_SCOPE)
  bindings.put("o", o)

  var result = engine.eval("(o.constructor === o.constructor)", bindings)
  print(result) // true
}


来源:https://stackoverflow.com/questions/27324802/multi-threaded-nashorn-o-constructor-o-constructor-gives-false

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!