Runtime QuickJS limitado
HPDFQuickJS e HPDFQuickJSStatic expõem a mesma API de avaliação de JavaScript, controlada pela aplicação, em Win32 e Win64
Escolher o modo de implantação
- O
HPDFQuickJScarrega a bridgequickjs.dllneutra de ABI e mantém os valores QuickJS dentro de código C HPDFQuickJSStaticliga à aplicação os objetos OMF específicos de cada plataforma e não requer nenhuma DLL em runtime- Não inclua as duas units no mesmo programa, porque publicam os mesmos nomes de tipos públicos
O binding da DLL aceita um caminho explícito, o valor da variável de ambiente HOTPDF_QUICKJS_DLL ou o diretório da plataforma encontrado abaixo de um antecessor do executável
As builds por defeito colocam a bridge em Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll ou Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll
Em Linux x86-64, o HPDFQuickJS carrega a bridge nativa libhpdfquickjs.so construída por tools/Build-HotPDFQuickJSLinux.sh; o caminho explícito e a variável de ambiente seguem as mesmas regras de propriedade e de ABI
A descoberta por defeito em Linux verifica o diretório do executável e Lib/thirdparty/QuickJS/bin/Linux64; a implantação estática OMF nativa continua específica de Windows
Avaliar um 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 o valor JavaScript final em texto UTF-8 e preserva o Unicode ao devolver uma string Delphi
EvalInt e EvalFloat acrescentam conversão numérica estrita sem expor valores do motor através da fronteira da ABI
Limites de execução
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);
Os valores predefinidos permitem 64 MiB de memória do motor, uma stack de 64 KiB, um script UTF-8 de 1 MiB, um segundo de tempo real e um milhão de verificações de interrupção
O runtime estático em Win32 limita a 48 KiB um orçamento de stack pedido igual a zero ou maior, para se manter dentro da fronteira de recursão segura do compilador; os modos DLL e Win64 respeitam diretamente o valor pedido
Os limites de memória e de stack aplicam-se a todo o runtime, enquanto os limites de script, de tempo e de interrupções se aplicam a cada avaliação
Estado e recuperação
qjsSuccessreporta um resultado convertidoqjsScriptErrorreporta erros de sintaxe, valores lançados e falhas de conversãoqjsTimeLimiteqjsInterruptLimitdistinguem os dois orçamentos de execuçãoqjsBusy,qjsInvalidArgument,qjsResourceErroreqjsUnavailablepreservam falhas de infraestrutura
Uma avaliação rejeitada ou interrompida limpa a exceção e os buffers pendentes, pelo que a mesma instância do motor pode executar depois um script válido
Uma instância do motor não é reentrante; use uma instância por worker concorrente
Scripting de formulários XFA
O motor de flattening de XFA só reutiliza este runtime quando THotPDF.XFAJavaScriptEnabled é definido explicitamente; fornece uma fachada de dados restrita, arrays tipados nativos, pedidos de instância validados e nenhum objeto de ficheiros, processos, browser ou rede
TXFAFormScriptOptions.JavaScriptEvaluator pode adaptar o runtime estático sem forçar objetos QuickJS estáticos para todas as aplicações HotPDF
Ver FormCalc XFA e JavaScript limitados
Build de runtime reprodutível
powershell -ExecutionPolicy Bypass -File Lib\thirdparty\build-quickjs-runtime.ps1
O script de build produz os dois conjuntos de objetos estáticos e as duas DLLs de bridge a partir do código-fonte incluído, e depois a matriz de runtime compila e exercita sondas estáticas e de DLL para Win32 e Win64