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

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

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