Переглянути джерело

LibJS: Make RegExp() constructor spec-compliant

- Default values should depend on arguments being undefined, not being
  missing
- "(?:)" for empty pattern happens in RegExp.prototype.source, not the
  constructor
Linus Groh 4 роки тому
батько
коміт
5cb45e4feb

+ 12 - 8
Libraries/LibJS/Runtime/RegExpConstructor.cpp

@@ -56,14 +56,18 @@ Value RegExpConstructor::call()
 Value RegExpConstructor::construct(Function&)
 {
     auto& vm = this->vm();
-    if (!vm.argument_count())
-        return RegExpObject::create(global_object(), "(?:)", "");
-    auto pattern = vm.argument(0).to_string(global_object());
-    if (vm.exception())
-        return {};
-    auto flags = vm.argument_count() > 1 ? vm.argument(1).to_string(global_object()) : "";
-    if (vm.exception())
-        return {};
+    String pattern = "";
+    String flags = "";
+    if (!vm.argument(0).is_undefined()) {
+        pattern = vm.argument(0).to_string(global_object());
+        if (vm.exception())
+            return {};
+    }
+    if (!vm.argument(1).is_undefined()) {
+        flags = vm.argument(1).to_string(global_object());
+        if (vm.exception())
+            return {};
+    }
     return RegExpObject::create(global_object(), pattern, flags);
 }
 

+ 9 - 0
Libraries/LibJS/Tests/builtins/RegExp/RegExp.js

@@ -0,0 +1,9 @@
+test("basic functionality", () => {
+    // FIXME: update when toString is spec-compliant
+    expect(RegExp().toString()).toBe("//");
+    expect(RegExp(undefined).toString()).toBe("//");
+    expect(RegExp("foo").toString()).toBe("/foo/");
+    expect(RegExp("foo", undefined).toString()).toBe("/foo/");
+    expect(RegExp("foo", "g").toString()).toBe("/foo/g");
+    expect(RegExp(undefined, "g").toString()).toBe("//g");
+});