Runtime QuickJS acotado
HPDFQuickJS y HPDFQuickJSStatic exponen la misma API de evaluación de JavaScript controlada por la aplicación en Win32 y Win64
Elija un modo de implementación
HPDFQuickJScarga el puentequickjs.dllneutral de ABI y mantiene los valores QuickJS dentro del código CHPDFQuickJSStaticenlaza los objetos OMF específicos de la plataforma en la aplicación y no requiere DLL en tiempo de ejecución- No incluya ambas unidades en un mismo programa porque publican los mismos nombres de tipo público
El enlace DLL acepta una ruta explícita, el valor de entorno HOTPDF_QUICKJS_DLL o el directorio de plataforma que se encuentra debajo de un ejecutable ancestro
Las compilaciones predeterminadas colocan el puente en Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll o Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll
En Linux x86-64, HPDFQuickJS carga el puente nativo libhpdfquickjs.so compilado por tools/Build-HotPDFQuickJSLinux.sh; la ruta explícita y la variable de entorno siguen las mismas reglas de propiedad y ABI
El descubrimiento por defecto en Linux comprueba el directorio del ejecutable y Lib/thirdparty/QuickJS/bin/Linux64; el despliegue estático OMF nativo sigue siendo exclusivo de Windows
Evaluar 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 conserva Unicode al devolver una cadena Delphi
EvalInt y EvalFloat añaden conversión numérica estricta sin exponer los valores del motor a través del límite 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 predeterminados permiten 64 MiB de memoria del motor, una pila de 64 KiB, un script UTF-8 de 1 MiB, un segundo de tiempo de pared y un millón de comprobaciones de interrupción
El runtime estático de Win32 limita un presupuesto de pila solicitado de cero o mayor a 48 KiB para permanecer dentro del límite de recursión seguro para el compilador; los modos DLL y Win64 respetan directamente el valor solicitado
Los límites de memoria y pila abarcan todo el runtime, mientras que los límites de script, tiempo e interrupción se aplican a cada evaluación
Estado y recuperación
qjsSuccessinforma de un resultado convertidoqjsScriptErrorinforma de errores de sintaxis, valores lanzados y fallos de conversiónqjsTimeLimityqjsInterruptLimitdistinguen los dos presupuestos de ejecuciónqjsBusy,qjsInvalidArgument,qjsResourceErroryqjsUnavailableconservan los fallos de infraestructura
Una evaluación rechazada o interrumpida limpia su excepción pendiente y sus búferes, por lo que la misma instancia de motor puede ejecutar un script válido posterior
Una instancia de motor no es reentrante; use una instancia por trabajador concurrente
Scripting de formularios XFA
El motor de aplanado XFA reutiliza este runtime solo cuando THotPDF.XFAJavaScriptEnabled se establece explícitamente; proporciona una fachada de datos restringida, matrices tipadas nativas, solicitudes de instancia validadas y ningún objeto de archivo, proceso, navegador o red
TXFAFormScriptOptions.JavaScriptEvaluator puede adaptar el runtime estático sin forzar objetos QuickJS estáticos en cada aplicación HotPDF
Véase FormCalc y JavaScript XFA acotados
Compilación reproducible del runtime
powershell -ExecutionPolicy Bypass -File Lib\thirdparty\build-quickjs-runtime.ps1
El script de compilación produce ambos conjuntos de objetos estáticos y ambas DLL puente a partir del código fuente incluido, y luego la matriz de runtime compila y ejercita las sondas estáticas y DLL para Win32 y Win64