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
HPDFQuickJScarica il bridgequickjs.dllABI-neutrale e tiene i valori QuickJS dentro il codice CHPDFQuickJSStaticlinka gli oggetti OMF specifici della piattaforma nell'applicazione e non richiede nessuna DLL a runtime- Non includere entrambe le unit in un solo programma perché pubblicano gli stessi nomi di tipi pubblici
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
qjsSuccesssegnala un risultato convertitoqjsScriptErrorsegnala errori di sintassi, valori thrown e fallimenti di conversioneqjsTimeLimiteqjsInterruptLimitdistinguono i due budget di esecuzioneqjsBusy,qjsInvalidArgument,qjsResourceErroreqjsUnavailablepreservano i fallimenti dell'infrastruttura
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