Budżety skryptów formularza

Każda ocena skryptu formularza działa pod ścisłymi budżetami obejmującymi czas CPU, pamięć, głębokość rekurencji, liczbę instrukcji i operacji oraz wyjście, które skrypt może generować, więc niekontrolowane obliczenie nigdy nie może zablokować przebiegu przeliczania ani wyczerpać pamięci

THPDFScriptBudgets

THotPDF.FormScriptBudgets przechowuje zestaw budżetów stosowanych przez EvaluateLoadedFieldJavaScript i przez każdy przebieg przeliczania. Rekord THPDFScriptBudgets wystawia MaxScriptLength, MaxStatements, MaxExpressionDepth, MaxOperations, MaxElapsedMilliseconds (odcięcie CPU wg czasu ściennego), MaxValueBytes (limit pojedynczej wartości), MaxTotalValueBytes (skumulowana pamięć) i MaxOutputBytes (limit generowanego wyjścia); zero w dowolnym polu zdejmuje ten konkretny limit

var
  Budgets: THPDFScriptBudgets;
begin
  Budgets:= PDF.FormScriptBudgets;
  Budgets.MaxElapsedMilliseconds:= 100;
  Budgets.MaxTotalValueBytes:= 1024* 1024;
  PDF.FormScriptBudgets:= Budgets;
end;

Egzekwowanie i telemetria

Odcięcie CPU jest sprawdzane, gdy gromadzą się operacje i bajty wartości, więc skrypty nie mogą go ominąć samą alokacją; skumulowany budżet pamięci wyłapuje skrypty, które alokują i odrzucają wiele małych wartości. Naruszenie nieudolnie kończy ocenę z opisowym ErrorText, a rekord wyniku raportuje telemetrię ElapsedMilliseconds i ValueBytes obok liczby operacji

Domyślne budżety zachowują historyczne limity (skrypty 8192 bajtów, 32 instrukcje, głębokość 32, 1024 operacje, 256 KB na wartość) oraz dodają odcięcie CPU 500 ms, skumulowany budżet pamięci 4 MB i limit wyjścia 64 KB