Как я могу передать карту из Java в graal.js? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть карта в Scala / Java, которую я хочу видеть в Javascript, работающей на движке graal.js.

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)
    }
}

Позже, функция Javascript в graal.js вызывается с помощью:

inv.invokeFunction(bindFn, args: _*) 

Где bindFn - это скомпилированная функция (ниже), а args - это 1-элементный список, содержащий мой объект Thing.

Javascript:

function(thing) {
  console.log(thing.d1);
  console.log(thing.d2);
  console.log(thing.d3);
  console.log(thing.d4);
  console.log(thing.foo());
}

Выход из объекта.foo () сработал, но все остальные разрешены в 'Foreign {}' в Javascript.Ни у одного из них нет значений на карте.

Как получить данные карты, созданные на JVM, видимые в коде JavaScript graal.js (желательно изначально в Javascript)?

1 Ответ

0 голосов
/ 22 мая 2019

Хорошо, на самом деле это похоже на Scala против Java. В Scala я могу успешно передать карту, если ее содержимое преобразуется в значение Graal. Без вопросов. Я могу успешно передать объект Scala (case или non-case) и вызвать методы для этого объекта, НО ... I не может получить доступ к элементам данных объекта, даже если все они имеют значение!

Если я создаю чистый класс Java, я могу получить доступ как к членам-данным, так и к методам этого класса в graal.

Не уверен, почему это так ... не относящийся к делу класс Scala должен в основном быть таким же, как класс Java, но, очевидно, есть некоторая разница, важная для graal.

К счастью, я думаю, что пока могу жить с разницей.

...