diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-09-26 23:07:37 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-01 16:24:43 +0900 |
| commit | 7edbe428caca6814841195a3f2720745cf04353e (patch) | |
| tree | ba57b813d080cce44eea564760cb7dad4cf941ca /include | |
| parent | 473b7d0efd210290d1093201254fa32b5473d5d1 (diff) | |
| download | mruby-7edbe428caca6814841195a3f2720745cf04353e.tar.gz mruby-7edbe428caca6814841195a3f2720745cf04353e.zip | |
Add new type of shared string: `RSTR_FSHARED`.
`RSTR_FSHARED` use frozen strings as shared body instead of
`struct mrb_shared_string`. This reduces allocation from
literal strings.
Diffstat (limited to 'include')
| -rw-r--r-- | include/mruby/class.h | 2 | ||||
| -rw-r--r-- | include/mruby/object.h | 2 | ||||
| -rw-r--r-- | include/mruby/string.h | 8 |
3 files changed, 10 insertions, 2 deletions
diff --git a/include/mruby/class.h b/include/mruby/class.h index c0317b458..e9df7764c 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -52,7 +52,7 @@ mrb_class(mrb_state *mrb, mrb_value v) } /* TODO: figure out where to put user flags */ -#define MRB_FLAG_IS_FROZEN (1 << 18) +/* flags bits >= 18 is reserved */ #define MRB_FLAG_IS_PREPENDED (1 << 19) #define MRB_FLAG_IS_ORIGIN (1 << 20) #define MRB_CLASS_ORIGIN(c) do {\ diff --git a/include/mruby/object.h b/include/mruby/object.h index 9347981d4..4f2134ae2 100644 --- a/include/mruby/object.h +++ b/include/mruby/object.h @@ -22,6 +22,8 @@ struct RBasic { }; #define mrb_basic_ptr(v) ((struct RBasic*)(mrb_ptr(v))) +/* flags bits >= 18 is reserved */ +#define MRB_FLAG_IS_FROZEN (1 << 18) #define MRB_FROZEN_P(o) ((o)->flags & MRB_FLAG_IS_FROZEN) #define MRB_SET_FROZEN_FLAG(o) ((o)->flags |= MRB_FLAG_IS_FROZEN) #define MRB_UNSET_FROZEN_FLAG(o) ((o)->flags &= ~MRB_FLAG_IS_FROZEN) diff --git a/include/mruby/string.h b/include/mruby/string.h index 4c25b9346..9e499b58b 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -26,6 +26,7 @@ struct RString { union { mrb_int capa; struct mrb_shared_string *shared; + struct RString *fshared; } aux; char *ptr; } heap; @@ -59,6 +60,10 @@ struct RString { #define RSTR_SET_SHARED_FLAG(s) ((s)->flags |= MRB_STR_SHARED) #define RSTR_UNSET_SHARED_FLAG(s) ((s)->flags &= ~MRB_STR_SHARED) +#define RSTR_FSHARED_P(s) ((s)->flags & MRB_STR_FSHARED) +#define RSTR_SET_FSHARED_FLAG(s) ((s)->flags |= MRB_STR_FSHARED) +#define RSTR_UNSET_FSHARED_FLAG(s) ((s)->flags &= ~MRB_STR_FSHARED) + #define RSTR_NOFREE_P(s) ((s)->flags & MRB_STR_NOFREE) #define RSTR_SET_NOFREE_FLAG(s) ((s)->flags |= MRB_STR_NOFREE) #define RSTR_UNSET_NOFREE_FLAG(s) ((s)->flags &= ~MRB_STR_NOFREE) @@ -76,7 +81,8 @@ struct RString { MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*); #define MRB_STR_SHARED 1 -#define MRB_STR_NOFREE 2 +#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 |
