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

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

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