[ruby-core:123364] [Ruby Bug#21187] Strings concatenated with `\` getting frozen with literal hashes (PRISM only)
From:
"k0kubun (Takashi Kokubun) via ruby-core" <ruby-core@...>
Date:
2025-10-01 20:29:39 UTC
List:
ruby-core #123364
Issue #21187 has been updated by k0kubun (Takashi Kokubun).
> Turns out the prism commit was reverted before the compiler change was me=
rged.
> A bit of a mess to be honest.
I think the maintainers understand this, but the thing is
* A Prism change that needs a compiler fix should be merged to ruby/ruby fi=
rst, and then reverse-synced to ruby/prism.
* When you merge such a change to ruby/prism first and it breaks ruby/rub=
y CI, the change will be reverted, at least on the ruby/ruby side. This sta=
rted the out-of-sync situation.
* If you don't want this to happen, you probably want to have `prism_comp=
ile.{c,h}` in ruby/prism as well. `cruby-bindings.yml` would test it, so it=
's not impossible.
* When something is changed on ruby/ruby master (in this case, a sync from =
ruby/prism was reverted), it should be reverse-synced to ruby/prism as soon=
as possible.
* There's nothing that prevents you from leaving the out-of-sync ruby/pri=
sm at the moment. This time, they were out of sync for a while without anyb=
ody noticing it.
* Perhaps `cruby-bindings.yml` should fail at the `tool/sync_default_gems=
.rb` step when there's a diff not made by the Prism PR itself. It should le=
t you notice ruby/prism is out of sync (due to a revert in ruby/ruby, for e=
xample) when it fails there. There's no point in running the CRuby test whe=
n it's not going to be the ruby/ruby code after merging the ruby/prism PR.
----------------------------------------
Bug #21187: Strings concatenated with `\` getting frozen with literal hashe=
s (PRISM only)
https://bugs.ruby-lang.org/issues/21187#change-114734
* Author: LocoDelAssembly (Hern=E1n Pereira)
* Status: Closed
* Assignee: prism
* ruby -v: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux]
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
When the first elements of a literal hash are strings that are concatenated=
with `\`, those elements are flagged with `PM_NODE_FLAG_STATIC_LITERAL` an=
d a special optimization that I believe was introduced in https://github.co=
m/ruby/ruby/commit/8080de04be8e99e71309745822a9d436cc4ae37c causes the stri=
ngs to be frozen.
Reproduction
=3D=3D=3D
test.rb
```
a =3D {
a: 'one' \
'two',
b: 'three' \
'four',
c: 'five',
d: 'six' \
'seven'
}
b =3D {
a: 'one',
b: 'two' \
'three'
}
puts "a =3D #{a.map { |k,v| {k =3D> v.frozen?} }}"
puts "b =3D #{b.map { |k,v| {k =3D> v.frozen?} }}"
```
With prism:
```
$ ruby test.rb =20
a =3D [{a: true}, {b: true}, {c: false}, {d: false}]
b =3D [{a: false}, {b: false}]
```
With parse.y:
```
$ ruby --parser=3Dparse.y test.rb
a =3D [{a: false}, {b: false}, {c: false}, {d: false}]
b =3D [{a: false}, {b: false}]
```
(Notice `b` hash is unaffected in both parsers)
Not sure if this is just part of undefined behavior or this is indeed a bug=
. Assigning a string concatenated with `\` to a variable doesn't make it fr=
ozen, to the best of my knowledge this seems to be hash-specific.
--=20
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.rub=
y-lang.org/