diff options
| author | nagachika <nagachika@ruby-lang.org> | 2023-11-10 11:41:57 +0900 |
|---|---|---|
| committer | nagachika <nagachika@ruby-lang.org> | 2023-11-10 11:41:57 +0900 |
| commit | 482e1f573ee45ef562cc6d218ba26d44660f8e0a (patch) | |
| tree | 451d409c16698ce085217fe10f243df68f1d973f | |
| parent | 2aaa9af75989bb0993a44e9690ed2ca890b2ff91 (diff) | |
merge revision(s) 17b0643392749f45b7aacb64fc1c1bd704d42b4c: [Backport #19924]
[Bug #19924] Source code should be unsigned char stream
Use `peekc` or `nextc` to fetch the next character, instead of reading
from `lex.pcur` directly, for compilers that plain char is signed.
---
parse.y | 10 +++++-----
test/ruby/test_parse.rb | 2 ++
2 files changed, 7 insertions(+), 5 deletions(-)
| -rw-r--r-- | parse.y | 10 | ||||
| -rw-r--r-- | test/ruby/test_parse.rb | 2 | ||||
| -rw-r--r-- | version.h | 2 |
3 files changed, 8 insertions, 6 deletions
@@ -7286,9 +7286,9 @@ tokadd_utf8(struct parser_params *p, rb_encoding **encp, * invalid unicode escapes are allowed in comments. The regexp parser * does its own validation and will catch any issues. */ - int c = *p->lex.pcur; - tokadd(p, c); - for (c = *++p->lex.pcur; p->lex.pcur < p->lex.pend; c = *++p->lex.pcur) { + tokadd(p, open_brace); + while (++p->lex.pcur < p->lex.pend) { + int c = peekc(p); if (c == close_brace) { tokadd(p, c); ++p->lex.pcur; @@ -7678,7 +7678,7 @@ tokadd_string(struct parser_params *p, --*nest; } else if ((func & STR_FUNC_EXPAND) && c == '#' && p->lex.pcur < p->lex.pend) { - int c2 = *p->lex.pcur; + unsigned char c2 = *p->lex.pcur; if (c2 == '$' || c2 == '@' || c2 == '{') { pushback(p, c); break; @@ -9313,7 +9313,7 @@ parse_qmark(struct parser_params *p, int space_seen) enc = rb_utf8_encoding(); tokadd_utf8(p, &enc, -1, 0, 0); } - else if (!lex_eol_p(p) && !(c = *p->lex.pcur, ISASCII(c))) { + else if (!ISASCII(c = peekc(p))) { nextc(p); if (tokadd_mbchar(p, c) == -1) return 0; } diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb index a22f11aeae..f2691cfe0f 100644 --- a/test/ruby/test_parse.rb +++ b/test/ruby/test_parse.rb @@ -607,6 +607,8 @@ class TestParse < Test::Unit::TestCase assert_syntax_error("?\\M-\x01", 'Invalid escape character syntax') assert_syntax_error("?\\M-\\C-\x01", 'Invalid escape character syntax') assert_syntax_error("?\\C-\\M-\x01", 'Invalid escape character syntax') + + assert_equal("\xff", eval("# encoding: ascii-8bit\n""?\\\xFF")) end def test_percent @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 2 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 128 +#define RUBY_PATCHLEVEL 129 #include "ruby/version.h" #include "ruby/internal/abi.h" |
