Sınırlı QuickJS Runtime

HPDFQuickJS ve HPDFQuickJSStatic, Win32 ve Win64 üzerinde aynı uygulama kontrollü JavaScript evaluation API'sini sunar

Dağıtım modu seçimi

DLL binding'i açık bir yol, HOTPDF_QUICKJS_DLL environment değeri ya da executable atasının altında bulunan platform dizinini kabul eder

Varsayılan derlemeler bridge'i Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll veya Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll konumuna yerleştirir

Linux x86-64'te HPDFQuickJS, tools/Build-HotPDFQuickJSLinux.sh tarafından derlenen native libhpdfquickjs.so köprüsünü yükler; açık yol ve environment variable aynı ownership ve ABI kurallarını izler

Linux default keşfâ, executable dizinini ve Lib/thirdparty/QuickJS/bin/Linux64'i denetler; native statik OMF dağıtımı Windows'a özgü kalır

Script çalıştırma

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, nihai JavaScript değerini UTF-8 metnine dönüştürür ve Delphi string'i döndürürken Unicode'u korur

EvalInt ve EvalFloat, engine değerlerini ABI sınırının karşısına çıkarmadan katı sayısal dönüşüm ekler

Yürütme limitleri

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

Varsayılanlar 64 MiB engine belleği, 64 KiB stack, 1 MiB UTF-8 script, bir saniye duvar süresi ve bir milyon interrupt kontrolüne izin verir

Win32 static runtime, derleyici-güvenli recursion sınırının içinde kalmak için sıfır veya daha büyük istenen stack bütçesini 48 KiB ile sınırlar; DLL ve Win64 modları istenen değeri doğrudan dikkate alır

Bellek ve stack limitleri tüm runtime'ı kapsarken script, süre ve interrupt limitleri her evaluation'a uygulanır

Durum ve kurtarma

Reddedilen veya kesilen bir evaluation bekleyen exception'ını ve buffer'larını temizler, böylece aynı engine instance'ı daha sonra geçerli bir script çalıştırabilir

Tek bir engine instance reentrant değildir; her eşzamanlı worker için bir instance kullanın

XFA form scripting

XFA flattening engine, THotPDF.XFAJavaScriptEnabled açıkça ayarlandığında bu runtime'ı yeniden kullanır; kısıtlı bir data facade, native typed array'ler ve doğrulanmış instance istekleri sunar, dosya, process, browser veya network object'leri içermez

TXFAFormScriptOptions.JavaScriptEvaluator, static QuickJS object'lerini her HotPDF uygulamasına zorlamadan static runtime'ı uyarlayabilir

Ayrıca bkz. Sınırlı XFA FormCalc ve JavaScript

Tekrarlanabilir runtime derlemesi

powershell -ExecutionPolicy Bypass -File Lib\thirdparty\build-quickjs-runtime.ps1

Build script, paketlenmiş kaynaktan her iki static object setini ve her iki bridge DLL'ini üretir; ardından runtime matrix, Win32 ve Win64 için static ve DLL probe'larını derler ve çalıştırır