From be1d2c5f685d56e10239565e5eefba191de0e0be Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 11 Jul 2002 08:22:18 +0000 Subject: * string.c (rb_str_slice_bang): if there's no corresponding substring, slice! should return nil without exception. * array.c (rb_ary_insert): type fixed. * string.c (rb_str_split_m): accept separator value nil as well. * string.c (rb_str_become): was leaking memory. * class.c (rb_include_module): should not alter other classes/modules by inclusion. by this fix, local order may not be preserved for some cases. * class.c (include_class_new): module may be T_ICLASS; retrieve original module information. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2632 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 110 +++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 58 insertions(+), 52 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index 9894423f80..9aeb7ef800 100644 --- a/string.c +++ b/string.c @@ -56,18 +56,22 @@ str_new(klass, ptr, len) const char *ptr; long len; { - VALUE str = rb_obj_alloc(klass); + VALUE str; if (len < 0) { rb_raise(rb_eArgError, "negative string size (or size too big)"); } + str = rb_obj_alloc(klass); RSTRING(str)->len = len; RSTRING(str)->aux.capa = len; RSTRING(str)->ptr = ALLOC_N(char,len+1); if (ptr) { memcpy(RSTRING(str)->ptr, ptr, len); } + else { + MEMZERO(RSTRING(str)->ptr, char, len); + } RSTRING(str)->ptr[len] = '\0'; return str; } @@ -176,8 +180,9 @@ rb_str_buf_new(capa) { VALUE str = rb_obj_alloc(rb_cString); - if (capa < STR_BUF_MIN_SIZE) + if (capa < STR_BUF_MIN_SIZE) { capa = STR_BUF_MIN_SIZE; + } RSTRING(str)->ptr = 0; RSTRING(str)->len = 0; RSTRING(str)->aux.capa = capa; @@ -194,8 +199,8 @@ rb_str_buf_new2(ptr) VALUE str; long len = strlen(ptr); - str = rb_str_buf_new(len + STR_BUF_MIN_SIZE); - rb_str_cat(str, ptr, len); + str = rb_str_buf_new(len); + rb_str_buf_cat(str, ptr, len); return str; } @@ -212,13 +217,13 @@ rb_str_become(str, str2) VALUE str, str2; { if (str == str2) return; + if (!FL_TEST(str, ELTS_SHARED)) free(RSTRING(str)->ptr); if (NIL_P(str2)) { RSTRING(str)->ptr = 0; RSTRING(str)->len = 0; RSTRING(str)->aux.capa = 0; return; } - if (FL_TEST(str, ELTS_SHARED)) free(RSTRING(str)->ptr); RSTRING(str)->ptr = RSTRING(str2)->ptr; RSTRING(str)->len = RSTRING(str2)->len; if (FL_TEST(str2, ELTS_SHARED|STR_ASSOC)) { @@ -800,51 +805,6 @@ rb_str_casecmp(str1, str2) return INT2FIX(-1); } -static VALUE -rb_str_match(x, y) - VALUE x, y; -{ - VALUE reg; - long start; - - switch (TYPE(y)) { - case T_REGEXP: - return rb_reg_match(y, x); - - case T_STRING: - reg = rb_reg_regcomp(y); - start = rb_reg_search(reg, x, 0, 0); - if (start == -1) { - return Qnil; - } - return INT2NUM(start); - - default: - return rb_funcall(y, rb_intern("=~"), 1, x); - } -} - -static VALUE -rb_str_match2(str) - VALUE str; -{ - StringValue(str); - return rb_reg_match2(rb_reg_regcomp(str)); -} - -static VALUE -rb_str_match_m(str, re) - VALUE str, re; -{ - VALUE str2 = rb_check_convert_type(re, T_STRING, "String", "to_str"); - - if (!NIL_P(str2)) { - StringValue(re); - re = rb_reg_regcomp(re); - } - return rb_funcall(re, rb_intern("match"), 1, str); -} - static long rb_str_index(str, sub, offset) VALUE str, sub; @@ -1009,6 +969,50 @@ rb_str_rindex(argc, argv, str) return Qnil; } +static VALUE +rb_str_match(x, y) + VALUE x, y; +{ + VALUE reg; + long start; + + switch (TYPE(y)) { + case T_REGEXP: + return rb_reg_match(y, x); + + case T_STRING: + start = rb_str_index(reg, x, 0); + if (start == -1) { + return Qnil; + } + return INT2NUM(start); + + default: + return rb_funcall(y, rb_intern("=~"), 1, x); + } +} + +static VALUE +rb_str_match2(str) + VALUE str; +{ + StringValue(str); + return rb_reg_match2(rb_reg_regcomp(str)); +} + +static VALUE +rb_str_match_m(str, re) + VALUE str, re; +{ + VALUE str2 = rb_check_convert_type(re, T_STRING, "String", "to_str"); + + if (!NIL_P(str2)) { + StringValue(re); + re = rb_reg_regcomp(re); + } + return rb_funcall(re, rb_intern("match"), 1, str); +} + static char succ_char(s) char *s; @@ -1384,7 +1388,9 @@ rb_str_slice_bang(argc, argv, str) } buf[i] = rb_str_new(0,0); result = rb_str_aref_m(argc, buf, str); - rb_str_aset_m(argc+1, buf, str); + if (!NIL_P(result)) { + rb_str_aset_m(argc+1, buf, str); + } return result; } @@ -2456,7 +2462,7 @@ rb_str_split_m(argc, argv, str) i = 1; } - if (argc == 0) { + if (NIL_P(spat)) { if (!NIL_P(rb_fs)) { spat = rb_fs; goto fs_set; -- cgit v1.2.3