Feature #15251
Updated by chopraanmol1 (Anmol Chopra) about 6 years ago
I'm not sure if current behavior is expected one or a bug. So fell free to change tracker type. Currently Hash ASET checks if non-tainted string exists in fstring table or not, if it doesn't then ruby duplicates string and freeze it. This works well for string_literal because they are already registered in fstring table, but it doesn't work for non-literal string. non-string literal. Patch https://github.com/ruby/ruby/pull/1993 O/P of attached file on trunk: ~~~ string_literal => 1 string times 1 => 1 string times 3 string times 3 string times 3 => 100 interpolated_string => 100 string add => 100 string append => 100 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ fstring -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ string_literal => 1 string times 1 => 1 string times 3 string times 3 string times 3 => 1 interpolated_string => 1 string add => 1 string append => 1 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ fstring + GC -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ string_literal => 1 string times 1 => 1 string times 3 string times 3 string times 3 => 100 interpolated_string => 100 string add => 100 string append => 100 ~~~ after patch ~~~ string_literal => 1 string times 1 => 1 string times 3 string times 3 string times 3 => 1 interpolated_string => 1 string add => 1 string append => 1 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ fstring -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ string_literal => 1 string times 1 => 1 string times 3 string times 3 string times 3 => 1 interpolated_string => 1 string add => 1 string append => 1 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ fstring + GC -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ string_literal => 1 string times 1 => 1 string times 3 string times 3 string times 3 => 1 interpolated_string => 1 string add => 1 string append => 1 ~~~