From a4fce2fabf06a1b1f9438148376b35e3dffd3eb5 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 25 Feb 2000 03:51:23 +0000 Subject: 2000-02-25 git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@627 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index 1040b7c40..d8ba51e73 100644 --- a/string.c +++ b/string.c @@ -421,29 +421,39 @@ rb_str_hash(str) register char *p = RSTRING(str)->ptr; register int key = 0; -#if 0 +#ifdef HASH_ELFHASH + register unsigned int g; + + while (len--) { + key = (key << 4) + *p++; + if (g = key & 0xF0000000) + key ^= g >> 24; + key &= ~g; + } +#elif HASH_PERL if (ruby_ignorecase) { while (len--) { - key = key*65599 + toupper(*p); + key = key*33 + toupper(*p); p++; } } else { while (len--) { - key = key*65599 + *p; - p++; + key = key*33 + *p++; } } + key = key + (key>>5); #else if (ruby_ignorecase) { while (len--) { - key = key*33 + toupper(*p); + key = key*65599 + toupper(*p); p++; } } else { while (len--) { - key = key*33 + *p++; + key = key*65599 + *p; + p++; } } key = key + (key>>5); @@ -943,16 +953,13 @@ rb_str_aset_m(argc, argv, str) VALUE *argv; VALUE str; { - VALUE arg1, arg2, arg3; - rb_str_modify(str); - - if (rb_scan_args(argc, argv, "21", &arg1, &arg2, &arg3) == 3) { + if (argc == 3) { int beg, len; - if (TYPE(arg3) != T_STRING) arg3 = rb_str_to_str(arg3); - beg = NUM2INT(arg1); - len = NUM2INT(arg2); + 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; @@ -966,10 +973,10 @@ rb_str_aset_m(argc, argv, str) if (beg + len > RSTRING(str)->len) { len = RSTRING(str)->len - beg; } - rb_str_replace(str, beg, len, arg3); - return arg3; + rb_str_replace(str, beg, len, argv[2]); + return argv[2]; } - return rb_str_aset(str, arg1, arg2); + return rb_str_aset(str, argv[0], argv[1]); } static VALUE -- cgit