* 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
This commit is contained in:
nobu 2009-05-09 03:19:52 +00:00
Родитель 8864383839
Коммит f4be2ca564
2 изменённых файлов: 53 добавлений и 30 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Sat May 9 12:19:49 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* 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 <nobu@ruby-lang.org> Sat May 9 11:14:50 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_eval.c (rb_f_catch): gets rid of issue with gcc 4.4. a patch * vm_eval.c (rb_f_catch): gets rid of issue with gcc 4.4. a patch

77
hash.c
Просмотреть файл

@ -76,7 +76,7 @@ static int
rb_any_hash(VALUE a) rb_any_hash(VALUE a)
{ {
VALUE hval; VALUE hval;
int hnum; VALUE hnum;
switch (TYPE(a)) { switch (TYPE(a)) {
case T_FIXNUM: case T_FIXNUM:
@ -93,10 +93,10 @@ rb_any_hash(VALUE a)
default: default:
hval = rb_hash(a); hval = rb_hash(a);
hnum = (int)FIX2LONG(hval); hnum = FIX2LONG(hval);
} }
hnum <<= 1; hnum <<= 1;
return RSHIFT(hnum, 1); return (int)RSHIFT(hnum, 1);
} }
static const struct st_hash_type objhash = { static const struct st_hash_type objhash = {
@ -410,8 +410,10 @@ rb_hash_s_try_convert(VALUE dummy, VALUE hash)
} }
static int 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); if (key != Qundef) st_insert(tbl, key, value);
return ST_CONTINUE; return ST_CONTINUE;
} }
@ -448,7 +450,7 @@ rb_hash_rehash(VALUE hash)
if (!RHASH(hash)->ntbl) if (!RHASH(hash)->ntbl)
return hash; return hash;
tbl = st_init_table_with_size(RHASH(hash)->ntbl->type, RHASH(hash)->ntbl->num_entries); 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); st_free_table(RHASH(hash)->ntbl);
RHASH(hash)->ntbl = tbl; RHASH(hash)->ntbl = tbl;
@ -676,8 +678,10 @@ rb_hash_set_default_proc(VALUE hash, VALUE proc)
} }
static int 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])) { if (rb_equal(value, args[0])) {
args[1] = key; args[1] = key;
return ST_STOP; return ST_STOP;
@ -705,7 +709,7 @@ rb_hash_key(VALUE hash, VALUE value)
args[0] = value; args[0] = value;
args[1] = Qnil; args[1] = Qnil;
rb_hash_foreach(hash, key_i, (st_data_t)args); rb_hash_foreach(hash, key_i, (VALUE)args);
return args[1]; return args[1];
} }
@ -774,8 +778,10 @@ struct shift_var {
}; };
static int 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 (key == Qundef) return ST_CONTINUE;
if (var->key != Qundef) return ST_STOP; if (var->key != Qundef) return ST_STOP;
var->key = key; var->key = key;
@ -784,8 +790,10 @@ shift_i(VALUE key, VALUE value, struct shift_var *var)
} }
static int 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; if (key == Qundef) return ST_CONTINUE;
var->key = key; var->key = key;
var->val = value; var->val = value;
@ -813,7 +821,7 @@ rb_hash_shift(VALUE hash)
rb_hash_modify(hash); rb_hash_modify(hash);
var.key = Qundef; var.key = Qundef;
rb_hash_foreach(hash, RHASH(hash)->iter_lev > 0 ? shift_i_safe : shift_i, 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 (var.key != Qundef) {
if (RHASH(hash)->iter_lev > 0) { if (RHASH(hash)->iter_lev > 0) {
@ -871,7 +879,7 @@ rb_hash_delete_if(VALUE hash)
VALUE VALUE
rb_hash_reject_bang(VALUE hash) rb_hash_reject_bang(VALUE hash)
{ {
int n; st_index_t n;
RETURN_ENUMERATOR(hash, 0, 0); RETURN_ENUMERATOR(hash, 0, 0);
if (!RHASH(hash)->ntbl) if (!RHASH(hash)->ntbl)
@ -1378,8 +1386,10 @@ rb_hash_has_key(VALUE hash, VALUE key)
} }
static int 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 (key == Qundef) return ST_CONTINUE;
if (rb_equal(value, data[1])) { if (rb_equal(value, data[1])) {
data[0] = Qtrue; data[0] = Qtrue;
@ -1408,7 +1418,7 @@ rb_hash_has_value(VALUE hash, VALUE val)
data[0] = Qfalse; data[0] = Qfalse;
data[1] = val; 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]; return data[0];
} }
@ -1419,8 +1429,9 @@ struct equal_data {
}; };
static int 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; VALUE val2;
if (key == Qundef) return ST_CONTINUE; if (key == Qundef) return ST_CONTINUE;
@ -1428,7 +1439,7 @@ eql_i(VALUE key, VALUE val1, struct equal_data *data)
data->result = Qfalse; data->result = Qfalse;
return ST_STOP; 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; data->result = Qfalse;
return ST_STOP; return ST_STOP;
} }
@ -1443,7 +1454,7 @@ recursive_eql(VALUE hash, VALUE dt, int recur)
if (recur) return Qfalse; if (recur) return Qfalse;
data = (struct equal_data*)dt; data = (struct equal_data*)dt;
data->result = Qtrue; data->result = Qtrue;
rb_hash_foreach(hash, eql_i, (st_data_t)data); rb_hash_foreach(hash, eql_i, dt);
return data->result; return data->result;
} }
@ -1520,8 +1531,10 @@ rb_hash_eql(VALUE hash1, VALUE hash2)
} }
static int 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; if (key == Qundef) return ST_CONTINUE;
*hval ^= rb_hash_end(rb_hash_uint(rb_hash_start(rb_hash(key)), rb_hash(val))); *hval ^= rb_hash_end(rb_hash_uint(rb_hash_start(rb_hash(key)), rb_hash(val)));
return ST_CONTINUE; return ST_CONTINUE;
@ -1530,7 +1543,7 @@ hash_i(VALUE key, VALUE val, int *hval)
static VALUE static VALUE
recursive_hash(VALUE hash, VALUE dummy, int recur) recursive_hash(VALUE hash, VALUE dummy, int recur)
{ {
int hval; VALUE hval;
if (recur) { if (recur) {
return LONG2FIX(0); return LONG2FIX(0);
@ -1538,7 +1551,7 @@ recursive_hash(VALUE hash, VALUE dummy, int recur)
if (!RHASH(hash)->ntbl) if (!RHASH(hash)->ntbl)
return LONG2FIX(0); return LONG2FIX(0);
hval = RHASH(hash)->ntbl->num_entries; 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); return INT2FIX(hval);
} }
@ -1663,8 +1676,10 @@ rb_hash_merge(VALUE hash1, VALUE hash2)
} }
static int 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 (key == Qundef) return ST_CONTINUE;
if (RTEST(rb_equal(args[0], key))) { if (RTEST(rb_equal(args[0], key))) {
args[1] = rb_assoc_new(key, val); args[1] = rb_assoc_new(key, val);
@ -1694,13 +1709,15 @@ rb_hash_assoc(VALUE hash, VALUE obj)
args[0] = obj; args[0] = obj;
args[1] = Qnil; args[1] = Qnil;
rb_hash_foreach(hash, assoc_i, (st_data_t)args); rb_hash_foreach(hash, assoc_i, (VALUE)args);
return args[1]; return args[1];
} }
static int 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 (key == Qundef) return ST_CONTINUE;
if (RTEST(rb_equal(args[0], val))) { if (RTEST(rb_equal(args[0], val))) {
args[1] = rb_assoc_new(key, val); args[1] = rb_assoc_new(key, val);
@ -1729,7 +1746,7 @@ rb_hash_rassoc(VALUE hash, VALUE obj)
args[0] = obj; args[0] = obj;
args[1] = Qnil; args[1] = Qnil;
rb_hash_foreach(hash, rassoc_i, (st_data_t)args); rb_hash_foreach(hash, rassoc_i, (VALUE)args);
return args[1]; return args[1];
} }
@ -1860,7 +1877,7 @@ env_delete(VALUE obj, VALUE name)
rb_secure(4); rb_secure(4);
SafeStringValue(name); SafeStringValue(name);
nam = RSTRING_PTR(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"); rb_raise(rb_eArgError, "bad environment variable name");
} }
val = getenv(nam); val = getenv(nam);
@ -1894,7 +1911,7 @@ rb_f_getenv(VALUE obj, VALUE name)
rb_secure(4); rb_secure(4);
SafeStringValue(name); SafeStringValue(name);
nam = RSTRING_PTR(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"); rb_raise(rb_eArgError, "bad environment variable name");
} }
env = getenv(nam); env = getenv(nam);
@ -1925,7 +1942,7 @@ env_fetch(int argc, VALUE *argv)
} }
SafeStringValue(key); SafeStringValue(key);
nam = RSTRING_PTR(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"); rb_raise(rb_eArgError, "bad environment variable name");
} }
env = getenv(nam); env = getenv(nam);
@ -2065,9 +2082,9 @@ env_aset(VALUE obj, VALUE nm, VALUE val)
StringValue(val); StringValue(val);
name = RSTRING_PTR(nm); name = RSTRING_PTR(nm);
value = RSTRING_PTR(val); 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"); 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"); rb_raise(rb_eArgError, "bad environment variable value");
ruby_setenv(name, value); ruby_setenv(name, value);
@ -2367,7 +2384,7 @@ env_has_key(VALUE env, VALUE key)
rb_secure(4); rb_secure(4);
s = StringValuePtr(key); s = StringValuePtr(key);
if (strlen(s) != RSTRING_LEN(key)) if (memchr(s, '\0', RSTRING_LEN(key)))
rb_raise(rb_eArgError, "bad environment variable name"); rb_raise(rb_eArgError, "bad environment variable name");
if (getenv(s)) return Qtrue; if (getenv(s)) return Qtrue;
return Qfalse; return Qfalse;
@ -2380,7 +2397,7 @@ env_assoc(VALUE env, VALUE key)
rb_secure(4); rb_secure(4);
s = StringValuePtr(key); s = StringValuePtr(key);
if (strlen(s) != RSTRING_LEN(key)) if (memchr(s, '\0', RSTRING_LEN(key)))
rb_raise(rb_eArgError, "bad environment variable name"); rb_raise(rb_eArgError, "bad environment variable name");
e = getenv(s); e = getenv(s);
if (e) return rb_assoc_new(key, rb_tainted_str_new2(e)); if (e) return rb_assoc_new(key, rb_tainted_str_new2(e));