summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-11-03 01:59:08 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-11-03 08:24:47 +0900
commite4662d77e75de4cc6d8e98e56bb0395cbbedbaf7 (patch)
tree12048300d64366bd65d2aebdd3eaddc057a17077 /include
parent13a318b0c70573af45f76a79f902f95845177107 (diff)
downloadmruby-e4662d77e75de4cc6d8e98e56bb0395cbbedbaf7.tar.gz
mruby-e4662d77e75de4cc6d8e98e56bb0395cbbedbaf7.zip
Should not use `FSHARED` state for string from `irep` pools; fix #3829
This strings in `irep` pools may be freed forcefully in `mrb_irep_free`. This commit probably fixes #3817 as well.
Diffstat (limited to 'include')
-rw-r--r--include/mruby/string.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/include/mruby/string.h b/include/mruby/string.h
index 9e499b58b..975b1fe0d 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -68,6 +68,9 @@ struct RString {
#define RSTR_SET_NOFREE_FLAG(s) ((s)->flags |= MRB_STR_NOFREE)
#define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE)
+#define RSTR_POOL_P(s) ((s)->flags & MRB_STR_POOL)
+#define RSTR_SET_POOL_FLAG(s) ((s)->flags |= MRB_STR_POOL)
+
/*
* Returns a pointer from a Ruby string
*/
@@ -83,10 +86,11 @@ MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*);
#define MRB_STR_SHARED 1
#define MRB_STR_FSHARED 2
#define MRB_STR_NOFREE 4
-#define MRB_STR_NO_UTF 8
-#define MRB_STR_EMBED 16
-#define MRB_STR_EMBED_LEN_MASK 0x3e0
-#define MRB_STR_EMBED_LEN_SHIFT 5
+#define MRB_STR_POOL 8
+#define MRB_STR_NO_UTF 16
+#define MRB_STR_EMBED 32
+#define MRB_STR_EMBED_LEN_MASK 0x7c0
+#define MRB_STR_EMBED_LEN_SHIFT 6
void mrb_gc_free_str(mrb_state*, struct RString*);
MRB_API void mrb_str_modify(mrb_state*, struct RString*);