[ruby-core:120144] [Ruby master Bug#20938] Percent String literal delimiter impacts string contents with parse.y

Issue #20938 has been reported by eightbitraptor (Matt V-H). ---------------------------------------- Bug #20938: Percent String literal delimiter impacts string contents with parse.y https://bugs.ruby-lang.org/issues/20938 * Author: eightbitraptor (Matt V-H) * Status: Open * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- The following code defines 2 programs that declare string literals using `%` and a single byte delimiter. I'd expect these programs to have the same output no matter which delimiter is used. With Prism, both programs output the same value (the string content: `1_\n`), but using parse.y the output values differ depending on the delimiter. Are the outputs supposed to be the same or different? ``` program1 = "%\n1_\r\n\n" # => parse.y: 1_, prism: "1_\n" program2 = "%'1_\r\n'" # => "1_\n" p eval(program1) p eval(program2) ``` -- https://bugs.ruby-lang.org/

Issue #20938 has been updated by nobu (Nobuyoshi Nakada). Prism seems to cut the string content out, then convert EOLs. The conversion of EOL is lower layer than parsing, so the result of "program1" should be "1_" without "\n". ---------------------------------------- Bug #20938: Percent String literal delimiter impacts string contents with parse.y https://bugs.ruby-lang.org/issues/20938#change-110922 * Author: eightbitraptor (Matt V-H) * Status: Open * ruby -v: ruby 3.4.0dev (2024-11-28T09:19:02Z master 31a3e87777) +PRISM +GC [arm64-darwin24] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- The following code defines 2 programs that declare string literals using `%` and a single byte delimiter. I'd expect these programs to have the same output no matter which delimiter is used. With Prism, both programs output the same value (the string content: `1_\n`), but using parse.y the output values differ depending on the delimiter. Are the outputs supposed to be the same or different? ``` program1 = "%\n1_\r\n\n" # => parse.y: 1_, prism: "1_\n" program2 = "%'1_\r\n'" # => "1_\n" p eval(program1) p eval(program2) ``` [[Github Issue]](https://github.com/ruby/prism/pull/3290) -- https://bugs.ruby-lang.org/

Issue #20938 has been updated by nobu (Nobuyoshi Nakada). Status changed from Open to Assigned Assignee set to prism ---------------------------------------- Bug #20938: Percent String literal delimiter impacts string contents with parse.y https://bugs.ruby-lang.org/issues/20938#change-110923 * Author: eightbitraptor (Matt V-H) * Status: Assigned * Assignee: prism * ruby -v: ruby 3.4.0dev (2024-11-28T09:19:02Z master 31a3e87777) +PRISM +GC [arm64-darwin24] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- The following code defines 2 programs that declare string literals using `%` and a single byte delimiter. I'd expect these programs to have the same output no matter which delimiter is used. With Prism, both programs output the same value (the string content: `1_\n`), but using parse.y the output values differ depending on the delimiter. Are the outputs supposed to be the same or different? ``` program1 = "%\n1_\r\n\n" # => parse.y: 1_, prism: "1_\n" program2 = "%'1_\r\n'" # => "1_\n" p eval(program1) p eval(program2) ``` [[Github Issue]](https://github.com/ruby/prism/pull/3290) -- https://bugs.ruby-lang.org/

Issue #20938 has been updated by tenderlovemaking (Aaron Patterson). nobu (Nobuyoshi Nakada) wrote in #note-3:
Prism seems to cut the string content out, then convert EOLs.
The conversion of EOL is lower layer than parsing, so the result of "program1" should be "1_" without "\n".
Sorry, I don't understand. Can you explain more? Why does EOL conversion impact `program1` but not `program2`? ---------------------------------------- Bug #20938: Percent String literal delimiter impacts string contents with parse.y https://bugs.ruby-lang.org/issues/20938#change-110924 * Author: eightbitraptor (Matt V-H) * Status: Assigned * Assignee: prism * ruby -v: ruby 3.4.0dev (2024-11-28T09:19:02Z master 31a3e87777) +PRISM +GC [arm64-darwin24] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- The following code defines 2 programs that declare string literals using `%` and a single byte delimiter. I'd expect these programs to have the same output no matter which delimiter is used. With Prism, both programs output the same value (the string content: `1_\n`), but using parse.y the output values differ depending on the delimiter. Are the outputs supposed to be the same or different? ``` program1 = "%\n1_\r\n\n" # => parse.y: 1_, prism: "1_\n" program2 = "%'1_\r\n'" # => "1_\n" p eval(program1) p eval(program2) ``` [[Github Issue]](https://github.com/ruby/prism/pull/3290) -- https://bugs.ruby-lang.org/

Issue #20938 has been updated by tenderlovemaking (Aaron Patterson). tenderlovemaking (Aaron Patterson) wrote in #note-5:
nobu (Nobuyoshi Nakada) wrote in #note-3:
Prism seems to cut the string content out, then convert EOLs.
The conversion of EOL is lower layer than parsing, so the result of "program1" should be "1_" without "\n".
Sorry, I don't understand. Can you explain more? Why does EOL conversion impact `program1` but not `program2`?
I think I understand, but I will try to explain. In `program1` EOL conversion first changes it to `"%\n1_\n\n"`, so the second `\n` becomes the delimiter? Is that correct? Thanks ---------------------------------------- Bug #20938: Percent String literal delimiter impacts string contents with parse.y https://bugs.ruby-lang.org/issues/20938#change-110925 * Author: eightbitraptor (Matt V-H) * Status: Assigned * Assignee: prism * ruby -v: ruby 3.4.0dev (2024-11-28T09:19:02Z master 31a3e87777) +PRISM +GC [arm64-darwin24] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- The following code defines 2 programs that declare string literals using `%` and a single byte delimiter. I'd expect these programs to have the same output no matter which delimiter is used. With Prism, both programs output the same value (the string content: `1_\n`), but using parse.y the output values differ depending on the delimiter. Are the outputs supposed to be the same or different? ``` program1 = "%\n1_\r\n\n" # => parse.y: 1_, prism: "1_\n" program2 = "%'1_\r\n'" # => "1_\n" p eval(program1) p eval(program2) ``` [[Github Issue]](https://github.com/ruby/prism/pull/3290) -- https://bugs.ruby-lang.org/

Issue #20938 has been updated by nobu (Nobuyoshi Nakada). tenderlovemaking (Aaron Patterson) wrote in #note-6:
I think I understand, but I will try to explain. In `program1` EOL conversion first changes it to `"%\n1_\n\n"`, so the second `\n` becomes the delimiter?
Is that correct?
Correct! ---------------------------------------- Bug #20938: Percent String literal delimiter impacts string contents with parse.y https://bugs.ruby-lang.org/issues/20938#change-110926 * Author: eightbitraptor (Matt V-H) * Status: Assigned * Assignee: prism * ruby -v: ruby 3.4.0dev (2024-11-28T09:19:02Z master 31a3e87777) +PRISM +GC [arm64-darwin24] * Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN ---------------------------------------- The following code defines 2 programs that declare string literals using `%` and a single byte delimiter. I'd expect these programs to have the same output no matter which delimiter is used. With Prism, both programs output the same value (the string content: `1_\n`), but using parse.y the output values differ depending on the delimiter. Are the outputs supposed to be the same or different? ``` program1 = "%\n1_\r\n\n" # => parse.y: 1_, prism: "1_\n" program2 = "%'1_\r\n'" # => "1_\n" p eval(program1) p eval(program2) ``` [[Github Issue]](https://github.com/ruby/prism/pull/3290) -- https://bugs.ruby-lang.org/
participants (3)
-
eightbitraptor (Matt V-H)
-
nobu (Nobuyoshi Nakada)
-
tenderlovemaking (Aaron Patterson)