境界付き QuickJS ランタイム
HPDFQuickJS と HPDFQuickJSStatic は、Win32 と Win64 で同じアプリケーション制御の JavaScript 評価 API を公開します
展開モードの選択
HPDFQuickJSは ABI 中立のquickjs.dllブリッジをロードし、QuickJS 値を C コード内に保持しますHPDFQuickJSStaticはプラットフォーム固有の OMF オブジェクトをアプリケーションにリンクし、ランタイム DLL を必要としません- 同じ公開型名を公開するため、1 つのプログラムに両方のユニットを含めないでください
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 モードは要求値を直接尊重します
メモリとスタックの制限はランタイム全体であり、スクリプト、時間、割り込み制限は各評価に適用されます
ステータスと回復
qjsSuccessは変換された結果を報告しますqjsScriptErrorは構文エラー、スローされた値、変換失敗を報告しますqjsTimeLimitとqjsInterruptLimitは 2 つの実行予算を区別しますqjsBusy、qjsInvalidArgument、qjsResourceError、qjsUnavailableはインフラストラクチャ失敗を保持します
拒否または中断された評価は保留中の例外とバッファをクリアするため、同じエンジンインスタンスが後の有効なスクリプトを実行できます
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 のプローブをコンパイルして実行します