diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-23 00:51:32 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-23 00:51:32 +0000 |
commit | f1f0f39e036daa8940996d2957f8756d4db08cdb (patch) | |
tree | 6217876c5f588c79c691c943566548c1e10ac61a /hash.c | |
parent | 2c179216717d75837de7a6ff092fd773670f4d11 (diff) | |
download | ruby-f1f0f39e036daa8940996d2957f8756d4db08cdb.tar.gz |
* hash.c (rb_hash_rehash): replace st_foreach() by its deep
checking counterpart. [ruby-dev:24310]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6953 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 75 |
1 files changed, 38 insertions, 37 deletions
@@ -104,16 +104,16 @@ static struct st_hash_type objhash = { rb_any_hash, }; -struct rb_hash_foreach_arg { +struct hash_foreach_arg { VALUE hash; enum st_retval (*func)(); VALUE arg; }; static int -rb_hash_foreach_iter(key, value, arg, err) +hash_foreach_iter(key, value, arg, err) VALUE key, value; - struct rb_hash_foreach_arg *arg; + struct hash_foreach_arg *arg; int err; { int status; @@ -141,15 +141,7 @@ rb_hash_foreach_iter(key, value, arg, err) } static VALUE -rb_hash_foreach_call(arg) - struct rb_hash_foreach_arg *arg; -{ - st_foreach(RHASH(arg->hash)->tbl, rb_hash_foreach_iter, (st_data_t)arg); - return Qnil; -} - -static VALUE -rb_hash_foreach_ensure(hash) +hash_foreach_ensure(hash) VALUE hash; { RHASH(hash)->iter_lev--; @@ -163,22 +155,31 @@ rb_hash_foreach_ensure(hash) return 0; } +static VALUE +hash_foreach_call(arg) + struct hash_foreach_arg *arg; +{ + st_foreach(RHASH(arg->hash)->tbl, hash_foreach_iter, (st_data_t)arg); + return Qnil; +} + static int -rb_hash_foreach(hash, func, farg) +hash_foreach(hash, func, farg) VALUE hash; enum st_retval (*func)(); VALUE farg; { - struct rb_hash_foreach_arg arg; + struct hash_foreach_arg arg; RHASH(hash)->iter_lev++; arg.hash = hash; arg.func = func; arg.arg = farg; - return rb_ensure(rb_hash_foreach_call, (VALUE)&arg, rb_hash_foreach_ensure, hash); + return rb_ensure(hash_foreach_call, (VALUE)&arg, hash_foreach_ensure, hash); } static VALUE hash_alloc _((VALUE)); + static VALUE hash_alloc(klass) VALUE klass; @@ -357,7 +358,7 @@ rb_hash_rehash(hash) } rb_hash_modify(hash); tbl = st_init_table_with_size(&objhash, RHASH(hash)->tbl->num_entries); - st_foreach(RHASH(hash)->tbl, rb_hash_rehash_i, (st_data_t)tbl); + hash_foreach(hash, rb_hash_rehash_i, (st_data_t)tbl); st_free_table(RHASH(hash)->tbl); RHASH(hash)->tbl = tbl; @@ -569,7 +570,7 @@ rb_hash_key(hash, value) args[0] = value; args[1] = Qnil; - st_foreach(RHASH(hash)->tbl, key_i, (st_data_t)args); + hash_foreach(hash, key_i, (st_data_t)args); return args[1]; } @@ -661,7 +662,7 @@ rb_hash_shift(hash) rb_hash_modify(hash); var.stop = 0; - st_foreach(RHASH(hash)->tbl, shift_i, (st_data_t)&var); + hash_foreach(hash, shift_i, (st_data_t)&var); if (var.stop) { return rb_assoc_new(var.key, var.val); @@ -702,7 +703,7 @@ rb_hash_delete_if(hash) VALUE hash; { rb_hash_modify(hash); - rb_hash_foreach(hash, delete_if_i, hash); + hash_foreach(hash, delete_if_i, hash); return hash; } @@ -797,7 +798,7 @@ rb_hash_select(hash) VALUE result; result = rb_ary_new(); - rb_hash_foreach(hash, select_i, result); + hash_foreach(hash, select_i, result); return result; } @@ -827,7 +828,7 @@ rb_hash_clear(hash) rb_hash_modify(hash); if (RHASH(hash)->tbl->num_entries > 0) { - st_foreach(RHASH(hash)->tbl, clear_i, 0); + hash_foreach(hash, clear_i, 0); } return hash; @@ -895,7 +896,7 @@ rb_hash_replace(hash, hash2) hash2 = to_hash(hash2); if (hash == hash2) return hash; rb_hash_clear(hash); - st_foreach(RHASH(hash2)->tbl, replace_i, hash); + hash_foreach(hash2, replace_i, hash); RHASH(hash)->ifnone = RHASH(hash2)->ifnone; if (FL_TEST(hash2, HASH_PROC_DEFAULT)) { FL_SET(hash, HASH_PROC_DEFAULT); @@ -976,7 +977,7 @@ static VALUE rb_hash_each_value(hash) VALUE hash; { - rb_hash_foreach(hash, each_value_i, 0); + hash_foreach(hash, each_value_i, 0); return hash; } @@ -1008,7 +1009,7 @@ static VALUE rb_hash_each_key(hash) VALUE hash; { - rb_hash_foreach(hash, each_key_i, 0); + hash_foreach(hash, each_key_i, 0); return hash; } @@ -1042,7 +1043,7 @@ static VALUE rb_hash_each_pair(hash) VALUE hash; { - rb_hash_foreach(hash, each_pair_i, 0); + hash_foreach(hash, each_pair_i, 0); return hash; } @@ -1079,7 +1080,7 @@ static VALUE rb_hash_each(hash) VALUE hash; { - rb_hash_foreach(hash, each_i, 0); + hash_foreach(hash, each_i, 0); return hash; } @@ -1110,7 +1111,7 @@ rb_hash_to_a(hash) VALUE ary; ary = rb_ary_new(); - st_foreach(RHASH(hash)->tbl, to_a_i, ary); + hash_foreach(hash, to_a_i, ary); if (OBJ_TAINTED(hash)) OBJ_TAINT(ary); return ary; @@ -1168,7 +1169,7 @@ inspect_hash(hash) VALUE str; str = rb_str_buf_new2("{"); - st_foreach(RHASH(hash)->tbl, inspect_i, str); + hash_foreach(hash, inspect_i, str); rb_str_buf_cat2(str, "}"); OBJ_INFECT(str, hash); @@ -1262,7 +1263,7 @@ rb_hash_keys(hash) VALUE ary; ary = rb_ary_new(); - st_foreach(RHASH(hash)->tbl, keys_i, ary); + hash_foreach(hash, keys_i, ary); return ary; } @@ -1295,7 +1296,7 @@ rb_hash_values(hash) VALUE ary; ary = rb_ary_new(); - st_foreach(RHASH(hash)->tbl, values_i, ary); + hash_foreach(hash, values_i, ary); return ary; } @@ -1360,7 +1361,7 @@ rb_hash_has_value(hash, val) data[0] = Qfalse; data[1] = val; - st_foreach(RHASH(hash)->tbl, rb_hash_search_value, (st_data_t)data); + hash_foreach(hash, rb_hash_search_value, (st_data_t)data); return data[0]; } @@ -1412,7 +1413,7 @@ hash_equal(hash1, hash2, eql) data.tbl = RHASH(hash2)->tbl; data.result = Qtrue; - st_foreach(RHASH(hash1)->tbl, equal_i, (st_data_t)&data); + hash_foreach(hash1, equal_i, (st_data_t)&data); return data.result; } @@ -1487,7 +1488,7 @@ rb_hash_invert(hash) { VALUE h = rb_hash_new(); - st_foreach(RHASH(hash)->tbl, rb_hash_invert_i, h); + hash_foreach(hash, rb_hash_invert_i, h); return h; } @@ -1533,10 +1534,10 @@ rb_hash_update(hash1, hash2) { hash2 = to_hash(hash2); if (rb_block_given_p()) { - st_foreach(RHASH(hash2)->tbl, rb_hash_update_block_i, hash1); + hash_foreach(hash2, rb_hash_update_block_i, hash1); } else { - st_foreach(RHASH(hash2)->tbl, rb_hash_update_i, hash1); + hash_foreach(hash2, rb_hash_update_i, hash1); } return hash1; } @@ -2294,7 +2295,7 @@ env_replace(env, hash) if (env == hash) return env; hash = to_hash(hash); - st_foreach(RHASH(hash)->tbl, env_replace_i, keys); + hash_foreach(hash, env_replace_i, keys); for (i=0; i<RARRAY(keys)->len; i++) { env_delete(env, RARRAY(keys)->ptr[i]); @@ -2321,7 +2322,7 @@ env_update(env, hash) { if (env == hash) return env; hash = to_hash(hash); - st_foreach(RHASH(hash)->tbl, env_update_i, 0); + hash_foreach(hash, env_update_i, 0); return env; } |