Runtime QuickJS limitado
HPDFQuickJS e HPDFQuickJSStatic expõem a mesma API de avaliação de JavaScript controlada pelo aplicativo no Win32 e no Win64
Escolha um modo de implantação
HPDFQuickJScarrega a pontequickjs.dllneutra de ABI e mantém os valores QuickJS dentro do código CHPDFQuickJSStaticvincula os objetos OMF específicos da plataforma ao aplicativo e não exige DLL em tempo de execução- Não inclua ambas as unidades em um programa, pois elas publicam os mesmos nomes públicos de tipo
O binding de DLL aceita um caminho explícito, o valor de ambiente HOTPDF_QUICKJS_DLL ou o diretório da plataforma encontrado abaixo de um ancestral do executável
Builds padrão colocam a ponte em Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll ou Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll
No Linux x86-64, HPDFQuickJS carrega a ponte 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 posse e de ABI
A descoberta default do Linux confere o diretório do executável e Lib/thirdparty/QuickJS/bin/Linux64; deployment nativo estático OMF continua específico do 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 Unicode ao retornar uma string Delphi
EvalInt e EvalFloat adicionam conversão numérica estrita sem expor valores do mecanismo pelo limite de 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 padrões permitem 64 MiB de memória do mecanismo, uma pilha de 64 KiB, um script UTF-8 de 1 MiB, um segundo de tempo de parede e um milhão de verificações de interrupção
O runtime estático do Win32 limita um orçamento de pilha solicitado zero ou maior a 48 KiB para permanecer dentro do limite de recursão seguro do compilador; os modos DLL e Win64 honram o valor solicitado diretamente
Os limites de memória e pilha são em todo o runtime, enquanto os limites de script, tempo e interrupção são aplicados a cada avaliação
Status e recuperação
qjsSuccessrelata um resultado convertidoqjsScriptErrorrelata 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 sua exceção pendente e buffers, portanto a mesma instância de mecanismo pode executar um script válido posterior
Uma instância de mecanismo não é reentrante; use uma instância por trabalhador concorrente
Scripting de formulários XFA
O mecanismo de achatamento XFA reutiliza este runtime apenas quando THotPDF.XFAJavaScriptEnabled é definido explicitamente; ele fornece uma fachada de dados restrita, arrays tipados nativos, solicitações de instância validadas e nenhum objeto de arquivo, processo, navegador ou rede
TXFAFormScriptOptions.JavaScriptEvaluator pode adaptar o runtime estático sem forçar objetos QuickJS estáticos em todo aplicativo HotPDF
Veja FormCalc e JavaScript XFA limitados
Build de runtime reproduzível
powershell -ExecutionPolicy Bypass -File Lib\thirdparty\build-quickjs-runtime.ps1
O script de build produz ambos os conjuntos de objetos estáticos e ambas as DLLs de ponte a partir da fonte incluída; em seguida, a matriz de runtime compila e exercita sondas estáticas e de DLL para Win32 e Win64