境界付き QuickJS ランタイム

HPDFQuickJS と HPDFQuickJSStatic は、Win32 と Win64 で同じアプリケーション制御の JavaScript 評価 API を公開します

展開モードの選択

DLL バインディングは、明示的なパス、HOTPDF_QUICKJS_DLL 環境値、または実行ファイル祖先の下にあるプラットフォームディレクトリを受け入れます

デフォルトビルドは、ブリッジを Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll または Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll に配置します

Linux x86-64 では、HPDFQuickJS が tools/Build-HotPDFQuickJSLinux.sh でビルドされたネイティブの libhpdfquickjs.so ブリッジをロードします。明示的なパスも環境変数も、同じ所有権と ABI 規則に従います

Linux のデフォルト探索は実行ファイルディレクトリと Lib/thirdparty/QuickJS/bin/Linux64 を確認します。ネイティブ静的 OMF 配置は Windows 固有のままです

スクリプトの評価

uses
  HPDFQuickJS;

var
  Engine: THPDFQuickJS;
  EvalResult: THPDFQuickJSResult;
begin
  Engine := THPDFQuickJS.Create;
  try
    if not Engine.Available then
      raise Exception.Create(Engine.LoadError);
    EvalResult := Engine.Eval('JSON.stringify([1, 2, 3].map(x => x * 2))');
    if not EvalResult.Success then
      raise Exception.Create(EvalResult.Error);
  finally
    Engine.Free;
  end;
end;

Eval は最終的な JavaScript 値を UTF-8 テキストに変換し、Delphi 文字列を返すときに Unicode を保持します

EvalInt と EvalFloat は、ABI 境界を越えてエンジン値を公開せずに厳密な数値変換を追加します

実行制限

Limits := THPDFQuickJSLimits.CreateDefault;
Limits.MemoryBytes := 32 * 1024 * 1024;
Limits.StackBytes := 64 * 1024;
Limits.MaxScriptBytes := 256 * 1024;
Limits.TimeoutMs := 250;
Limits.MaxInterruptChecks := 250000;
Engine := THPDFQuickJS.Create(Limits);

デフォルトは、64 MiB のエンジンメモリ、64 KiB のスタック、1 MiB の UTF-8 スクリプト、1 秒のウォール時間、100 万回の割り込みチェックを許可します

Win32 静的ランタイムは、コンパイラ安全な再帰境界内に留まるために、ゼロ以上の要求スタック予算を 48 KiB に上限します。DLL と Win64 モードは要求値を直接尊重します

メモリとスタックの制限はランタイム全体であり、スクリプト、時間、割り込み制限は各評価に適用されます

ステータスと回復

拒否または中断された評価は保留中の例外とバッファをクリアするため、同じエンジンインスタンスが後の有効なスクリプトを実行できます

1 つのエンジンインスタンスは再入可能ではありません。並行ワーカーごとに 1 つのインスタンスを使用してください

XFA フォームスクリプティング

XFA フラット化エンジンは、THotPDF.XFAJavaScriptEnabled が明示的に設定された場合にのみこのランタイムを再利用します。制限付きデータファサード、ネイティブ型付き配列、検証済みインスタンス要求を提供し、ファイル、プロセス、ブラウザ、ネットワークオブジェクトは提供しません

TXFAFormScriptOptions.JavaScriptEvaluator は、すべての HotPDF アプリケーションに静的 QuickJS オブジェクトを強制せずに静的ランタイムを適応させることができます

境界付き XFA FormCalc と JavaScript を参照してください

再現可能なランタイムビルド

powershell -ExecutionPolicy Bypass -File Lib\thirdparty\build-quickjs-runtime.ps1

ビルドスクリプトは、バンドルされたソースから両方の静的オブジェクトセットと両方のブリッジ DLL を生成し、ランタイムマトリックスは Win32 と Win64 の静的と DLL のプローブをコンパイルして実行します