Runtime QuickJS con limiti

HPDFQuickJS e HPDFQuickJSStatic espongono la stessa API di valutazione JavaScript controllata dall'applicazione su Win32 e Win64

Scegliere la modalità di distribuzione

Il binding DLL accetta un percorso esplicito, il valore d'ambiente HOTPDF_QUICKJS_DLL o la directory della piattaforma trovata sotto un antenato eseguibile

Le build predefinite collocano il bridge in Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll o Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll

Su Linux x86-64, HPDFQuickJS carica il bridge nativo libhpdfquickjs.so compilato da tools/Build-HotPDFQuickJSLinux.sh; il percorso esplicito e la variabile d'ambiente seguono le stesse regole di ownership e ABI

Il discovery predefinito su Linux controlla la directory dell'eseguibile e Lib/thirdparty/QuickJS/bin/Linux64; il deployment statico OMF nativo resta specifico di Windows

Valutare uno 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 converte il valore JavaScript finale in testo UTF-8 e preserva Unicode quando restituisce una stringa Delphi

EvalInt e EvalFloat aggiungono una conversione numerica rigorosa senza esporre i valori dell'engine attraverso il confine ABI

Limiti di esecuzione

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

I default consentono 64 MiB di memoria dell'engine, uno stack di 64 KiB, uno script UTF-8 da 1 MiB, un secondo di tempo reale e un milione di interrupt check

Il runtime statico Win32 limita un budget di stack richiesto pari a zero o superiore a 48 KiB per restare dentro il confine di ricorsione sicuro per il compilatore; le modalità DLL e Win64 rispettano direttamente il valore richiesto

I limiti di memoria e stack valgono per l'intero runtime, mentre i limiti di script, tempo e interrupt si applicano a ogni valutazione

Stato e recupero

Una valutazione rifiutata o interrotta ripulisce la propria eccezione pending e i buffer, così la stessa istanza dell'engine può eseguire più avanti uno script valido

Un'istanza dell'engine non è rientrante; usa un'istanza per ogni worker concorrente

Scripting dei form XFA

Il motore di flattening XFA riusa questo runtime solo quando THotPDF.XFAJavaScriptEnabled è impostato esplicitamente; fornisce una facade dei dati ristretta, array nativi tipizzati, richieste di istanza validate e nessun oggetto file, processo, browser o network

TXFAFormScriptOptions.JavaScriptEvaluator può adattare il runtime statico senza forzare gli oggetti QuickJS statici dentro ogni applicazione HotPDF

Vedi FormCalc e JavaScript XFA con limiti

Build riproducibile del runtime

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

Lo script di build produce entrambi i set di oggetti statici e entrambe le DLL bridge dal sorgente in bundle, poi la matrice di runtime compila ed esercita le sonde statiche e DLL per Win32 e Win64