Dynamiczny FormCalc Eval
Eval(source) kompiluje dynamicznie dostarczone obliczenie natywnym kompilatorem FormCalc i wykonuje je przez ogólny host zdarzeń, gdy EnableJavaScript jest włączone
Źródło może zawierać wyrażenia, warunki, pętle, deklaracje zmiennych, lokalnie deklarowane funkcje i mutacje pól; ostatnie wyrażenie jest wynikiem, a nazwy wbudowane są niewrażliwe na wielkość liter
var source = "target + other"
target = Eval(source)
target = Eval("var n=2 for i=1 upto 4 do n=n*i endfor n")
Zakres i obiekty
Ref i przypisanie referencji są dostępne wewnątrz wyewaluowanych obliczeń, używając tych samych reguł jawnego uchwytu i zwykłej kopii wartości co wywołujące zdarzenie
Każde wyewaluowane obliczenie ma własne zmienne i funkcje; nie może odczytywać zmiennych ani funkcji zadeklarowanych przez wywołujące obliczenie
Bieżące pole, względne obiekty formularzy, $form, $host i $event pozostają dostępne; Eval(null) zwraca null, a inne argumenty skalarne stają się tekstem źródła
Wewnątrz predykatu SOM kandydat dostarcza bieżący kontekst pola albo subformularza, a zagnieżdżony Eval dziedziczy ten kontekst
Na przykład var secret=9 Eval("secret+1") zawodzi, gdy nie ma obiektu formularza o nazwie secret, podczas gdy Eval("var secret=2 secret+1") zwraca 3
Transakcje i replay
Pierwsze użycie źródła zawiesza wykonanie, by natywny kompilator wyprodukował swój JavaScript; host przywraca stan skryptu sprzed zdarzenia, dostarcza skompilowaną odpowiedź i ponawia obliczenie
Nagrane odpowiedzi transportu i locale są konsumowane podczas ponowienia, więc zagnieżdżona kompilacja nie powtarza zewnętrznych callbacków transportu
Tylko ostateczna udana ewaluacja wchodzi do dziennika skryptów; błędy składni, błędy runtime i niepowodzenia budżetu przywracają wartości pól, stan instancji i stan skryptu przez transakcję runtime
Eval działa też w rzeczywistych polach obliczanych i skryptach walidacji; SaveToBytes zachowuje zatwierdzone wartości dokumentu
Budżety
Każde zdarzenie dopuszcza co najwyżej 64 odrębne dynamiczne źródła, osiem zagnieżdżonych wywołań Eval i 2 MiB zagregowanych dynamicznych źródeń plus skompilowanych bajtów odpowiedzi; te granice obowiązują obok skonfigurowanych limitów wejścia skryptów, operacji, pamięci, stosu, dziennika i czasu
Skonfigurowany limit stosu albo czasu może zawieść przed dedykowaną granicą zagnieżdżenia albo żądań; ponowienia kompilacji współdzielą deadline zdarzenia
Własny ewaluator JavaScript nie może obsłużyć natywnych żądań dynamicznej kompilacji; użyj dostarczanej ścieżki wykonania QuickJS
Powiązane API
HPDFXFACompileFormCalcEvent, HPDFXFAExecuteJavaScriptEvent, FormCalc Functions i Interaktywny runtime XFA