Динамический FormCalc Eval

Eval(source) компилирует динамически переданное вычисление нативным компилятором FormCalc и выполняет его через общий хост событий, когда включён EnableJavaScript

Исходник может содержать выражения, условные конструкции, циклы, объявления переменных, локально объявленные функции и мутации полей; результат — последнее выражение, а встроенные имена нечувствительны к регистру

var source = "target + other"
target = Eval(source)
target = Eval("var n=2 for i=1 upto 4 do n=n*i endfor n")

Область видимости и объекты

Ref и присваивание ссылок доступны внутри вычисляемых выражений с теми же правилами явного дескриптора и обычного копирования значений, что и у вызывающего события

У каждого вычисления свои переменные и функции; оно не может читать переменные или функции, объявленные вызывающим вычислением

Текущее поле, относительные объекты формы, $form, $host и $event остаются доступны; Eval(null) возвращает null, а прочие скалярные аргументы становятся исходным текстом

Внутри предиката SOM кандидат задаёт контекст текущего поля или subform, и вложенный Eval наследует этот контекст

Например, var secret=9 Eval("secret+1") падает, когда нет объекта формы с именем secret, а Eval("var secret=2 secret+1") возвращает 3

Транзакции и повтор

Первое использование исходника приостанавливает выполнение, чтобы нативный компилятор выдал свой JavaScript; хост восстанавливает состояние скрипта до события, передаёт скомпилированный ответ и повторяет вычисление

Записанные ответы транспорта и локали потребляются при повторе, поэтому вложенная компиляция не повторяет внешние callback транспорта

В журнал скриптов попадает только финальное успешное вычисление; синтаксические и runtime-ошибки и сбои бюджета восстанавливают значения полей, состояние экземпляров и состояние скрипта через транзакцию runtime

Eval работает и внутри реальных вычисляемых полей и скриптов валидации; SaveToBytes сохраняет зафиксированные значения документа

Бюджеты

Каждое событие допускает не более 64 различных динамических исходников, восьми вложенных вызовов Eval и 2 МиБ суммарных динамических исходников плюс байтов скомпилированных ответов; эти границы действуют вместе с настроенными лимитами скриптового ввода, операций, памяти, стека, журнала и времени

Настроенный лимит стека или времени может сработать раньше выделенных границ вложенности или запросов; повторы компиляции делят дедлайн события

Пользовательский вычислитель JavaScript не может обслуживать запросы нативной динамической компиляции; используйте поставляемый путь выполнения QuickJS

Связанные API

HPDFXFACompileFormCalcEvent, HPDFXFAExecuteJavaScriptEvent, Функции FormCalc и Интерактивный XFA runtime