summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-08-17 23:41:52 +0900
committerGitHub <[email protected]>2019-08-17 23:41:52 +0900
commit83dab1ee0d0d3aa76e44f7fbf14360ee501be151 (patch)
tree5999b4e3d8416bd354e22ae8e559eb9b55a4d440 /include
parent277c91e94cc1e3df52c28048859a267335571d6c (diff)
parentcaba5fef274ab7df91b7247182ecbf2483b853b8 (diff)
downloadmruby-83dab1ee0d0d3aa76e44f7fbf14360ee501be151.tar.gz
mruby-83dab1ee0d0d3aa76e44f7fbf14360ee501be151.zip
Merge pull request #4634 from shuujii/refactor-set-unset-string-type-flags
Refactor set/unset string type flags
Diffstat (limited to 'include')
-rw-r--r--include/mruby/string.h14
1 files changed, 10 insertions, 4 deletions
diff --git a/include/mruby/string.h b/include/mruby/string.h
index aacbdbfc0..51510457d 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -34,6 +34,9 @@ struct RString {
} as;
};
+#define RSTR_SET_TYPE_FLAG(s, type) (RSTR_UNSET_TYPE_FLAG(s), (s)->flags |= MRB_STR_##type)
+#define RSTR_UNSET_TYPE_FLAG(s) ((s)->flags &= ~(MRB_STR_TYPE_MASK|MRB_STR_EMBED_LEN_MASK))
+
#define RSTR_EMBED_P(s) ((s)->flags & MRB_STR_EMBED)
#define RSTR_SET_EMBED_FLAG(s) ((s)->flags |= MRB_STR_EMBED)
#define RSTR_UNSET_EMBED_FLAG(s) ((s)->flags &= ~(MRB_STR_EMBED|MRB_STR_EMBED_LEN_MASK))
@@ -103,11 +106,14 @@ 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_POOL 8
-#define MRB_STR_ASCII 16
-#define MRB_STR_EMBED 32
-#define MRB_STR_EMBED_LEN_MASK 0x7c0
+#define MRB_STR_EMBED 8 /* type flags up to here */
+#define MRB_STR_POOL 16 /* status flags from here */
+#define MRB_STR_ASCII 32
#define MRB_STR_EMBED_LEN_SHIFT 6
+#define MRB_STR_EMBED_LEN_BITSIZE 5
+#define MRB_STR_EMBED_LEN_MASK (((1 << MRB_STR_EMBED_LEN_BITSIZE) - 1) << MRB_STR_EMBED_LEN_SHIFT)
+#define MRB_STR_TYPE_MASK (MRB_STR_POOL - 1)
+
void mrb_gc_free_str(mrb_state*, struct RString*);