diff options
author | eileencodes <eileencodes@gmail.com> | 2023-10-17 13:13:37 -0400 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2023-10-17 17:50:38 +0000 |
commit | 5a3e8d2f187d54f336090c438ad9a202f137373a (patch) | |
tree | fc2450d22987db486e33d1e3ab0378e76fc47f84 | |
parent | d458b4127f1815e76774cb7c3c23b7c31dfd54bc (diff) | |
download | ruby-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.c | 11 | ||||
-rw-r--r-- | test/prism/regexp_test.rb | 12 |
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) |