diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-05-02 04:22:21 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-05-02 04:22:21 +0000 |
commit | fd06a2a7fbcaf995b662575f894a0f6ecd1be175 (patch) | |
tree | c229682c4c4c2ee56c973aa372d1a6eef7f5db14 /string.c | |
parent | 902524c35b84e6473498969ee89181052a92da5c (diff) | |
download | ruby-fd06a2a7fbcaf995b662575f894a0f6ecd1be175.tar.gz |
* eval.c (block_pass): should not downgrade safe level.
* ext/dbm/extconf.rb: allow specifying dbm-type explicitly.
* ext/dbm/extconf.rb: avoid gdbm if possible, because it leaks
memory, whereas gdbm.so doesn't. potential incompatibility.
* string.c (rb_str_insert): new method.
* parse.y (yylex): lex_state after RESCUE_MOD should be EXPR_BEG.
* array.c (rb_ary_insert): new method.
* array.c (rb_ary_update): new utility function.
* io.c (set_outfile): should check if closed before assignment.
* eval.c (rb_eval): should preserve value of ruby_errinfo.
* eval.c (rb_thread_schedule): infinite sleep should not cause
dead lock.
* array.c (rb_ary_flatten_bang): proper recursive detection.
* eval.c (yield_under): need not to prohibit at safe level 4.
* pack.c (pack_pack): p/P packs nil into NULL.
* pack.c (pack_unpack): p/P unpacks NULL into nil.
* pack.c (pack_pack): size check for P template.
* ruby.c (set_arg0): wrong predicate when new $0 value is bigger
than original space.
* gc.c (id2ref): should use NUM2ULONG()
* object.c (rb_mod_const_get): check whether name is a class
variable name.
* object.c (rb_mod_const_set): ditto.
* object.c (rb_mod_const_defined): ditto.
* marshal.c (w_float): precision changed to "%.16g"
* eval.c (rb_call0): wrong retry behavior.
* numeric.c (fix_aref): a bug on long>int architecture.
* eval.c (rb_eval_string_wrap): should restore ruby_wrapper.
* regex.c (re_compile_pattern): char class at either edge of range
should be invalid.
* eval.c (handle_rescue): use === to compare exception match.
* error.c (syserr_eqq): comparison between SytemCallErrors should
based on their error numbers.
* eval.c (safe_getter): should use INT2NUM().
* bignum.c (rb_big2long): 2**31 cannot fit in 31 bit long.
* regex.c (calculate_must_string): wrong length calculation.
* eval.c (rb_thread_start_0): fixed memory leak.
* parse.y (none): should clear cmdarg_stack too.
* io.c (rb_fopen): use setvbuf() to avoid recursive malloc() on
some platforms.
* file.c (rb_stat_dev): device functions should honor stat field
types (except long long such as dev_t).
* eval.c (rb_mod_nesting): should not push nil for nesting array.
* eval.c (rb_mod_s_constants): should not search array by
rb_mod_const_at() for nil (happens for singleton class).
* class.c (rb_singleton_class_attached): should modify iv_tbl by
itself, no longer use rb_iv_set() to avoid freeze check error.
* variable.c (rb_const_get): error message "uninitialized constant
Foo at Bar::Baz" instead of "uninitialized constantBar::Baz::Foo".
* eval.c (rb_mod_included): new hook called from rb_mod_include().
* io.c (opt_i_set): should strdup() inplace_edit string.
* eval.c (exec_under): need to push cref too.
* eval.c (rb_f_missing): raise NameError for "undefined local
variable or method".
* error.c (Init_Exception): new exception NoMethodError.
NameError moved under ScriptError again.
* eval.c (rb_f_missing): use NoMethodError instead of NameError.
* file.c (Init_File): should redifine "new" class method.
* eval.c (PUSH_CREF): sharing cref node was problematic. maintain
runtime cref list instead.
* eval.c (rb_eval): copy defn node before registering.
* eval.c (rb_load): clear ruby_cref before loading.
* variable.c (rb_const_get): no recursion to show full class path
for modules.
* eval.c (rb_set_safe_level): should set safe level in curr_thread
as well.
* eval.c (safe_setter): ditto.
* object.c (rb_obj_is_instance_of): nil belongs to false, not true.
* time.c (make_time_t): proper (I hope) daylight saving time
handling for both US and Europe. I HATE DST!
* eval.c (rb_thread_wait_for): non blocked signal interrupt should
stop the interval.
* eval.c (proc_eq): class check aded.
* eval.c (proc_eq): typo fixed ("return" was ommitted).
* error.c (Init_Exception): move NameError under StandardError.
* class.c (rb_mod_clone): should copy method bodies too.
* bignum.c (bigdivrem): should trim trailing zero bdigits of
remainder, even if dd == 0.
* file.c (check3rdbyte): safe string check moved here.
* time.c (make_time_t): remove HAVE_TM_ZONE code since it
sometimes reports wrong time.
* time.c (make_time_t): remove unnecessary range check for
platforms where negative time_t is available.
* process.c (proc_waitall): should push Process::Status instead of
Finuxm status.
* process.c (waitall_each): should add all entries in pid_tbl.
these changes are inspired by Koji Arai. Thanks.
* process.c (proc_wait): should not iterate if pid_tbl is 0.
* process.c (proc_waitall): ditto.
* numeric.c (flodivmod): a bug in no fmod case.
* process.c (pst_wifsignaled): should apply WIFSIGNALED for status
(int), not st (VALUE).
* io.c (Init_IO): value of $/ and $\ are no longer restricted to
strings. type checks are done on demand.
* class.c (rb_include_module): module inclusion should be check
taints.
* ruby.h (STR2CSTR): replace to StringType() and StringTypePtr().
* ruby.h (rb_str2cstr): ditto.
* eval.c (rb_load): should not copy topleve local variables. It
cause variable/method ambiguity. Thanks to L. Peter Deutsch.
* class.c (rb_include_module): freeze check at first.
* eval.c (rb_attr): sprintf() and rb_intern() moved into
conditional body.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1356 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r-- | string.c | 85 |
1 files changed, 42 insertions, 43 deletions
@@ -209,7 +209,7 @@ rb_str_dup(str) VALUE str2; VALUE klass; - if (TYPE(str) != T_STRING) str = rb_str_to_str(str); + StringValue(str); klass = CLASS_OF(str); while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) { klass = (VALUE)RCLASS(klass)->super; @@ -278,7 +278,7 @@ rb_str_plus(str1, str2) { VALUE str3; - if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2); + StringValue(str2); str3 = rb_str_new(0, RSTRING(str1)->len+RSTRING(str2)->len); memcpy(RSTRING(str3)->ptr, RSTRING(str1)->ptr, RSTRING(str1)->len); memcpy(RSTRING(str3)->ptr + RSTRING(str1)->len, @@ -470,7 +470,7 @@ VALUE rb_str_append(str1, str2) VALUE str1, str2; { - if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2); + StringValue(str2); str1 = rb_str_cat(str1, RSTRING(str2)->ptr, RSTRING(str2)->len); OBJ_INFECT(str1, str2); @@ -590,7 +590,7 @@ rb_str_cmp_m(str1, str2) { int result; - if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2); + StringValue(str2); result = rb_str_cmp(str1, str2); return INT2FIX(result); } @@ -865,8 +865,7 @@ rb_str_upto(beg, end, excl) VALUE current; ID succ = rb_intern("succ"); - if (TYPE(end) != T_STRING) end = rb_str_to_str(end); - + StringValue(end); current = beg; while (rb_str_cmp(current, end) <= 0) { rb_yield(current); @@ -952,14 +951,26 @@ rb_str_aref_m(argc, argv, str) static void rb_str_replace(str, beg, len, val) - VALUE str, val; + VALUE str; long beg; long len; + VALUE val; { + if (len < 0) rb_raise(rb_eIndexError, "negative length %d", len); + if (beg < 0) { + beg += RSTRING(str)->len; + } + if (beg < 0 || RSTRING(str)->len < beg) { + if (beg < 0) { + beg -= RSTRING(str)->len; + } + rb_raise(rb_eIndexError, "index %d out of string", beg); + } if (RSTRING(str)->len < beg + len) { len = RSTRING(str)->len - beg; } + StringValue(val); if (len < RSTRING(val)->len) { /* expand string */ REALLOC_N(RSTRING(str)->ptr, char, RSTRING(str)->len+RSTRING(val)->len-len+1); @@ -1007,7 +1018,6 @@ rb_str_aset(str, indx, val) RSTRING(str)->ptr[idx] = NUM2INT(val) & 0xff; } else { - if (TYPE(val) != T_STRING) val = rb_str_to_str(val); rb_str_replace(str, idx, 1, val); } return val; @@ -1024,7 +1034,6 @@ rb_str_aset(str, indx, val) case T_STRING: beg = rb_str_index(str, indx, 0); if (beg != -1) { - if (TYPE(val) != T_STRING) val = rb_str_to_str(val); rb_str_replace(str, beg, RSTRING(indx)->len, val); } return val; @@ -1034,7 +1043,6 @@ rb_str_aset(str, indx, val) { long beg, len; if (rb_range_beg_len(indx, &beg, &len, RSTRING(str)->len, 2)) { - if (TYPE(val) != T_STRING) val = rb_str_to_str(val); rb_str_replace(str, beg, len, val); return val; } @@ -1054,22 +1062,8 @@ rb_str_aset_m(argc, argv, str) if (argc == 3) { long beg, len; - if (TYPE(argv[2]) != T_STRING) argv[2] = rb_str_to_str(argv[2]); beg = NUM2INT(argv[0]); len = NUM2INT(argv[1]); - if (len < 0) rb_raise(rb_eIndexError, "negative length %d", len); - if (beg < 0) { - beg += RSTRING(str)->len; - } - if (beg < 0 || RSTRING(str)->len < beg) { - if (beg < 0) { - beg -= RSTRING(str)->len; - } - rb_raise(rb_eIndexError, "index %d out of string", beg); - } - if (beg + len > RSTRING(str)->len) { - len = RSTRING(str)->len - beg; - } rb_str_replace(str, beg, len, argv[2]); return argv[2]; } @@ -1080,6 +1074,14 @@ rb_str_aset_m(argc, argv, str) } static VALUE +rb_str_insert(str, idx, str2) + VALUE str, idx, str2; +{ + rb_str_replace(str, NUM2LONG(idx), 0, str2); + return str; +} + +static VALUE rb_str_slice_bang(argc, argv, str) int argc; VALUE *argv; @@ -1136,7 +1138,8 @@ rb_str_sub_bang(argc, argv, str) iter = 1; } else if (argc == 2) { - repl = rb_str_to_str(argv[1]);; + repl = argv[1]; + StringValue(repl); if (OBJ_TAINTED(repl)) tainted = 1; } else { @@ -1209,7 +1212,8 @@ str_gsub(argc, argv, str, bang) iter = 1; } else if (argc == 2) { - repl = rb_str_to_str(argv[1]); + repl = argv[1]; + StringValue(repl); if (OBJ_TAINTED(repl)) tainted = 1; } else { @@ -1329,8 +1333,8 @@ rb_str_replace_m(str, str2) VALUE str, str2; { if (str == str2) return str; - if (TYPE(str2) != T_STRING) str2 = rb_str_to_str(str2); + StringValue(str2); if (RSTRING(str2)->orig && !FL_TEST(str2, STR_NO_ORIG)) { if (str_independent(str)) { free(RSTRING(str)->ptr); @@ -1462,7 +1466,7 @@ rb_str_include(str, arg) return Qfalse; } - if (TYPE(arg) != T_STRING) arg = rb_str_to_str(arg); + StringValue(arg); i = rb_str_index(str, arg, 0); if (i == -1) return Qfalse; @@ -1841,13 +1845,13 @@ tr_trans(str, src, repl, sflag) char *s, *send; rb_str_modify(str); - if (TYPE(src) != T_STRING) src = rb_str_to_str(src); + StringValue(src); + StringValue(repl); trsrc.p = RSTRING(src)->ptr; trsrc.pend = trsrc.p + RSTRING(src)->len; if (RSTRING(src)->len >= 2 && RSTRING(src)->ptr[0] == '^') { cflag++; trsrc.p++; } - if (TYPE(repl) != T_STRING) repl = rb_str_to_str(repl); if (RSTRING(repl)->len == 0) { return rb_str_delete_bang(1, &src, str); } @@ -1991,8 +1995,7 @@ rb_str_delete_bang(argc, argv, str) for (i=0; i<argc; i++) { VALUE s = argv[i]; - if (TYPE(s) != T_STRING) - s = rb_str_to_str(s); + StringValue(s); tr_setup_table(s, squeez, init); init = 0; } @@ -2046,8 +2049,7 @@ rb_str_squeeze_bang(argc, argv, str) for (i=0; i<argc; i++) { VALUE s = argv[i]; - if (TYPE(s) != T_STRING) - s = rb_str_to_str(s); + StringValue(s); tr_setup_table(s, squeez, init); init = 0; } @@ -2118,8 +2120,7 @@ rb_str_count(argc, argv, str) for (i=0; i<argc; i++) { VALUE s = argv[i]; - if (TYPE(s) != T_STRING) - s = rb_str_to_str(s); + StringValue(s); tr_setup_table(s, table, init); init = 0; } @@ -2284,7 +2285,7 @@ rb_str_split(str, sep0) { VALUE sep; - if (TYPE(str) != T_STRING) str = rb_str_to_str(str); + StringValue(str); sep = rb_str_new2(sep0); return rb_str_split_m(1, &sep, str); } @@ -2319,10 +2320,7 @@ rb_str_each_line(argc, argv, str) rb_yield(str); return str; } - if (TYPE(rs) != T_STRING) { - rs = rb_str_to_str(rs); - } - + StringValue(rs); rslen = RSTRING(rs)->len; if (rslen == 0) { newline = '\n'; @@ -2434,7 +2432,7 @@ rb_str_chomp_bang(argc, argv, str) } if (NIL_P(rs)) return Qnil; - if (TYPE(rs) != T_STRING) rs = rb_str_to_str(rs); + StringValue(rs); rslen = RSTRING(rs)->len; if (rslen == 0) { while (len>0 && p[len-1] == '\n') { @@ -2645,7 +2643,7 @@ rb_str_crypt(str, salt) { extern char *crypt(); - if (TYPE(salt) != T_STRING) salt = rb_str_to_str(salt); + StringValue(salt); if (RSTRING(salt)->len < 2) rb_raise(rb_eArgError, "salt too short(need >=2 bytes)"); return rb_str_new2(crypt(RSTRING(str)->ptr, RSTRING(salt)->ptr)); @@ -2804,6 +2802,7 @@ Init_String() rb_define_method(rb_cString, "%", rb_str_format, 1); rb_define_method(rb_cString, "[]", rb_str_aref_m, -1); rb_define_method(rb_cString, "[]=", rb_str_aset_m, -1); + rb_define_method(rb_cString, "insert", rb_str_insert, 2); rb_define_method(rb_cString, "length", rb_str_length, 0); rb_define_method(rb_cString, "size", rb_str_length, 0); rb_define_method(rb_cString, "empty?", rb_str_empty, 0); |