Exécution QuickJS bornée
HPDFQuickJS et HPDFQuickJSStatic exposent la même API d'évaluation JavaScript contrôlée par l'application sur Win32 et Win64
Choisir un mode de déploiement
HPDFQuickJScharge la passerelle ABI-neutrequickjs.dllet conserve les valeurs QuickJS dans le code CHPDFQuickJSStaticlie les objets OMF spécifiques à la plateforme dans l'application et n'exige aucune DLL d'exécution- N'incluez pas les deux unités dans un même programme, car elles publient les mêmes noms de types publics
La liaison DLL accepte un chemin explicite, la valeur d'environnement HOTPDF_QUICKJS_DLL ou le répertoire de plateforme trouvé sous un ancêtre exécutable
Les builds par défaut placent la passerelle à Lib\thirdparty\QuickJS\bin\Win32\quickjs.dll ou Lib\thirdparty\QuickJS\bin\Win64\quickjs.dll
Sous Linux x86-64, HPDFQuickJS charge le pont natif libhpdfquickjs.so construit par tools/Build-HotPDFQuickJSLinux.sh ; le chemin explicite et la variable d'environnement suivent les mêmes règles de propriété et d'ABI
La découverte par défaut sous Linux vérifie le répertoire de l'exécutable et Lib/thirdparty/QuickJS/bin/Linux64 ; le déploiement statique OMF natif reste spécifique à Windows
Évaluer un 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 convertit la valeur JavaScript finale en texte UTF-8 et préserve Unicode lors du retour d'une chaîne Delphi
EvalInt et EvalFloat ajoutent une conversion numérique stricte sans exposer les valeurs du moteur à travers la frontière ABI
Limites d'exécution
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);
Les valeurs par défaut autorisent 64 Mio de mémoire moteur, une pile de 64 Ko, un script UTF-8 de 1 Mio, une seconde de temps mural et un million de vérifications d'interruption
L'exécution statique Win32 plafonne un budget de pile demandé de zéro ou plus à 48 Ko pour rester dans la frontière de récursion sûre du compilateur ; les modes DLL et Win64 respectent la valeur demandée directement
Les limites de mémoire et de pile valent pour toute l'exécution tandis que les limites de script, de temps et d'interruption s'appliquent à chaque évaluation
Statut et récupération
qjsSuccesssignale un résultat convertiqjsScriptErrorsignale les erreurs de syntaxe, les valeurs levées et les échecs de conversionqjsTimeLimitetqjsInterruptLimitdistinguent les deux budgets d'exécutionqjsBusy,qjsInvalidArgument,qjsResourceErroretqjsUnavailablepréservent les échecs d'infrastructure
Une évaluation rejetée ou interrompue efface son exception et ses tampons en attente, de sorte que la même instance de moteur peut exécuter un script valide ultérieur
Une instance de moteur n'est pas réentrante ; utilisez une instance par travailleur concurrent
Scripts de formulaires XFA
Le moteur d'aplatissement XFA réutilise cette exécution uniquement lorsque THotPDF.XFAJavaScriptEnabled est explicitement défini ; il fournit une façade de données limitée, des tableaux typés natifs, des demandes d'instance validées et aucun objet fichier, processus, navigateur ou réseau
TXFAFormScriptOptions.JavaScriptEvaluator peut adapter l'exécution statique sans forcer d'objets QuickJS statiques dans chaque application HotPDF
Voir FormCalc et JavaScript XFA bornés
Build d'exécution reproductible
powershell -ExecutionPolicy Bypass -File Lib\thirdparty\build-quickjs-runtime.ps1
Le script de build produit les deux ensembles d'objets statiques et les deux DLL de passerelle à partir de la source groupée, puis la matrice d'exécution compile et exerce des sondes statiques et DLL pour Win32 et Win64