Bounded QuickJS Runtime
HPDFQuickJS a HPDFQuickJSStatic vystavují stejné aplikačně řízené rozhraní pro vyhodnocování JavaScriptu na Win32 a Win64
Choose a deployment mode
HPDFQuickJSnačítá ABI-neutrální přemosťovacíquickjs.dlla uchovává hodnoty QuickJS uvnitř kódu CHPDFQuickJSStaticpropojuje platformně specifické objekty OMF do aplikace a nevyžaduje žádnou runtime DLL- Nezahrnujte do jednoho programu obě jednotky, protože publikují stejná veřejná jména typů
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
qjsSuccesshlásí převedený výsledekqjsScriptErrorhlásí chyby syntaxe, vyhozené hodnoty a chyby převoduqjsTimeLimitaqjsInterruptLimitrozlišují dva rozpočty prováděníqjsBusy,qjsInvalidArgument,qjsResourceErroraqjsUnavailablezachovávají selhání infrastruktury
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