diff options
-rw-r--r-- | src/js_lexer.zig | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/js_lexer.zig b/src/js_lexer.zig index 1f6c39989..282cac680 100644 --- a/src/js_lexer.zig +++ b/src/js_lexer.zig @@ -1815,6 +1815,10 @@ fn NewLexer_( lexer.step(); var has_set_flags_start = false; + const min_flag = comptime std.mem.min(u8, "gimsuy"); + const max_flag = comptime std.mem.max(u8, "gimsuy"); + const RegexpFlags = std.bit_set.IntegerBitSet((max_flag - min_flag) + 1); + var flags = RegexpFlags.initEmpty(); while (isIdentifierContinue(lexer.code_point)) { switch (lexer.code_point) { 'g', 'i', 'm', 's', 'u', 'y' => { @@ -1822,6 +1826,16 @@ fn NewLexer_( lexer.regex_flags_start = @truncate(u16, lexer.end - lexer.start); has_set_flags_start = true; } + const flag = max_flag - @intCast(u8, lexer.code_point); + if (flags.isSet(flag)) { + lexer.addError( + lexer.regex_flags_start.?, + "Duplicate flag \"{u}\" in regular expression", + .{@intCast(u21, lexer.code_point)}, + false, + ); + } + flags.set(flag); lexer.step(); }, |