From f463e9d3b74f6826ab2aa377a9fc071db662ef5d Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 27 Jun 2025 16:26:25 +0900 Subject: [PATCH] mruby-string-ext: implement String#clear in C Co-authored-by: Gemini --- mrbgems/mruby-string-ext/mrblib/string.rb | 14 -------------- mrbgems/mruby-string-ext/src/string.c | 21 ++++++++++++++++++++- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/mrbgems/mruby-string-ext/mrblib/string.rb b/mrbgems/mruby-string-ext/mrblib/string.rb index 70fb113b1..48604e873 100644 --- a/mrbgems/mruby-string-ext/mrblib/string.rb +++ b/mrbgems/mruby-string-ext/mrblib/string.rb @@ -1,19 +1,5 @@ class String - ## - # call-seq: - # string.clear -> string - # - # Makes string empty. - # - # a = "abcde" - # a.clear #=> "" - # - def clear - self.replace("") - end - - def partition(sep) raise TypeError, "type mismatch: #{sep.class} given" unless sep.is_a? String n = index(sep) diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index dac6d03df..2d62553dc 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -1984,6 +1984,24 @@ mrb_str_slice_bang(mrb_state *mrb, mrb_value self) return result; } +/* + * call-seq: + * string.clear -> string + * + * Makes string empty. + * + * a = "abcde" + * a.clear #=> "" + */ +static mrb_value +str_clear(mrb_state *mrb, mrb_value self) +{ + struct RString *s = mrb_str_ptr(self); + mrb_str_modify(mrb, s); + RSTR_SET_LEN(s, 0); + return self; +} + /* * call-seq: * str.partition(sep) -> [head, sep, tail] @@ -2163,8 +2181,9 @@ mrb_mruby_string_ext_gem_init(mrb_state* mrb) mrb_define_method_id(mrb, s, MRB_SYM_B(swapcase), str_swapcase_bang, MRB_ARGS_NONE()); mrb_define_method_id(mrb, s, MRB_SYM_B(slice), mrb_str_slice_bang, MRB_ARGS_ARG(1, 1)); mrb_define_method_id(mrb, s, MRB_SYM(swapcase), str_swapcase, MRB_ARGS_NONE()); - mrb_define_method_id(mrb, s, MRB_SYM(concat), str_concat_m, MRB_ARGS_REQ(1)); + mrb_define_method_id(mrb, s, MRB_SYM(clear), str_clear, MRB_ARGS_NONE()); mrb_define_method_id(mrb, s, MRB_OPSYM(lshift), str_concat_m, MRB_ARGS_REQ(1)); + mrb_define_method_id(mrb, s, MRB_SYM(concat), str_concat_m, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, s, MRB_SYM(append_as_bytes), str_append_as_bytes, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, s, MRB_SYM(count), str_count, MRB_ARGS_REQ(1)); mrb_define_method_id(mrb, s, MRB_SYM(tr), str_tr_m, MRB_ARGS_REQ(2));