Le moteur JavaScript SpiderMonkey utilisé dans Firefox pour utiliser une mise en œuvre mise à jour des expressions régulières, basée sur le code actuel du moteur JavaScript V8, utilisé dans les navigateurs basés sur le projet Chromium. La nouvelle implémentation de RegExp sera proposée dans la version de Firefox 78, prévue pour le 30 juin, et permettra d'implémenter dans le navigateur tous les éléments manquants d'ECMAScript liés aux expressions régulières.
Il est à noter que le moteur RegExp dans SpiderMonkey est conçu comme un composant séparé, ce qui le rend relativement indépendant et apte à être remplacé sans nécessiter de modifications significatives de la base de code. La modularité a permis, en 2014, de remplacer le moteur RegExp YARR initialement utilisé dans Firefox par un fork du moteur Irregexp de V8. Irregexp est lié à l'API V8, attaché au ramasse-miettes, utilise une représentation de chaînes et un modèle d'objet spécifiques à V8. Dans le processus d'adaptation à l'API interne de SpiderMonkey en 2014, le moteur Irregexp a été partiellement réécrit, et les changements apparaissant, comme le drapeau '\u', ont été, dans la mesure du possible dans une branche, maintenue par Mozilla.
Malheureusement, maintenir un fork synchronisé est une tâche difficile et son entretien nécessite beaucoup de ressources. Avec l'apparition dans la norme ECMAScript 2018 de nouvelles fonctionnalités liées aux expressions régulières, les développeurs de Mozilla se sont interrogés sur la façon de simplifier le transfert des modifications depuis Irregexp. Comme solution, le concept de liaison a été proposé, permettant d'utiliser dans SpiderMonkey un moteur Irregexp presque inchangé (les modifications se limitent seulement au remplacement automatique des blocs «#include»).
La liaison fournit à Irregexp les fonctionnalités spécifiques nécessaires de V8, y compris les fonctions de gestion de la mémoire et de génération de code, ainsi que les structures de données d'origine qui sont mises en œuvre sur la base des mécanismes de gestion de la mémoire, des générateurs de code et des structures de SpiderMonkey.
La mise à jour du moteur RegExp permettra d'assurer dans Firefox le support de fonctionnalités telles que les groupes nommés (named captures), l'échappement des classes de caractères Unicode, le drapeau dotAll et le mode Lookbehind :
- permettent de lier les parties de chaîne correspondantes à une expression régulière à des noms spécifiques au lieu de numéros d'ordre de correspondance (par exemple, au lieu de «/(\d{4})-(\d{2})-(\d{2})/», on peut spécifier «/(?\d{4})-(?\d{2})-(?\d{2})/» et accéder à l'année non pas par result[1], mais par result.groups.year).
- de caractères Unicode ajoute les constructions \p{…} et \P{…}, par exemple, \p{Number} définit tous les symboles qui ont l'apparence de chiffres (y compris les symboles tels que ①), \p{Alphabetic} — les lettres (y compris les idéogrammes), \p{Math} — les symboles mathématiques, etc.
- Drapeau fait que le masque «.» fonctionne également pour les caractères de nouvelle ligne.
- Mode permet de déterminer dans une expression régulière qu'un modèle précède un autre (par exemple, faire correspondre un montant en dollars sans capturer le signe dollar).
Le projet a été réalisé avec la participation des développeurs de V8, qui ont de leur côté travaillé à réduire la dépendance d'Irregexp à V8 et ont placé certaines caractéristiques, impossibles à réaliser sur la base de SpiderMonkey, dans des blocs désactivables « #ifdef ». La collaboration s'est révélée mutuellement bénéfique. Pour leur part, les développeurs de Mozilla ont transmis à Irregexp des modifications éliminant certaines avec les exigences de la norme JavaScript et la qualité du code. De plus, lors des tests de fuzzing de Firefox, des erreurs dans le code d'Irregexp, auparavant non détectées, entraînant des plantages, ont été identifiées et corrigées.
Source : opennet.ru
