表單指令碼預算

每次表單指令碼求值都在涵蓋 CPU 時間、記憶體、遞迴深度、陳述式與運算計數,以及指令碼可能產生的輸出之嚴格預算下執行,因此失控的計算絕不會使重新計算的處理停滯或耗盡記憶體

THPDFScriptBudgets

THotPDF.FormScriptBudgets 持有 EvaluateLoadedFieldJavaScript 與每次重新計算處理套用的預算集合。此 THPDFScriptBudgets 記錄公開 MaxScriptLength、MaxStatements、MaxExpressionDepth、MaxOperations、MaxElapsedMilliseconds(牆鐘式 CPU 截止)、MaxValueBytes(單一值上限)、MaxTotalValueBytes(累積記憶體)與 MaxOutputBytes(產生輸出上限);任何欄位的零值都會解除該特定限制

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

強制與遙測

CPU 上限會在運算與值位元組累積的過程中持續檢查,所以腳本無法只靠配置記憶體來繞過;累計記憶體預算則能攔下大量配置又丟棄小型值的腳本。一旦超限,評估會失敗並附上描述性的 ErrorText,結果 record 除了運算次數外,還會回報 ElapsedMilliseconds 與 ValueBytes 遙測資料

預設預算保留歷史限制(8192 位元組指令碼、32 個陳述式、深度 32、1024 個運算、每個值 256 KB),並加入 500 ms 的 CPU 截止、4 MB 的累積記憶體預算與 64 KB 的輸出上限