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 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

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