aboutsummaryrefslogtreecommitdiff
path: root/src/js_parser.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/js_parser.zig')
-rw-r--r--src/js_parser.zig32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/js_parser.zig b/src/js_parser.zig
index a61657128..2e6b9e336 100644
--- a/src/js_parser.zig
+++ b/src/js_parser.zig
@@ -13095,13 +13095,39 @@ fn NewParser_(
return p.newExpr(E.BigInt{ .value = value }, loc);
},
.t_slash, .t_slash_equals => {
- try p.lexer.scanRegExp();
+ const needs_decode = try p.lexer.scanRegExp();
// always set regex_flags_start to null to make sure we don't accidentally use the wrong value later
defer p.lexer.regex_flags_start = null;
- const value = p.lexer.raw();
+
+ const raw = p.lexer.raw();
+
+ if (!needs_decode) {
+ try p.lexer.next();
+ return p.newExpr(
+ E.RegExp{
+ .data = .{
+ .raw = raw,
+ },
+ .flags_offset = p.lexer.regex_flags_start,
+ },
+ loc,
+ );
+ }
+
+ var buf = std.ArrayList(u16).initCapacity(p.allocator, raw.len) catch unreachable;
+ try p.lexer.decodeEscapeSequences(p.lexer.start, raw, @TypeOf(buf), &buf);
+
try p.lexer.next();
- return p.newExpr(E.RegExp{ .value = value, .flags_offset = p.lexer.regex_flags_start }, loc);
+ return p.newExpr(
+ E.RegExp{
+ .data = .{
+ .decoded = bun.BabyList(u16).init(buf.items),
+ },
+ .flags_offset = p.lexer.regex_flags_start,
+ },
+ loc,
+ );
},
.t_void => {
try p.lexer.next();