Skip to content

Commit 508168f

Browse files
DonIsaacaapoalas
andauthored
fix(vm): regex parsing (#794)
Co-authored-by: Aapo Alasuutari <[email protected]>
1 parent 79c0796 commit 508168f

File tree

3 files changed

+34
-204
lines changed

3 files changed

+34
-204
lines changed

nova_vm/src/ecmascript/builtins/regexp/abstract_operations.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::ops::ControlFlow;
66

77
use oxc_allocator::Allocator;
88
use oxc_ast::ast::RegExpFlags;
9-
use oxc_regular_expression::ConstructorParser;
9+
use oxc_regular_expression::{LiteralParser, Options};
1010

1111
use crate::{
1212
ecmascript::{
@@ -196,13 +196,19 @@ pub(crate) fn reg_exp_initialize<'a>(
196196
Ok(f) => f.as_str().into(),
197197
Err(f) => f.to_string_lossy(agent),
198198
};
199+
let flags: Option<&str> = if f_str.is_empty() {
200+
None
201+
} else {
202+
Some(f_str.as_ref())
203+
};
204+
199205
let allocator = Allocator::new();
200206
// 13. Let parseResult be ParsePattern(patternText, u, v).
201-
match ConstructorParser::new(
207+
match LiteralParser::new(
202208
&allocator,
203209
&p.to_string_lossy(agent),
204-
Some(&f_str),
205-
Default::default(),
210+
flags,
211+
Options::default(),
206212
)
207213
.parse()
208214
{
@@ -241,22 +247,25 @@ fn parse_flags(f: &str) -> Option<RegExpFlags> {
241247
let mut flags: u8 = 0;
242248
for cu in f.as_bytes() {
243249
match cu {
250+
b'd' => flags |= RegExpFlags::D.bits(),
251+
b'g' => flags |= RegExpFlags::G.bits(),
244252
// 6. If F contains "i", let i be true; else let i be false.
245-
b'i' => flags &= RegExpFlags::I.bits(),
253+
b'i' => flags |= RegExpFlags::I.bits(),
246254
// 7. If F contains "m", let m be true; else let m be false.
247-
b'm' => flags &= RegExpFlags::M.bits(),
255+
b'm' => flags |= RegExpFlags::M.bits(),
248256
// 8. If F contains "s", let s be true; else let s be false.
249-
b's' => flags &= RegExpFlags::S.bits(),
257+
b's' => flags |= RegExpFlags::S.bits(),
250258
// 9. If F contains "u", let u be true; else let u be false.
251-
b'u' => flags &= RegExpFlags::U.bits(),
259+
b'u' => flags |= RegExpFlags::U.bits(),
252260
// 10. If F contains "v", let v be true; else let v be false.
253-
b'v' => flags &= RegExpFlags::V.bits(),
261+
b'v' => flags |= RegExpFlags::V.bits(),
262+
b'y' => flags |= RegExpFlags::Y.bits(),
263+
// 5. If F contains any code unit other than "d", "g", "i", "m",
264+
// "s", "u", "v", or "y", or if F contains any code unit more
265+
// than once, throw a SyntaxError exception.
254266
_ => return None,
255267
}
256268
}
257-
// 5. If F contains any code unit other than "d", "g", "i", "m", "s", "u",
258-
// "v", or "y", or if F contains any code unit more than once, throw a
259-
// SyntaxError exception.
260269
Some(RegExpFlags::from_bits_retain(flags))
261270
}
262271

0 commit comments

Comments
 (0)