summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-03 00:23:59 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-03 00:23:59 +0900
commitcc86250297c4a8d4a2e3e350fab8cf96929283c3 (patch)
treed7ce997ba5f0845ae009d99cafcf98a27368f625
parentecbaf9cd99803a2fa121fe6aabea74590a36e0b2 (diff)
downloadmruby-cc86250297c4a8d4a2e3e350fab8cf96929283c3.tar.gz
mruby-cc86250297c4a8d4a2e3e350fab8cf96929283c3.zip
remove unsafe macros in hash.h
-rw-r--r--include/mruby/hash.h2
-rw-r--r--src/hash.c24
2 files changed, 16 insertions, 10 deletions
diff --git a/include/mruby/hash.h b/include/mruby/hash.h
index 01b042d46..369decdb4 100644
--- a/include/mruby/hash.h
+++ b/include/mruby/hash.h
@@ -33,8 +33,6 @@ mrb_value mrb_check_hash_type(mrb_state *mrb, mrb_value self);
/* RHASH_TBL allocates st_table if not available. */
#define RHASH(obj) ((struct RHash*)((obj).value.p))
#define RHASH_TBL(h) (RHASH(h)->ht)
-#define RHASH_SIZE(h) (RHASH_TBL(h)->size)
-#define RHASH_EMPTY_P(h) (RHASH_SIZE(h) == 0)
#define RHASH_IFNONE(h) mrb_iv_get(mrb, (h), mrb_intern(mrb, "ifnone"))
#define RHASH_PROCDEFAULT(h) RHASH_IFNONE(h)
struct kh_ht * mrb_hash_tbl(mrb_state *mrb, mrb_value hash);
diff --git a/src/hash.c b/src/hash.c
index 7b5481868..4a85fcec3 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -172,11 +172,11 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash)
khash_t(ht) *h, *ret_h;
khiter_t k, ret_k;
+ h = RHASH_TBL(hash);
ret = (struct RHash*)mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class);
ret->ht = kh_init(ht, mrb);
- if (!RHASH_EMPTY_P(hash)) {
- h = RHASH_TBL(hash);
+ if (kh_size(h) > 0) {
ret_h = ret->ht;
for (k = kh_begin(h); k != kh_end(h); k++) {
@@ -818,7 +818,6 @@ static mrb_value
mrb_hash_empty_p(mrb_state *mrb, mrb_value self)
{
khash_t(ht) *h = RHASH_TBL(self);
- khiter_t k;
if (h) {
if (kh_size(h) == 0)
@@ -939,8 +938,10 @@ inspect_hash(mrb_state *mrb, mrb_value hash, int recur)
static mrb_value
mrb_hash_inspect(mrb_state *mrb, mrb_value hash)
{
- if (RHASH_EMPTY_P(hash))
- return mrb_str_new_cstr(mrb, "{}");
+ khash_t(ht) *h = RHASH_TBL(hash);
+
+ if (!h || kh_size(h) == 0)
+ return mrb_str_new_cstr(mrb, "{}");
return inspect_hash(mrb, hash, 0);
}
@@ -1107,6 +1108,8 @@ mrb_hash_has_value(mrb_state *mrb, mrb_value hash)
static mrb_value
hash_equal(mrb_state *mrb, mrb_value hash1, mrb_value hash2, int eql)
{
+ khash_t(ht) *h1, *h2;
+
if (mrb_obj_equal(mrb, hash1, hash2)) return mrb_true_value();
if (mrb_type(hash2) != MRB_TT_HASH) {
if (!mrb_respond_to(mrb, hash2, mrb_intern(mrb, "to_hash"))) {
@@ -1117,10 +1120,15 @@ hash_equal(mrb_state *mrb, mrb_value hash1, mrb_value hash2, int eql)
else
return mrb_fixnum_value(mrb_equal(mrb, hash2, hash1));
}
- if (RHASH_SIZE(hash1) != RHASH_SIZE(hash2)) return mrb_false_value();
+ h1 = RHASH_TBL(hash1);
+ h2 = RHASH_TBL(hash2);
+ if (!h2) {
+ if (!h2) return mrb_true_value();
+ return mrb_false_value();
+ }
+ if (!h2) return mrb_false_value();
+ if (kh_size(h1) != kh_size(h2)) return mrb_false_value();
else {
- khash_t(ht) *h1 = RHASH_TBL(hash1);
- khash_t(ht) *h2 = RHASH_TBL(hash2);
khiter_t k1, k2;
mrb_value key;