diff options
author | 2023-09-13 01:26:18 -0700 | |
---|---|---|
committer | 2023-09-13 01:26:18 -0700 | |
commit | 32664df254be225dd195fcaf46994f0c550f9d22 (patch) | |
tree | 3636f2c68bf3e8926eae3c83ee5930968023a02e /src/js_parser.zig | |
parent | 15f7bacb8bd57615475e1614f5f93b23810e63b1 (diff) | |
download | bun-32664df254be225dd195fcaf46994f0c550f9d22.tar.gz bun-32664df254be225dd195fcaf46994f0c550f9d22.tar.zst bun-32664df254be225dd195fcaf46994f0c550f9d22.zip |
decode regex if needed (#5167)
* decode regex if non-ascii
* make it comptime
* add test
* use `bun.BabyList(u16)`
Diffstat (limited to 'src/js_parser.zig')
-rw-r--r-- | src/js_parser.zig | 32 |
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(); |