summaryrefslogtreecommitdiffhomepage
path: root/src/string.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-06-07 16:47:03 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-06-07 16:47:03 +0900
commit24b02955d362fcb7962ccf874158550c1f67aaa2 (patch)
treed0608206e9bcb74d5848ffd29c07747c26c9071c /src/string.c
parentd3fda42eb62b4132eb91fb75acc28d3218415c8b (diff)
parent9709fe79a3a75eefc92329cc0b74e159ff31525f (diff)
downloadmruby-24b02955d362fcb7962ccf874158550c1f67aaa2.tar.gz
mruby-24b02955d362fcb7962ccf874158550c1f67aaa2.zip
git push origin masterMerge branch 'suzukaze-add-string.clear2'
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/string.c b/src/string.c
index 842e83d76..6fa9271e1 100644
--- a/src/string.c
+++ b/src/string.c
@@ -2523,6 +2523,38 @@ mrb_str_bytes(mrb_state *mrb, mrb_value str)
return a;
}
+static inline void
+str_discard(mrb_state *mrb, mrb_value str) {
+ struct RString *s = mrb_str_ptr(str);
+
+ if (!STR_SHARED_P(s) && !STR_EMBED_P(s) && ((s->flags & MRB_STR_NOFREE) == 0)) {
+ mrb_free(mrb, s->as.heap.ptr);
+ RSTRING(str)->as.heap.ptr = 0;
+ RSTRING(str)->as.heap.len = 0;
+ }
+}
+
+/*
+ * call-seq:
+ * string.clear -> string
+ *
+ * Makes string empty.
+ *
+ * a = "abcde"
+ * a.clear #=> ""
+ */
+static mrb_value
+mrb_str_clear(mrb_state *mrb, mrb_value str)
+{
+ struct RString *s = mrb_str_ptr(str);
+
+ str_discard(mrb, str);
+ STR_SET_EMBED_FLAG(s);
+ STR_SET_EMBED_LEN(s, 0);
+ RSTRING_PTR(str)[0] = '\0';
+ return str;
+}
+
/* ---------------------------*/
void
mrb_init_string(mrb_state *mrb)
@@ -2574,4 +2606,5 @@ mrb_init_string(mrb_state *mrb)
mrb_define_method(mrb, s, "upcase!", mrb_str_upcase_bang, MRB_ARGS_REQ(1)); /* 15.2.10.5.43 */
mrb_define_method(mrb, s, "inspect", mrb_str_inspect, MRB_ARGS_NONE()); /* 15.2.10.5.46(x) */
mrb_define_method(mrb, s, "bytes", mrb_str_bytes, MRB_ARGS_NONE());
+ mrb_define_method(mrb, s, "clear", mrb_str_clear, MRB_ARGS_NONE());
}