summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-23 00:51:32 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-23 00:51:32 +0000
commitf1f0f39e036daa8940996d2957f8756d4db08cdb (patch)
tree6217876c5f588c79c691c943566548c1e10ac61a /hash.c
parent2c179216717d75837de7a6ff092fd773670f4d11 (diff)
* 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.c75
1 files changed, 38 insertions, 37 deletions
diff --git a/hash.c b/hash.c
index 4375020ce5..3615b409c9 100644
--- a/hash.c
+++ b/hash.c
@@ -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;
}