From 7c54b6bd45efbf3ba933e615131b3df6bbffef9f Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Fri, 20 Aug 2021 09:14:27 -0400 Subject: [PATCH] LibJS: Separate RegExpCreate into RegExpAlloc and RegExpInitialize RegExp.prototype.compile will require invoking RegExpInitialize on an already-existing RegExpObject. Break up RegExpCreate into RegExpAlloc and RegExpInitialize to support this. --- .../Libraries/LibJS/Runtime/RegExpObject.cpp | 33 +++++++++++++++---- .../Libraries/LibJS/Runtime/RegExpObject.h | 12 +++++-- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/RegExpObject.cpp b/Userland/Libraries/LibJS/Runtime/RegExpObject.cpp index fb1f6e45f8..feb56c5014 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpObject.cpp +++ b/Userland/Libraries/LibJS/Runtime/RegExpObject.cpp @@ -103,18 +103,28 @@ String parse_regex_pattern(StringView pattern, bool unicode) return builder.build(); } +RegExpObject* RegExpObject::create(GlobalObject& global_object) +{ + return global_object.heap().allocate(global_object, *global_object.regexp_prototype()); +} + RegExpObject* RegExpObject::create(GlobalObject& global_object, Regex regex, String pattern, String flags) { return global_object.heap().allocate(global_object, move(regex), move(pattern), move(flags), *global_object.regexp_prototype()); } +RegExpObject::RegExpObject(Object& prototype) + : Object(prototype) +{ +} + RegExpObject::RegExpObject(Regex regex, String pattern, String flags, Object& prototype) : Object(prototype) , m_pattern(move(pattern)) , m_flags(move(flags)) , m_regex(move(regex)) { - VERIFY(m_regex.parser_result.error == regex::Error::NoError); + VERIFY(m_regex->parser_result.error == regex::Error::NoError); } RegExpObject::~RegExpObject() @@ -128,8 +138,8 @@ void RegExpObject::initialize(GlobalObject& global_object) define_direct_property(vm.names.lastIndex, Value(0), Attribute::Writable); } -// 22.2.3.2.4 RegExpCreate ( P, F ), https://tc39.es/ecma262/#sec-regexpcreate -RegExpObject* regexp_create(GlobalObject& global_object, Value pattern, Value flags) +// 22.2.3.2.2 RegExpInitialize ( obj, pattern, flags ), https://tc39.es/ecma262/#sec-regexpinitialize +RegExpObject* RegExpObject::regexp_initialize(GlobalObject& global_object, Value pattern, Value flags) { auto& vm = global_object.vm(); @@ -169,11 +179,22 @@ RegExpObject* regexp_create(GlobalObject& global_object, Value pattern, Value fl return {}; } - auto* object = RegExpObject::create(global_object, move(regex), move(original_pattern), move(f)); - object->set(vm.names.lastIndex, Value(0), Object::ShouldThrowExceptions::Yes); + m_pattern = move(original_pattern); + m_flags = move(f); + m_regex = move(regex); + + set(vm.names.lastIndex, Value(0), Object::ShouldThrowExceptions::Yes); if (vm.exception()) return {}; - return object; + + return this; +} + +// 22.2.3.2.4 RegExpCreate ( P, F ), https://tc39.es/ecma262/#sec-regexpcreate +RegExpObject* regexp_create(GlobalObject& global_object, Value pattern, Value flags) +{ + auto* regexp_object = RegExpObject::create(global_object); + return regexp_object->regexp_initialize(global_object, pattern, flags); } } diff --git a/Userland/Libraries/LibJS/Runtime/RegExpObject.h b/Userland/Libraries/LibJS/Runtime/RegExpObject.h index d181d76303..b3d73b59fe 100644 --- a/Userland/Libraries/LibJS/Runtime/RegExpObject.h +++ b/Userland/Libraries/LibJS/Runtime/RegExpObject.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -26,21 +27,26 @@ public: // FIXME: Enable 'BrowserExtended' only if in a browser context. static constexpr regex::RegexOptions default_flags { (regex::ECMAScriptFlags)regex::AllFlags::Global | (regex::ECMAScriptFlags)regex::AllFlags::SkipTrimEmptyMatches | regex::ECMAScriptFlags::BrowserExtended }; + static RegExpObject* create(GlobalObject&); static RegExpObject* create(GlobalObject&, Regex regex, String pattern, String flags); + RegExpObject(Object& prototype); RegExpObject(Regex regex, String pattern, String flags, Object& prototype); + + RegExpObject* regexp_initialize(GlobalObject&, Value pattern, Value flags); + virtual void initialize(GlobalObject&) override; virtual ~RegExpObject() override; const String& pattern() const { return m_pattern; } const String& flags() const { return m_flags; } - const Regex& regex() { return m_regex; } - const Regex& regex() const { return m_regex; } + const Regex& regex() { return *m_regex; } + const Regex& regex() const { return *m_regex; } private: String m_pattern; String m_flags; - Regex m_regex; + Optional> m_regex; }; }