Begrenzte QuickJS-Laufzeit

HPDFQuickJS und HPDFQuickJSStatic machen auf Win32 und Win64 dieselbe anwendungsgesteuerte JavaScript-Auswertungs-API zugänglich

Einen Bereitstellungsmodus wählen

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

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