From f4be2ca564309bb4a52b634c91923764259834ec Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 9 May 2009 03:19:52 +0000 Subject: [PATCH] * hash.c: 3rd arguemnt of rb_hash_foreach() is VALUE. * hash.c (rb_any_hash, recursive_hash): use VALUE for hash. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23372 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 +++++ hash.c | 77 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 53 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e4d14ca71..b95b1c1a81 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat May 9 12:19:49 2009 Nobuyoshi Nakada + + * hash.c: 3rd arguemnt of rb_hash_foreach() is VALUE. + + * hash.c (rb_any_hash, recursive_hash): use VALUE for hash. + Sat May 9 11:14:50 2009 Nobuyoshi Nakada * vm_eval.c (rb_f_catch): gets rid of issue with gcc 4.4. a patch diff --git a/hash.c b/hash.c index 214143ce13..79e253e266 100644 --- a/hash.c +++ b/hash.c @@ -76,7 +76,7 @@ static int rb_any_hash(VALUE a) { VALUE hval; - int hnum; + VALUE hnum; switch (TYPE(a)) { case T_FIXNUM: @@ -93,10 +93,10 @@ rb_any_hash(VALUE a) default: hval = rb_hash(a); - hnum = (int)FIX2LONG(hval); + hnum = FIX2LONG(hval); } hnum <<= 1; - return RSHIFT(hnum, 1); + return (int)RSHIFT(hnum, 1); } static const struct st_hash_type objhash = { @@ -410,8 +410,10 @@ rb_hash_s_try_convert(VALUE dummy, VALUE hash) } static int -rb_hash_rehash_i(VALUE key, VALUE value, st_table *tbl) +rb_hash_rehash_i(VALUE key, VALUE value, VALUE arg) { + st_table *tbl = (st_table *)arg; + if (key != Qundef) st_insert(tbl, key, value); return ST_CONTINUE; } @@ -448,7 +450,7 @@ rb_hash_rehash(VALUE hash) if (!RHASH(hash)->ntbl) return hash; tbl = st_init_table_with_size(RHASH(hash)->ntbl->type, RHASH(hash)->ntbl->num_entries); - rb_hash_foreach(hash, rb_hash_rehash_i, (st_data_t)tbl); + rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tbl); st_free_table(RHASH(hash)->ntbl); RHASH(hash)->ntbl = tbl; @@ -676,8 +678,10 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc) } static int -key_i(VALUE key, VALUE value, VALUE *args) +key_i(VALUE key, VALUE value, VALUE arg) { + VALUE *args = (VALUE *)arg; + if (rb_equal(value, args[0])) { args[1] = key; return ST_STOP; @@ -705,7 +709,7 @@ rb_hash_key(VALUE hash, VALUE value) args[0] = value; args[1] = Qnil; - rb_hash_foreach(hash, key_i, (st_data_t)args); + rb_hash_foreach(hash, key_i, (VALUE)args); return args[1]; } @@ -774,8 +778,10 @@ struct shift_var { }; static int -shift_i(VALUE key, VALUE value, struct shift_var *var) +shift_i(VALUE key, VALUE value, VALUE arg) { + struct shift_var *var = (struct shift_var *)arg; + if (key == Qundef) return ST_CONTINUE; if (var->key != Qundef) return ST_STOP; var->key = key; @@ -784,8 +790,10 @@ shift_i(VALUE key, VALUE value, struct shift_var *var) } static int -shift_i_safe(VALUE key, VALUE value, struct shift_var *var) +shift_i_safe(VALUE key, VALUE value, VALUE arg) { + struct shift_var *var = (struct shift_var *)arg; + if (key == Qundef) return ST_CONTINUE; var->key = key; var->val = value; @@ -813,7 +821,7 @@ rb_hash_shift(VALUE hash) rb_hash_modify(hash); var.key = Qundef; rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i, - (st_data_t)&var); + (VALUE)&var); if (var.key != Qundef) { if (RHASH(hash)->iter_lev > 0) { @@ -871,7 +879,7 @@ rb_hash_delete_if(VALUE hash) VALUE rb_hash_reject_bang(VALUE hash) { - int n; + st_index_t n; RETURN_ENUMERATOR(hash, 0, 0); if (!RHASH(hash)->ntbl) @@ -1378,8 +1386,10 @@ rb_hash_has_key(VALUE hash, VALUE key) } static int -rb_hash_search_value(VALUE key, VALUE value, VALUE *data) +rb_hash_search_value(VALUE key, VALUE value, VALUE arg) { + VALUE *data = (VALUE *)arg; + if (key == Qundef) return ST_CONTINUE; if (rb_equal(value, data[1])) { data[0] = Qtrue; @@ -1408,7 +1418,7 @@ rb_hash_has_value(VALUE hash, VALUE val) data[0] = Qfalse; data[1] = val; - rb_hash_foreach(hash, rb_hash_search_value, (st_data_t)data); + rb_hash_foreach(hash, rb_hash_search_value, (VALUE)data); return data[0]; } @@ -1419,8 +1429,9 @@ struct equal_data { }; static int -eql_i(VALUE key, VALUE val1, struct equal_data *data) +eql_i(VALUE key, VALUE val1, VALUE arg) { + struct equal_data *data = (struct equal_data *)arg; VALUE val2; if (key == Qundef) return ST_CONTINUE; @@ -1428,7 +1439,7 @@ eql_i(VALUE key, VALUE val1, struct equal_data *data) data->result = Qfalse; return ST_STOP; } - if (!(data->eql ? rb_eql(val1, val2) : rb_equal(val1, val2))) { + if (!(data->eql ? rb_eql(val1, val2) : (int)rb_equal(val1, val2))) { data->result = Qfalse; return ST_STOP; } @@ -1443,7 +1454,7 @@ recursive_eql(VALUE hash, VALUE dt, int recur) if (recur) return Qfalse; data = (struct equal_data*)dt; data->result = Qtrue; - rb_hash_foreach(hash, eql_i, (st_data_t)data); + rb_hash_foreach(hash, eql_i, dt); return data->result; } @@ -1520,8 +1531,10 @@ rb_hash_eql(VALUE hash1, VALUE hash2) } static int -hash_i(VALUE key, VALUE val, int *hval) +hash_i(VALUE key, VALUE val, VALUE arg) { + VALUE *hval = (VALUE *)arg; + if (key == Qundef) return ST_CONTINUE; *hval ^= rb_hash_end(rb_hash_uint(rb_hash_start(rb_hash(key)), rb_hash(val))); return ST_CONTINUE; @@ -1530,7 +1543,7 @@ hash_i(VALUE key, VALUE val, int *hval) static VALUE recursive_hash(VALUE hash, VALUE dummy, int recur) { - int hval; + VALUE hval; if (recur) { return LONG2FIX(0); @@ -1538,7 +1551,7 @@ recursive_hash(VALUE hash, VALUE dummy, int recur) if (!RHASH(hash)->ntbl) return LONG2FIX(0); hval = RHASH(hash)->ntbl->num_entries; - rb_hash_foreach(hash, hash_i, (st_data_t)&hval); + rb_hash_foreach(hash, hash_i, (VALUE)&hval); return INT2FIX(hval); } @@ -1663,8 +1676,10 @@ rb_hash_merge(VALUE hash1, VALUE hash2) } static int -assoc_i(VALUE key, VALUE val, VALUE *args) +assoc_i(VALUE key, VALUE val, VALUE arg) { + VALUE *args = (VALUE *)arg; + if (key == Qundef) return ST_CONTINUE; if (RTEST(rb_equal(args[0], key))) { args[1] = rb_assoc_new(key, val); @@ -1694,13 +1709,15 @@ rb_hash_assoc(VALUE hash, VALUE obj) args[0] = obj; args[1] = Qnil; - rb_hash_foreach(hash, assoc_i, (st_data_t)args); + rb_hash_foreach(hash, assoc_i, (VALUE)args); return args[1]; } static int -rassoc_i(VALUE key, VALUE val, VALUE *args) +rassoc_i(VALUE key, VALUE val, VALUE arg) { + VALUE *args = (VALUE *)arg; + if (key == Qundef) return ST_CONTINUE; if (RTEST(rb_equal(args[0], val))) { args[1] = rb_assoc_new(key, val); @@ -1729,7 +1746,7 @@ rb_hash_rassoc(VALUE hash, VALUE obj) args[0] = obj; args[1] = Qnil; - rb_hash_foreach(hash, rassoc_i, (st_data_t)args); + rb_hash_foreach(hash, rassoc_i, (VALUE)args); return args[1]; } @@ -1860,7 +1877,7 @@ env_delete(VALUE obj, VALUE name) rb_secure(4); SafeStringValue(name); nam = RSTRING_PTR(name); - if (strlen(nam) != RSTRING_LEN(name)) { + if (memchr(nam, '\0', RSTRING_LEN(name))) { rb_raise(rb_eArgError, "bad environment variable name"); } val = getenv(nam); @@ -1894,7 +1911,7 @@ rb_f_getenv(VALUE obj, VALUE name) rb_secure(4); SafeStringValue(name); nam = RSTRING_PTR(name); - if (strlen(nam) != RSTRING_LEN(name)) { + if (memchr(nam, '\0', RSTRING_LEN(name))) { rb_raise(rb_eArgError, "bad environment variable name"); } env = getenv(nam); @@ -1925,7 +1942,7 @@ env_fetch(int argc, VALUE *argv) } SafeStringValue(key); nam = RSTRING_PTR(key); - if (strlen(nam) != RSTRING_LEN(key)) { + if (memchr(nam, '\0', RSTRING_LEN(key))) { rb_raise(rb_eArgError, "bad environment variable name"); } env = getenv(nam); @@ -2065,9 +2082,9 @@ env_aset(VALUE obj, VALUE nm, VALUE val) StringValue(val); name = RSTRING_PTR(nm); value = RSTRING_PTR(val); - if (strlen(name) != RSTRING_LEN(nm)) + if (memchr(name, '\0', RSTRING_LEN(nm))) rb_raise(rb_eArgError, "bad environment variable name"); - if (strlen(value) != RSTRING_LEN(val)) + if (memchr(value, '\0', RSTRING_LEN(val))) rb_raise(rb_eArgError, "bad environment variable value"); ruby_setenv(name, value); @@ -2367,7 +2384,7 @@ env_has_key(VALUE env, VALUE key) rb_secure(4); s = StringValuePtr(key); - if (strlen(s) != RSTRING_LEN(key)) + if (memchr(s, '\0', RSTRING_LEN(key))) rb_raise(rb_eArgError, "bad environment variable name"); if (getenv(s)) return Qtrue; return Qfalse; @@ -2380,7 +2397,7 @@ env_assoc(VALUE env, VALUE key) rb_secure(4); s = StringValuePtr(key); - if (strlen(s) != RSTRING_LEN(key)) + if (memchr(s, '\0', RSTRING_LEN(key))) rb_raise(rb_eArgError, "bad environment variable name"); e = getenv(s); if (e) return rb_assoc_new(key, rb_tainted_str_new2(e));