diff options
| -rw-r--r-- | include/mruby/string.h | 7 | ||||
| -rw-r--r-- | src/string.c | 7 |
2 files changed, 11 insertions, 3 deletions
diff --git a/include/mruby/string.h b/include/mruby/string.h index a66ba70ff..b94c355fe 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -81,9 +81,10 @@ mrb_int mrb_str_strlen(mrb_state*, struct RString*); #define MRB_STR_SHARED 1 #define MRB_STR_NOFREE 2 #define MRB_STR_FROZEN 4 -#define MRB_STR_EMBED 8 -#define MRB_STR_EMBED_LEN_MASK 0x1f0 -#define MRB_STR_EMBED_LEN_SHIFT 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 void mrb_gc_free_str(mrb_state*, struct RString*); MRB_API void mrb_str_modify(mrb_state*, struct RString*); diff --git a/src/string.c b/src/string.c index 2b01cc3a5..8d79defe0 100644 --- a/src/string.c +++ b/src/string.c @@ -273,11 +273,17 @@ utf8_strlen(mrb_value str, mrb_int len) mrb_int total = 0; char* p = RSTRING_PTR(str); char* e = p; + if (RSTRING(str)->flags & MRB_STR_NO_UTF) { + return RSTRING_LEN(str); + } e += len < 0 ? RSTRING_LEN(str) : len; while (p<e) { p += utf8len(p, e); total++; } + if (RSTRING_LEN(str) == total) { + RSTRING(str)->flags |= MRB_STR_NO_UTF; + } return total; } @@ -652,6 +658,7 @@ MRB_API void mrb_str_modify(mrb_state *mrb, struct RString *s) { check_frozen(mrb, s); + s->flags &= ~MRB_STR_NO_UTF; if (RSTR_SHARED_P(s)) { mrb_shared_string *shared = s->as.heap.aux.shared; |
