Skip to content

Commit 4095e7d

Browse files
kddnewtonmatzbot
authored andcommitted
[ruby/prism] Regexp terminator escapes
ruby/prism@42a48a2ba9
1 parent c65de63 commit 4095e7d

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

prism/prism.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9535,7 +9535,9 @@ parser_lex(pm_parser_t *parser) {
95359535
case '\r':
95369536
parser->current.end++;
95379537
if (peek(parser) != '\n') {
9538-
pm_token_buffer_push(&token_buffer, '\\');
9538+
if (lex_mode->as.regexp.terminator != '\r') {
9539+
pm_token_buffer_push(&token_buffer, '\\');
9540+
}
95399541
pm_token_buffer_push(&token_buffer, '\r');
95409542
break;
95419543
}
@@ -9563,7 +9565,20 @@ parser_lex(pm_parser_t *parser) {
95639565
escape_read(parser, &token_buffer.buffer, PM_ESCAPE_FLAG_REGEXP);
95649566
break;
95659567
default:
9566-
if (lex_mode->as.regexp.terminator == '/' && peeked == '/') {
9568+
if (lex_mode->as.regexp.terminator == peeked) {
9569+
// Some characters when they are used as the
9570+
// terminator also receive an escape. They are
9571+
// enumerated here.
9572+
switch (peeked) {
9573+
case '$': case ')': case '*': case '+':
9574+
case '.': case '>': case '?': case ']':
9575+
case '^': case '|': case '}':
9576+
pm_token_buffer_push(&token_buffer, '\\');
9577+
break;
9578+
default:
9579+
break;
9580+
}
9581+
95679582
pm_token_buffer_push(&token_buffer, peeked);
95689583
parser->current.end++;
95699584
break;

test/prism/snapshots/seattlerb/bug190.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
├── opening_loc: (1,0)-(1,3) = "%r'"
99
├── content_loc: (1,3)-(1,5) = "\\'"
1010
├── closing_loc: (1,5)-(1,6) = "'"
11-
└── unescaped: "\\'"
11+
└── unescaped: "'"

0 commit comments

Comments
 (0)