Runtime QuickJS acotado
HPDFQuickJS y HPDFQuickJSStatic exponen la misma API de evaluación JavaScript controlada por la aplicación en Win32 y Win64
Elección del modo de despliegue
HPDFQuickJScarga el bridgequickjs.dllneutral en ABI y mantiene los valores de QuickJS dentro del código CHPDFQuickJSStaticenlaza los objetos OMF específicos de plataforma dentro de la aplicación y no requiere DLL de runtime- No incluya ambas unidades en un mismo programa porque publican los mismos nombres de tipos públicos
El binding por DLL acepta una ruta explícita, el valor de entorno HOTPDF_QUICKJS_DLL o el directorio de plataforma encontrado bajo un ancestro del ejecutable
Las builds por defecto colocan el bridge en Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll o Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll
En Linux x86-64, HPDFQuickJS carga el bridge nativo libhpdfquickjs.so construido por tools/Build-HotPDFQuickJSLinux.sh; la ruta explícita y la variable de entorno siguen las mismas reglas de propiedad y de ABI
El descubrimiento por defecto en Linux comprueba el directorio del ejecutable y Lib/thirdparty/QuickJS/bin/Linux64; el despliegue nativo de OMF estáticos sigue siendo específico de Windows
Evaluación de un 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 convierte el valor JavaScript final a texto UTF-8 y preserva Unicode al devolver un string de Delphi
EvalInt y EvalFloat añaden conversión numérica estricta sin exponer valores del motor a través del límite de ABI
Límites de ejecución
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);
Los valores por defecto permiten 64 MiB de memoria del motor, un stack de 64 KiB, un script UTF-8 de 1 MiB, un segundo de tiempo real y un millón de chequeos de interrupción
El runtime estático en Win32 acota un presupuesto de stack solicitado de cero o mayor a 48 KiB para mantenerse dentro del límite de recursión seguro del compilador; los modos DLL y Win64 respetan directamente el valor solicitado
Los límites de memoria y stack aplican a todo el runtime, mientras que los límites de script, tiempo e interrupciones se aplican a cada evaluación
Estado y recuperación
qjsSuccessreporta un resultado convertidoqjsScriptErrorreporta errores de sintaxis, valores lanzados y fallos de conversiónqjsTimeLimityqjsInterruptLimitdistinguen los dos presupuestos de ejecuciónqjsBusy,qjsInvalidArgument,qjsResourceErroryqjsUnavailablepreservan los fallos de infraestructura
Una evaluación rechazada o interrumpida limpia su excepción pendiente y sus buffers, así que la misma instancia del motor puede ejecutar después un script válido
Una instancia del motor no es reentrante; use una instancia por worker concurrente
Scripting de formularios XFA
El motor de aplanado XFA reutiliza este runtime solo cuando THotPDF.XFAJavaScriptEnabled se activa explícitamente; suministra una fachada de datos restringida, typed arrays nativos, solicitudes de instancia validadas y ningún objeto de archivo, proceso, navegador ni red
TXFAFormScriptOptions.JavaScriptEvaluator puede adaptar el runtime estático sin forzar objetos estáticos de QuickJS en cada aplicación HotPDF
Consulte Bounded XFA FormCalc and JavaScript
Build reproducible del runtime
powershell -ExecutionPolicy Bypass -File Lib\thirdparty\build-quickjs-runtime.ps1
El script de build produce ambos conjuntos de objetos estáticos y ambos DLL de bridge desde el fuente incluido; luego la matriz de runtime compila y ejercita las sondas estáticas y de DLL para Win32 y Win64