Ograniczone środowisko QuickJS

HPDFQuickJS i HPDFQuickJSStatic wystawiają to samo API ewaluacji JavaScript kontrolowane przez aplikację na Win32 i Win64

Wybór trybu wdrożenia

Binding DLL przyjmuje jawną ścieżkę, wartość środowiskową HOTPDF_QUICKJS_DLL albo katalog platformy znaleziony poniżej przodka pliku wykonywalnego

Domyślne buduje umieszczają bridge w Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll lub Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll

Na Linuksie x86-64 HPDFQuickJS wczytuje natywny bridge libhpdfquickjs.so budowany przez tools/Build-HotPDFQuickJSLinux.sh; jawna ścieżka i zmienna środowiskowa podlegają tym samym regułom własności i ABI

Domyślne wykrywanie w Linuksie sprawdza katalog pliku wykonywalnego i Lib/thirdparty/QuickJS/bin/Linux64; natywne statyczne wdrożenie OMF pozostaje specyficzne dla Windows

Ewaluacja skryptu

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 konwertuje końcową wartość JavaScript na tekst UTF-8 i zachowuje Unicode przy zwracaniu ciągu Delphi

EvalInt i EvalFloat dodają ścisłą konwersję liczbową bez wystawiania wartości silnika przez granicę ABI

Limity wykonania

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

Domyślne dopuszczają 64 MiB pamięci silnika, stos 64 KiB, skrypt UTF-8 1 MiB, sekundę czasu zegarowego i milion sprawdzeń przerwań

Statyczny runtime Win32 ogranicza żądany budżet stosu równy zeru lub większy do 48 KiB, żeby zmieścić się w bezpiecznej dla kompilatora granicy rekurencji; tryby DLL i Win64 honorują żądaną wartość bezpośrednio

Limity pamięci i stosu obejmują cały runtime, a limity skryptu, czasu i przerwań są stosowane do każdej ewaluacji

Status i odzyskiwanie

Odrzucona lub przerwana ewaluacja czyści swoją oczekującą wyjątek i bufory, więc ta sama instancja silnika może później wykonać ważny skrypt

Jedna instancja silnika nie jest reentrantna; używaj jednej instancji na współbieżnego workera

Skrypty formularzy XFA

Silnik spłaszczania XFA ponownie używa tego runtime tylko przy jawnie ustawionym THotPDF.XFAJavaScriptEnabled; dostarcza ograniczoną fasadę danych, natywne tablice typowane, walidowane żądania instancji i żadnych obiektów plikowych, procesowych, przeglądarkowych ani sieciowych

TXFAFormScriptOptions.JavaScriptEvaluator potrafi zaadaptować runtime statyczny bez forsowania statycznych obiektów QuickJS w każdej aplikacji HotPDF

Zobacz Ograniczone FormCalc i JavaScript w XFA

Odtwarzalna budowa runtime

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

Skrypt budowy produkuje oba zestawy obiektów statycznych i obie bridge DLL z dołączonego źródła, a potem macierz runtime kompiluje i wypróbowuje próby statyczne i DLL dla Win32 i Win64