浏览代码

LibJS: Make escape_regexp_pattern() a RegExpObject member function

Similarly to regexp_initialize() this can be a member function instead
of taking a RegExpObject argument.
Having it available outside RegExpPrototype is also useful for other
things that need RegExp.prototype.source behavior - e.g. the REPL for
pretty-printing.
Linus Groh 3 年之前
父节点
当前提交
78fd8c1ca2

+ 10 - 0
Userland/Libraries/LibJS/Runtime/RegExpObject.cpp

@@ -10,6 +10,7 @@
 #include <LibJS/Runtime/RegExpObject.h>
 #include <LibJS/Runtime/RegExpObject.h>
 #include <LibJS/Runtime/StringPrototype.h>
 #include <LibJS/Runtime/StringPrototype.h>
 #include <LibJS/Runtime/Value.h>
 #include <LibJS/Runtime/Value.h>
+#include <LibJS/Token.h>
 
 
 namespace JS {
 namespace JS {
 
 
@@ -188,6 +189,15 @@ RegExpObject* RegExpObject::regexp_initialize(GlobalObject& global_object, Value
     return this;
     return this;
 }
 }
 
 
+// 22.2.3.2.5 EscapeRegExpPattern ( P, F ), https://tc39.es/ecma262/#sec-escaperegexppattern
+String RegExpObject::escape_regexp_pattern() const
+{
+    if (m_pattern.is_empty())
+        return "(?:)";
+    // FIXME: Check u flag and escape accordingly
+    return m_pattern.replace("\n", "\\n", true).replace("\r", "\\r", true).replace(LINE_SEPARATOR_STRING, "\\u2028", true).replace(PARAGRAPH_SEPARATOR_STRING, "\\u2029", true).replace("/", "\\/", true);
+}
+
 // 22.2.3.2.4 RegExpCreate ( P, F ), https://tc39.es/ecma262/#sec-regexpcreate
 // 22.2.3.2.4 RegExpCreate ( P, F ), https://tc39.es/ecma262/#sec-regexpcreate
 RegExpObject* regexp_create(GlobalObject& global_object, Value pattern, Value flags)
 RegExpObject* regexp_create(GlobalObject& global_object, Value pattern, Value flags)
 {
 {

+ 1 - 0
Userland/Libraries/LibJS/Runtime/RegExpObject.h

@@ -34,6 +34,7 @@ public:
     RegExpObject(Regex<ECMA262> regex, String pattern, String flags, Object& prototype);
     RegExpObject(Regex<ECMA262> regex, String pattern, String flags, Object& prototype);
 
 
     RegExpObject* regexp_initialize(GlobalObject&, Value pattern, Value flags);
     RegExpObject* regexp_initialize(GlobalObject&, Value pattern, Value flags);
+    String escape_regexp_pattern() const;
 
 
     virtual void initialize(GlobalObject&) override;
     virtual void initialize(GlobalObject&) override;
     virtual ~RegExpObject() override;
     virtual ~RegExpObject() override;

+ 1 - 11
Userland/Libraries/LibJS/Runtime/RegExpPrototype.cpp

@@ -18,7 +18,6 @@
 #include <LibJS/Runtime/RegExpPrototype.h>
 #include <LibJS/Runtime/RegExpPrototype.h>
 #include <LibJS/Runtime/RegExpStringIterator.h>
 #include <LibJS/Runtime/RegExpStringIterator.h>
 #include <LibJS/Runtime/StringPrototype.h>
 #include <LibJS/Runtime/StringPrototype.h>
-#include <LibJS/Token.h>
 
 
 namespace JS {
 namespace JS {
 
 
@@ -56,15 +55,6 @@ RegExpPrototype::~RegExpPrototype()
 {
 {
 }
 }
 
 
-static String escape_regexp_pattern(const RegExpObject& regexp_object)
-{
-    auto pattern = regexp_object.pattern();
-    if (pattern.is_empty())
-        return "(?:)";
-    // FIXME: Check u flag and escape accordingly
-    return pattern.replace("\n", "\\n", true).replace("\r", "\\r", true).replace(LINE_SEPARATOR_STRING, "\\u2028", true).replace(PARAGRAPH_SEPARATOR_STRING, "\\u2029", true).replace("/", "\\/", true);
-}
-
 // 22.2.5.2.3 AdvanceStringIndex ( S, index, unicode ), https://tc39.es/ecma262/#sec-advancestringindex
 // 22.2.5.2.3 AdvanceStringIndex ( S, index, unicode ), https://tc39.es/ecma262/#sec-advancestringindex
 size_t advance_string_index(Utf16View const& string, size_t index, bool unicode)
 size_t advance_string_index(Utf16View const& string, size_t index, bool unicode)
 {
 {
@@ -344,7 +334,7 @@ JS_DEFINE_NATIVE_GETTER(RegExpPrototype::source)
         return {};
         return {};
     }
     }
 
 
-    return js_string(vm, escape_regexp_pattern(static_cast<RegExpObject&>(*regexp_object)));
+    return js_string(vm, static_cast<RegExpObject&>(*regexp_object).escape_regexp_pattern());
 }
 }
 
 
 // 22.2.5.2 RegExp.prototype.exec ( string ), https://tc39.es/ecma262/#sec-regexp.prototype.exec
 // 22.2.5.2 RegExp.prototype.exec ( string ), https://tc39.es/ecma262/#sec-regexp.prototype.exec