Bounded QuickJS Runtime

HPDFQuickJS a HPDFQuickJSStatic vystavují stejné aplikačně řízené rozhraní pro vyhodnocování JavaScriptu na Win32 a Win64

Choose a deployment mode

Vazba DLL přijímá explicitní cestu, hodnotu prostředí HOTPDF_QUICKJS_DLL nebo adresář platformy nalezený pod spustitelným předkem

Výchozí sestavení umístí přemostění do Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll nebo Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll

Na Linuxu x86-64 načítá HPDFQuickJS nativní přemostění libhpdfquickjs.so sestavené tools/Build-HotPDFQuickJSLinux.sh; explicitní cesta i proměnná prostředí se řídí stejnými pravidly vlastnictví a ABI

Linuxové defaultní vyhledávání kontroluje adresář executable i Lib/thirdparty/QuickJS/bin/Linux64; nasazení nativních statických OMF zůstává specifické pro Windows

Evaluate a script

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 převede konečnou hodnotu JavaScriptu na text UTF-8 a při vrácení řetězce Delphi zachovává Unicode

EvalInt a EvalFloat přidávají přísný numerický převod bez vystavení hodnot enginu přes hranici ABI

Execution limits

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);

Výchozí hodnoty umožňují 64 MiB paměti enginu, zásobník 64 KiB, skript UTF-8 o velikosti 1 MiB, jednu sekundu stěnového času a milion kontrol přerušení

Win32 statický runtime omezuje nulový nebo větší požadovaný rozpočet zásobníku na 48 KiB, aby zůstal uvnitř kompilátorově bezpečné hranice rekurze; režimy DLL a Win64 respektují požadovanou hodnotu přímo

Limity paměti a zásobníku platí pro celý runtime, zatímco limity skriptu, času a přerušení se aplikují na každé vyhodnocení

Status and recovery

Odmítnuté nebo přerušené vyhodnocení vymaže své čekající výjimky a vyrovnávací paměti, takže stejná instance enginu může spustit pozdější platný skript

Jedna instance enginu není reentrantní; použijte jednu instanci na souběžného pracovníka

XFA form scripting

Engine pro zploštění XFA tento runtime znovu používá pouze tehdy, když je THotPDF.XFAJavaScriptEnabled explicitně nastaveno; dodává omezenou datovou fasádu, nativní typovaná pole, ověřené požadavky instancí a žádné objekty souborů, procesů, prohlížečů ani sítě

TXFAFormScriptOptions.JavaScriptEvaluator může přizpůsobit statický runtime bez vynucení statických objektů QuickJS v každé aplikaci HotPDF

Viz Bounded XFA FormCalc and JavaScript

Reproducible runtime build

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

Skript sestavení vytvoří ze svázaného zdroje obě sady statických objektů a obě přemosťovací DLL, poté matice runtime zkompiluje a otestuje statické i DLL sondy pro Win32 a Win64