Begrenzte QuickJS-Laufzeit
HPDFQuickJS und HPDFQuickJSStatic machen auf Win32 und Win64 dieselbe anwendungsgesteuerte JavaScript-Auswertungs-API zugänglich
Einen Bereitstellungsmodus wählen
HPDFQuickJSlädt die ABI-neutralequickjs.dll-Brücke und hält QuickJS-Werte innerhalb des C-CodesHPDFQuickJSStaticverknüpft die plattformspezifischen OMF-Objekte in die Anwendung und benötigt keine Laufzeit-DLL- Nehmen Sie beide Units nicht in ein Programm auf, da sie dieselben öffentlichen Typnamen veröffentlichen
Die DLL-Bindung akzeptiert einen expliziten Pfad, den Umgebungs-Wert HOTPDF_QUICKJS_DLL oder das Plattformverzeichnis, das unterhalb eines ausführbaren Vorfahren gefunden wird
Standardbuilds platzieren die Brücke unter Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll oder Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll
Auf Linux x86-64 lädt HPDFQuickJS die native libhpdfquickjs.so-Brücke, die tools/Build-HotPDFQuickJSLinux.sh baut; expliziter Pfad und Umgebungsvariable folgen denselben Besitz- und ABI-Regeln
Die Linux-Standarderkennung prüft das Verzeichnis der ausführbaren Datei und Lib/thirdparty/QuickJS/bin/Linux64; die native statische OMF-Bereitstellung bleibt Windows-spezifisch
Ein Skript auswerten
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 konvertiert den endgültigen JavaScript-Wert in UTF-8-Text und bewahrt Unicode, wenn ein Delphi-String zurückgegeben wird
EvalInt und EvalFloat fügen eine strikte numerische Konvertierung hinzu, ohne Engine-Werte über die ABI-Grenze offenzulegen
Ausführungsgrenzen
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);
Die Standardwerte erlauben 64 MiB Engine-Speicher, einen 64-KiB-Stack, ein 1-MiB-UTF-8-Skript, eine Sekunde Wanduhrzeit und eine Million Interrupt-Prüfungen
Die Win32-Statiklaufzeit deckelt ein Stack-Budget von null oder mehr auf 48 KiB, um innerhalb der compilersicheren Rekursionsgrenze zu bleiben; DLL- und Win64-Modi honorieren den angeforderten Wert direkt
Speicher- und Stack-Grenzen gelten laufzeitweit, während Skript-, Zeit- und Interrupt-Grenzen auf jede Auswertung angewendet werden
Status und Wiederherstellung
qjsSuccessmeldet ein konvertiertes ErgebnisqjsScriptErrormeldet Syntaxfehler, geworfene Werte und KonvertierungsfehlerqjsTimeLimitundqjsInterruptLimitunterscheiden die beiden AusführungsbudgetsqjsBusy,qjsInvalidArgument,qjsResourceErrorundqjsUnavailablebewahren Infrastrukturfehler
Eine abgewiesene oder unterbrochene Auswertung löscht ihre ausstehende Ausnahme und ihre Puffer, sodass dieselbe Engine-Instanz ein späteres gültiges Skript ausführen kann
Eine Engine-Instanz ist nicht reentrant; verwenden Sie eine Instanz pro parallelem Worker
XFA-Formularskripting
Die XFA-Flattening-Engine verwendet diese Laufzeit nur wieder, wenn THotPDF.XFAJavaScriptEnabled explizit gesetzt ist; sie liefert eine eingeschränkte Daten-Fassade, native typisierte Arrays, validierte Instanzanforderungen und keine Datei-, Prozess-, Browser- oder Netzobjekte
TXFAFormScriptOptions.JavaScriptEvaluator kann die statische Laufzeit anpassen, ohne statische QuickJS-Objekte in jede HotPDF-Anwendung zu erzwingen
Siehe Begrenztes XFA FormCalc und JavaScript
Reproduzierbarer Laufzeit-Build
powershell -ExecutionPolicy Bypass -File Lib\thirdparty\build-quickjs-runtime.ps1
Das Build-Skript erzeugt beide statischen Objektsätze und beide Brücken-DLLs aus der gebündelten Quelle, dann kompiliert die Laufzeit-Matrix statische und DLL-Sonden für Win32 und Win64 und führt sie aus