summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2020-01-01 19:14:46 +0900
committerKOBAYASHI Shuji <[email protected]>2020-01-01 19:16:05 +0900
commit40b8490fa4c0fc46783ff0d6baf68d251a5cd22b (patch)
treead8de77572fe54bdaf86ac9ed36e1241d027cd0c /src
parent7247e4cf1b7bbf298e19f42b990f5e12b4af4e06 (diff)
downloadmruby-40b8490fa4c0fc46783ff0d6baf68d251a5cd22b.tar.gz
mruby-40b8490fa4c0fc46783ff0d6baf68d251a5cd22b.zip
Revert "SHARED string is not required when sharing POOL string" (75949836)
Because literal pool may be released by GC. #### Example: ```ruby s1 = eval('"abcdefghijklmnopqrstuvwxyz01"') GC.start p s1 #=> "\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x90\x03\x00stuvwxyz01" ```
Diffstat (limited to 'src')
-rw-r--r--src/string.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/string.c b/src/string.c
index b3f07dfb0..8141019b6 100644
--- a/src/string.c
+++ b/src/string.c
@@ -553,7 +553,7 @@ str_share(mrb_state *mrb, struct RString *orig, struct RString *s)
size_t len = (size_t)orig->as.heap.len;
mrb_assert(!RSTR_EMBED_P(orig));
- if (RSTR_NOFREE_P(orig) || RSTR_POOL_P(orig)) {
+ if (RSTR_NOFREE_P(orig)) {
str_init_nofree(s, orig->as.heap.ptr, len);
}
else if (RSTR_SHARED_P(orig)) {
@@ -562,7 +562,7 @@ str_share(mrb_state *mrb, struct RString *orig, struct RString *s)
else if (RSTR_FSHARED_P(orig)) {
str_init_fshared(orig, s, orig->as.heap.aux.fshared);
}
- else if (mrb_frozen_p(orig)) {
+ else if (mrb_frozen_p(orig) && !RSTR_POOL_P(orig)) {
str_init_fshared(orig, s, orig);
}
else {