Den JavaScript-motor, der anvendes i Firefox, SpiderMonkey til at bruge en opdateret implementering af regulære udtryk, baseret på den aktuelle kode fra JavaScript-motoren V8, der anvendes i browsere baseret på Chromium-projektet. Den nye implementering af RegExp vil blive præsenteret i Firefox-version 78, der er planlagt til den 30. juni, og vil gøre det muligt at implementere alle de manglende elementer i ECMAScript, der er relateret til regulære udtryk, i browseren.
Det bemærkes, at RegExp-motoren i SpiderMonkey er designet som en separat komponent, hvilket gør den relativt uafhængig og egnet til udskiftning uden betydelige ændringer i kodebasen. Modulariteten gjorde det muligt i 2014 at erstatte den oprindeligt anvendte RegExp-motor i Firefox, YARR, med en fork af motoren Irregexp fra V8. Irregexp er knyttet til V8's API, bundet til affaldsopsamleren, anvender V8-specifikke strenge- og objektmodeller. I tilpasningsprocessen til SpiderMonkey's interne API i 2014 blev Irregexp-motoren delvist gen skrevet, og nye ændringer, som flaget ‘\u’, blev så vidt muligt til en gren, der støttes af Mozilla.
Desværre er vedligeholdelse af en synkroniseret fork en vanskelig opgave, og det kræver store ressourcer. Med de nye muligheder relateret til regulære udtryk, som blev introduceret i ECMAScript 2018-standarden, begyndte udviklerne hos Mozilla at overveje, hvordan de kunne forenkle overførslen af ændringer fra Irregexp. Som en løsning blev konceptet for en wrapper foreslået, som giver mulighed for at bruge Irregexp-motoren i SpiderMonkey næsten uændret (ændringer begrænser sig kun til automatisk at erstatte blokke af «#include»).
Wrapperen leverer de nødvendige V8-specifikke funktioner til Irregexp, inklusive hukommelsesstyring og code generation-funktioner, samt de oprindelige datatyper, som er implementeret baseret på mekanismerne til hukommelsesstyring, code generators og strukturer i SpiderMonkey.
Opdateringen af RegExp-motoren vil muliggøre understøttelse af funktioner som navngivne grupper, escape-sekvenser for Unicode-tegn, dotAll-flaget og Lookbehind-tilstand i Firefox:
- gør det muligt at knytte de matchende dele af strengen fundet med det regulære udtryk til bestemte navne i stedet for positionsnumre for matches (fx i stedet for «/(\d{4})-(\d{2})-(\d{2})/» kan man angive «/(?\d{4})-(?\d{2})-(?\d{2})/» og tilgå året ikke via result[1], men via result.groups.year).
- Unicode-tegn tilføjer konstruktioner \p{…} og \P{…}, for eksempel \p{Number} definerer alle mulige tegn, der viser cifre (inklusive tegn som ①), \p{Alphabetic} — bogstaver (herunder tegnskrift), \p{Math} — matematiske tegn osv.
- Flaget fører til aktivering af masken «.» også for linjeskift-tegn.
- Tilstand muliggør at bestemme i et regulært udtryk, at et mønster forudgår et andet (for eksempel kan man matche en sum i dollars uden at fange dollartegnet).
Projektet blev gennemført med deltagelse af V8-udviklerne, som har arbejdet på at reducere Irregexp's afhængighed af V8 og har flyttet nogle funktioner, der ikke kan implementeres på SpiderMonkey, til de frakoblingsblokke "#ifdef". Samarbejdet viste sig at være gensidigt fordelagtigt. Fra deres side har Mozilla-udviklerne overført ændringer til Irregexp, der fjerner nogle med kravene i JavaScript-standarden og kodekvaliteten. Desuden blev der i løbet af fuzzing-testningen af Firefox opdaget og rettet tidligere uopdagede fejl i Irregexp-koden, som førte til nedbrud.
Kilde: opennet.ru
