Browse Source

Implement step 5 in RegExp constructor (#3305)

The following step was missing from our `RegExp` constructor implementation:

```
5. Else if patternIsRegExp is true, then
    a. Let P be ? Get(pattern, "source").
    b. If flags is undefined, then
        i. Let F be ? Get(pattern, "flags").
    c. Else,
        i. Let F be flags.
```
pull/3309/head
Haled Odat 1 year ago committed by GitHub
parent
commit
1b03f8379c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 45
      boa_engine/src/builtins/regexp/mod.rs

45
boa_engine/src/builtins/regexp/mod.rs

@ -15,7 +15,7 @@ use crate::{
error::JsNativeError,
js_string,
object::{
internal_methods::get_prototype_from_constructor, JsObject, ObjectData, ObjectKind,
internal_methods::get_prototype_from_constructor, JsObject, Object, ObjectData, ObjectKind,
CONSTRUCTOR,
},
property::{Attribute, PropertyDescriptorBuilder},
@ -189,25 +189,40 @@ impl BuiltInConstructor for RegExp {
}
}
// 4. If Type(pattern) is Object and pattern has a [[RegExpMatcher]] internal slot, then
let (p, f) = if let Some(pattern) = pattern_is_regexp {
let mut original_source = JsValue::undefined();
let mut original_flags = JsValue::undefined();
if let Some(regexp) = pattern.borrow().as_regexp() {
original_source = regexp.original_source.clone().into();
original_flags = regexp.original_flags.clone().into();
};
// 4. If pattern is an Object and pattern has a [[RegExpMatcher]] internal slot, then
let (p, f) = if let Some(pattern) = pattern
.as_object()
.map(JsObject::borrow)
.as_deref()
.and_then(Object::as_regexp)
{
// a. Let P be pattern.[[OriginalSource]].
let p = pattern.original_source.clone().into();
// b. If flags is undefined, let F be pattern.[[OriginalFlags]].
let f = if flags.is_undefined() {
pattern.original_flags.clone().into()
// c. Else, let F be flags.
if flags.is_undefined() {
(original_source, original_flags)
} else {
(original_source, flags.clone())
}
flags.clone()
};
(p, f)
} else if let Some(pattern) = pattern_is_regexp {
// a. Let P be ? Get(pattern, "source").
let p = pattern.get("source", context)?;
// b. If flags is undefined, then
let f = if flags.is_undefined() {
// i. Let F be ? Get(pattern, "flags").
pattern.get("flags", context)?
// c. Else,
} else {
// i. Let F be flags.
flags.clone()
};
(p, f)
// 6. Else,
} else {
// a. Let P be pattern.

Loading…
Cancel
Save