Ograniczone środowisko QuickJS
HPDFQuickJS i HPDFQuickJSStatic wystawiają to samo API ewaluacji JavaScript kontrolowane przez aplikację na Win32 i Win64
Wybór trybu wdrożenia
HPDFQuickJSładuje neutralną ABI bridgequickjs.dlli trzyma wartości QuickJS wewnątrz kodu CHPDFQuickJSStaticlinkuje specyficzne dla platformy obiekty OMF do aplikacji i nie wymaga DLL runtime- Nie dołączaj obu jednostek do jednego programu, bo publikują te same publiczne nazwy typów
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
qjsSuccessraportuje skonwertowany wynikqjsScriptErrorraportuje błędy składni, wyrzucone wartości i porażki konwersjiqjsTimeLimitiqjsInterruptLimitrozróżniają dwa budżety wykonaniaqjsBusy,qjsInvalidArgument,qjsResourceErroriqjsUnavailablezachowują porażki infrastruktury
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