aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreileencodes <eileencodes@gmail.com>2023-10-17 13:13:37 -0400
committergit <svn-admin@ruby-lang.org>2023-10-17 17:50:38 +0000
commit5a3e8d2f187d54f336090c438ad9a202f137373a (patch)
treefc2450d22987db486e33d1e3ab0378e76fc47f84
parentd458b4127f1815e76774cb7c3c23b7c31dfd54bc (diff)
downloadruby-5a3e8d2f187d54f336090c438ad9a202f137373a.tar.gz
[ruby/prism] Ensure last encoding flag wins
You can't encoding a string with more than one encoding so ensure that the last one wins. https://github.com/ruby/prism/commit/4182c988c9
-rw-r--r--prism/prism.c11
-rw-r--r--test/prism/regexp_test.rb12
2 files changed, 19 insertions, 4 deletions
diff --git a/prism/prism.c b/prism/prism.c
index d2d153b2c4..21ce94ba94 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -771,6 +771,7 @@ parse_decimal_number(pm_parser_t *parser, const uint8_t *start, const uint8_t *e
static inline pm_node_flags_t
pm_regular_expression_flags_create(const pm_token_t *closing) {
pm_node_flags_t flags = 0;
+ pm_node_flags_t mask = (uint16_t) 0xFF0F;
if (closing->type == PM_TOKEN_REGEXP_END) {
for (const uint8_t *flag = closing->start + 1; flag < closing->end; flag++) {
@@ -778,11 +779,13 @@ pm_regular_expression_flags_create(const pm_token_t *closing) {
case 'i': flags |= PM_REGULAR_EXPRESSION_FLAGS_IGNORE_CASE; break;
case 'm': flags |= PM_REGULAR_EXPRESSION_FLAGS_MULTI_LINE; break;
case 'x': flags |= PM_REGULAR_EXPRESSION_FLAGS_EXTENDED; break;
- case 'e': flags |= PM_REGULAR_EXPRESSION_FLAGS_EUC_JP; break;
- case 'n': flags |= PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT; break;
- case 's': flags |= PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J; break;
- case 'u': flags |= PM_REGULAR_EXPRESSION_FLAGS_UTF_8; break;
case 'o': flags |= PM_REGULAR_EXPRESSION_FLAGS_ONCE; break;
+
+ case 'e': flags &= mask; flags |= PM_REGULAR_EXPRESSION_FLAGS_EUC_JP; break;
+ case 'n': flags &= mask; flags |= PM_REGULAR_EXPRESSION_FLAGS_ASCII_8BIT; break;
+ case 's': flags &= mask; flags |= PM_REGULAR_EXPRESSION_FLAGS_WINDOWS_31J; break;
+ case 'u': flags &= mask; flags |= PM_REGULAR_EXPRESSION_FLAGS_UTF_8; break;
+
default: assert(false && "unreachable");
}
}
diff --git a/test/prism/regexp_test.rb b/test/prism/regexp_test.rb
index 67114c7bf3..0a5fc2b4fc 100644
--- a/test/prism/regexp_test.rb
+++ b/test/prism/regexp_test.rb
@@ -227,6 +227,18 @@ module Prism
assert_equal(value, options("mix"))
end
+ def test_last_encoding_option_wins
+ regex = "/foo/nu"
+ option = Prism.parse(regex).value.statements.body.first.options
+
+ assert_equal Regexp::FIXEDENCODING, option
+
+ regex = "/foo/un"
+ option = Prism.parse(regex).value.statements.body.first.options
+
+ assert_equal Regexp::NOENCODING, option
+ end
+
private
def named_captures(source)