表单脚本预算

每次表单脚本求值都在严格预算下运行,覆盖 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;结果记录中除操作计数外,还带有 ElapsedMilliseconds 和 ValueBytes 遥测数据

默认预算保留历史限制(8192 字节脚本、32 条语句、深度 32、1024 次操作、每值 256 KB),并新增 500 ms CPU 截止、4 MB 累积内存预算和 64 KB 输出上限