我在 Scala/Java 中有一个 Map 我希望在 graal.js 引擎上运行的 Javascript 中可见。
case class Thing() {
def foo() { println("FOO!") } // just to see if this is callable from js (it is)
val m = Map("foo" -> "bar", "one" -> 1)
val d1 = m
val d2 = m.asJava
val d3 = toGraalValue(m)
val d4 = MapProxyObject(m.map { case (k, v) => (k.toString, toGraalValue(v)) })
def toGraalValue(a: Any): Value =
a match {
case s: List[_] => Value.asValue(ListProxyArray(s.map(toGraalValue).toArray))
case m: Map[_, _] => Value.asValue(MapProxyObject(m.map { case (k, v) => (k.toString, toGraalValue(v)) }))
case _ => Value.asValue(a)
}
}
后来,graal.js 中的一个 Javascript 函数被调用:
inv.invokeFunction(bindFn, args: _*)
其中 bindFn 是一个编译函数(如下),而 args 是一个包含我的 Thing 对象的 1 元素列表。
Javascript:
function(thing) {
console.log(thing.d1);
console.log(thing.d2);
console.log(thing.d3);
console.log(thing.d4);
console.log(thing.foo());
}
thing.foo() 的输出有效,但所有其他输出在 Javascript 中解析为“foreign {}”。它们在地图中都没有任何值。
如何获取在 graal.js Javascript 代码(最好是原生到 Javascript)中可见的 JVM 上创建的 Map 数据?