Mozilla přešla na používání společného s Chromium enginu pro regulární výrazy.

JavaScript motor SpiderMonkey používaný ve Firefoxu byla převedena na využívání aktualizované implementace regulárních výrazů, založené na aktuálním kódu Irregexp z JavaScript motoru V8, který se používá v prohlížečích založených na projektu Chromium. Nová implementace RegExp bude nabízena v verzi Firefox 78, plánované na 30. června, a umožní implementaci všech chybějících prvků ECMAScript souvisejících s regulárními výrazy do prohlížeče.

Je zdůrazněno, že motor RegExp ve SpiderMonkey je navržen jako samostatná komponenta, což jej činí relativně nezávislým a vhodným k nahrazení bez nutnosti provádět významné změny v kódové základně. Modularita umožnila v roce 2014 nahradit původně používaný RegExp motor YARR na fork motoru Irregexp z V8. Irregexp je vázán na API V8, spojený s garbage collectorem, a využívá specifické pro V8 reprezentace řetězců a objektové modely. Během adaptace na vnitřní API SpiderMonkey v roce 2014 byl motor Irregexp částečně přepsán, a vyvstávající změny, jako je příznak ‘\u’, byly pokud možno přenášeny do větve podporované Mozillou.

Bohužel udržování synchronizovaného forku je obtížný úkol a jeho správa vyžaduje velké zdroje. S příchodem nových možností souvisejících s regulárními výrazy ve standardu ECMAScript 2018 začali vývojáři Mozilly uvažovat, jak zjednodušit přenos změn z Irregexp. Jako řešení byla navržena koncepce wrapperu, která umožňuje používat ve SpiderMonkey téměř nezměněný motor Irregexp (změny se omezují pouze na automatickou náhradu bloků „#include“).

Mozilla přešla na používání společného s Chromium enginu pro regulární výrazy.

Wrapper poskytuje pro Irregexp nezbytné specifické možnosti V8, včetně funkcí pro řízení paměti a generování kódu, a také původní datové struktury, které jsou realizovány na základě mechanismů řízení paměti, generátorů kódu a struktur SpiderMonkey.

Aktualizace RegExp motoru umožní v Firefoxu podporu takových možností, jako jsou pojmenované skupiny (named captures), escapování tříd Unicode znaků, příznak dotAll a režim Lookbehind:

  • Pojmenované skupiny umožňují přiřadit části řetězce, které odpovídají zadanému regulárnímu výrazu, určitým jménům místo pořadových čísel shod (například místo „/(\d{4})-(\d{2})-(\d{2})/“ můžete použít „/(?\d{4})-(?\d{2})-(?\d{2})/“ a získat přístup k roku nikoli přes result[1], ale přes result.groups.year).
  • Escapování tříd Unicode znaků přidává konstrukce \p{…} a \P{…}, například \p{Number} definuje všechny možné znaky, které zobrazují čísla (včetně symbolů jako ①), \p{Alphabetic} — písmena (včetně hieroglyfů), \p{Math} — matematické symboly atd.
  • Přepínač dotAll způsobuje, že maska „.“ se aplikuje i na znaky nového řádku.
  • Režim Lookbehind umožňuje určit v regulárním výrazu, že jeden vzor předchází jinému (například porovnat částku v dolarech bez zachycení znaku dolaru).

Projekt byl realizován za účasti vývojářů V8, kteří na své straně provedli práci na snížení závislosti Irregexp na V8 a odvedli některé vlastnosti, které není možné realizovat na základě SpiderMonkey, do odpojovaných bloků „#ifdef“. Spolupráce se ukázala jako vzájemně výhodná. Vývojáři Mozilly na svou stranu předali do Irregexp změny, které odstranily některé nesoulady s požadavky standardu JavaScript a zlepšující kvalitu kódu. Také během fuzzing testování Firefoxu byly zjištěny a odstraněny dříve nezpozorované chyby v kódu Irregexp, které vedly k pádům.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster