summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJun Hiroe <[email protected]>2014-06-11 01:00:35 +0900
committerJun Hiroe <[email protected]>2014-06-11 01:00:35 +0900
commit9c259c501a619d7e1ca34f5092fbbe4e6c9d40b9 (patch)
treebe1e0817bc426efc291d78ce4f3288f4d4fcd43f
parentfe95f4401390a88b26e9c8cf6d20c217e577a17f (diff)
downloadmruby-9c259c501a619d7e1ca34f5092fbbe4e6c9d40b9.tar.gz
mruby-9c259c501a619d7e1ca34f5092fbbe4e6c9d40b9.zip
Add NOFREE macros
-rw-r--r--include/mruby/string.h4
-rw-r--r--mrbgems/mruby-string-ext/src/string.c4
-rw-r--r--src/string.c12
3 files changed, 12 insertions, 8 deletions
diff --git a/include/mruby/string.h b/include/mruby/string.h
index 05afc794e..f8a1fa7bd 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -55,6 +55,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_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)
+
#define mrb_str_ptr(s) ((struct RString*)(mrb_ptr(s)))
#define RSTRING(s) mrb_str_ptr(s)
#define RSTRING_PTR(s) RSTR_PTR(RSTRING(s))
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c
index 48146944d..9c172081b 100644
--- a/mrbgems/mruby-string-ext/src/string.c
+++ b/mrbgems/mruby-string-ext/src/string.c
@@ -254,8 +254,8 @@ mrb_str_clear(mrb_state *mrb, mrb_value str)
struct RString *s = mrb_str_ptr(str);
if (!RSTR_SHARED_P(s) && !RSTR_EMBED_P(s)) {
- if (s->flags & MRB_STR_NOFREE) {
- s->flags &= ~MRB_STR_NOFREE;
+ if (RSTR_NOFREE_P(s)) {
+ RSTR_UNSET_NOFREE_FLAG(s);
}
else {
mrb_free(mrb, s->as.heap.ptr);
diff --git a/src/string.c b/src/string.c
index 734bf739a..6d2799270 100644
--- a/src/string.c
+++ b/src/string.c
@@ -106,7 +106,7 @@ mrb_str_modify(mrb_state *mrb, struct RString *s)
RSTR_UNSET_SHARED_FLAG(s);
return;
}
- if (s->flags & MRB_STR_NOFREE) {
+ if (RSTR_NOFREE_P(s)) {
char *p = s->as.heap.ptr;
s->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)s->as.heap.len+1);
@@ -115,7 +115,7 @@ mrb_str_modify(mrb_state *mrb, struct RString *s)
}
RSTR_PTR(s)[s->as.heap.len] = '\0';
s->as.heap.aux.capa = s->as.heap.len;
- s->flags &= ~MRB_STR_NOFREE;
+ RSTR_UNSET_NOFREE_FLAG(s);
return;
}
}
@@ -302,7 +302,7 @@ mrb_gc_free_str(mrb_state *mrb, struct RString *str)
/* no code */;
else if (RSTR_SHARED_P(str))
str_decref(mrb, str->as.heap.aux.shared);
- else if ((str->flags & MRB_STR_NOFREE) == 0)
+ else if (RSTR_NOFREE_P(str) == 0)
mrb_free(mrb, str->as.heap.ptr);
}
@@ -340,10 +340,10 @@ str_make_shared(mrb_state *mrb, struct RString *s)
shared->nofree = FALSE;
shared->ptr = s->as.heap.ptr;
}
- else if (s->flags & MRB_STR_NOFREE) {
+ else if (RSTR_NOFREE_P(s)) {
shared->nofree = TRUE;
shared->ptr = s->as.heap.ptr;
- s->flags &= ~MRB_STR_NOFREE;
+ RSTR_UNSET_NOFREE_FLAG(s);
}
else {
shared->nofree = FALSE;
@@ -1373,7 +1373,7 @@ str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2)
if (RSTR_SHARED_P(s1)) {
str_decref(mrb, s1->as.heap.aux.shared);
}
- else if (!RSTR_EMBED_P(s1) && !(s1->flags & MRB_STR_NOFREE)) {
+ else if (!RSTR_EMBED_P(s1) && !RSTR_NOFREE_P(s1)) {
mrb_free(mrb, s1->as.heap.ptr);
}
RSTR_UNSET_EMBED_FLAG(s1);