Создание собственных объектов Rhinoscript из Java / Scala - PullRequest
1 голос
/ 19 декабря 2011

Я пытаюсь улучшить производительность оценщика фрагмента JavaScript . Эти фрагменты сценария могут ссылаться на любое количество переменных, которые существуют в карте строковых ключей json-подобных графов объектов (IE: Json AST). Я использую JDK 1.6 и встроенный движок Rhinoscript (v1.6R2).

В настоящее время обработка принимает форму:

  1. Фрагмент разбирается для обнаружения имен переменных, на которые ссылаются
  2. Переменные извлекаются из карты и сериализуются в строку json
  3. Строка Json присваивается переменной с аналогичным именем в начале скрипта
  4. Оценить дополненный скрипт

Я пытаюсь выяснить, как пропустить этап сериализации json и создать прямые нативные объекты Rhinoscript для размещения в «привязках» для сценария. Тогда желаемыми шагами будут:

  1. Фрагмент разбирается для обнаружения имен ссылочных переменных
  2. Переменные извлекаются из карты и преобразуются в собственные эквиваленты Rhinoscript
  3. Родные объекты помещены в привязки
  4. Оценка оригинального сценария с указанными привязками

Знаете ли вы , где я мог бы найти документацию или примеры того, как создавать экземпляры нативных объектов rhinoscript?

Мой проект обучения scala может быть полезен, если вы хотите возиться. И любой ответ, который я приду, должен появиться и там ...

http://subversion.assembla.com/svn/freshcode_public/learn_scala/datastore/src/test/scala/pkg/script

Заранее спасибо.

1 Ответ

2 голосов
/ 22 декабря 2011

Итак, после долгих хлопот я нашел адекватное решение, хотя оно не дало ожидаемого увеличения производительности (только на 10% быстрее).

Решение относится к Scala / Lift / Json и содержится в файле ScriptingUtil.scala .

Подведем итог:

  1. Context.javaToJs (), похоже, работает не во всех случаях. (* 1 010 *)
  2. Требуется объект 'scope' типа Scriptable. Решение, которое я придумал, не очень красиво, но оно работает.
  3. Чтобы создать NativeArray:

    val na = new NativeArray(arr)
    na.setPrototype(ScriptableObject.getClassPrototype(scope, "Array"))
    
...