summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'string.c')
-rw-r--r--string.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/string.c b/string.c
index 1040b7c405..d8ba51e738 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