Budgets für Formskripte

Jede Auswertung eines Formskripts unterliegt strikten Budgets für CPU-Zeit, Speicher, Rekursionstiefe, Anzahl von Anweisungen und Operationen sowie die von einem Skript erzeugte Ausgabe, sodass eine außer Kontrolle geratene Berechnung keinen Neuberechnungsdurchlauf anhalten oder Speicher erschöpfen kann

THPDFScriptBudgets

THotPDF.FormScriptBudgets enthält den Budgetsatz für EvaluateLoadedFieldJavaScript und jeden Neuberechnungsdurchlauf. Der Record THPDFScriptBudgets stellt MaxScriptLength, MaxStatements, MaxExpressionDepth, MaxOperations, MaxElapsedMilliseconds (CPU-Grenze nach Wanduhr), MaxValueBytes (Grenze eines einzelnen Werts), MaxTotalValueBytes (kumulativer Speicher) und MaxOutputBytes (Grenze erzeugter Ausgabe) bereit; Null hebt jeweils diese bestimmte Grenze auf

var
  Budgets: THPDFScriptBudgets;
begin
  Budgets:= PDF.FormScriptBudgets;
  Budgets.MaxElapsedMilliseconds:= 250;
  PDF.FormScriptBudgets:= Budgets;
end;

Durchsetzung und Telemetrie

Die CPU-Grenze wird geprüft, während sich Operationen und Wert-Bytes summieren, also können Skripte sie nicht allein durch Allozierung umgehen; das kumulative Speicherbudget erwischt Skripte, die viele kleine Werte allozieren und wieder verwerfen. Eine Überschreitung lässt die Auswertung mit einem aussagekräftigen ErrorText fehlschlagen, und der Ergebnisrecord meldet neben der Operationsanzahl die Telemetrie aus ElapsedMilliseconds und ValueBytes

Eine Budgetüberschreitung beendet nur die betreffende Skriptauswertung und liefert eine Diagnose, ohne bereits bestätigte Feldwerte zu veröffentlichen