From 3c80a5e2bf279d6ffc934d821885f5904f1baf7d Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 1 Jun 2012 01:18:20 +0900 Subject: add inline to KHASH_INIT functions --- src/hash.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/hash.c') diff --git a/src/hash.c b/src/hash.c index 28e718c0d..371ac777a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -18,7 +18,7 @@ #include -static khint_t +static inline khint_t mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key) { char type = mrb_type(key); @@ -28,7 +28,7 @@ mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key) return kh_str_hash_func(mrb, RSTRING_PTR(s1)); } -static khint_t +static inline khint_t mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) { return mrb_equal(mrb, a, b); -- cgit v1.2.3 From 6a2cf46ff923a0969ba734f931fbdfbae6251929 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 1 Jun 2012 01:25:16 +0900 Subject: hash function should use #hash internally --- src/hash.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'src/hash.c') diff --git a/src/hash.c b/src/hash.c index 371ac777a..8cb039cea 100644 --- a/src/hash.c +++ b/src/hash.c @@ -21,11 +21,12 @@ static inline khint_t mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key) { - char type = mrb_type(key); - mrb_value s1 = mrb_str_new(mrb, &type, 1); - mrb_value s2 = mrb_inspect(mrb, key); - s1 = mrb_str_cat(mrb, s1, RSTRING_PTR(s2), RSTRING_LEN(s2)); - return kh_str_hash_func(mrb, RSTRING_PTR(s1)); + khint_t h = mrb_type(key) << 24; + mrb_value h2; + + h2 = mrb_funcall(mrb, key, "hash", 0, 0); + h ^= h2.value.i; + return h; } static inline khint_t -- cgit v1.2.3 From 6caeb8f8fba93d0003d20daa4181db2dbad948e1 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 1 Jun 2012 01:30:44 +0900 Subject: hash function should use #eql? internally --- src/hash.c | 2 +- src/object.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/hash.c') diff --git a/src/hash.c b/src/hash.c index 8cb039cea..21d458def 100644 --- a/src/hash.c +++ b/src/hash.c @@ -32,7 +32,7 @@ mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key) static inline khint_t mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) { - return mrb_equal(mrb, a, b); + return mrb_eql(mrb, a, b); } KHASH_INIT(ht, mrb_value, mrb_value, 1, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal); diff --git a/src/object.c b/src/object.c index 4dc900feb..81e3867a7 100644 --- a/src/object.c +++ b/src/object.c @@ -619,12 +619,12 @@ mrb_Float(mrb_state *mrb, mrb_value val) mrb_value mrb_inspect(mrb_state *mrb, mrb_value obj) { - return mrb_obj_as_string(mrb, mrb_funcall(mrb, obj, "inspect", 0, 0)); + return mrb_obj_as_string(mrb, mrb_funcall(mrb, obj, "inspect", 0, 0)); } int mrb_eql(mrb_state *mrb, mrb_value obj1, mrb_value obj2) { - return RTEST(mrb_funcall(mrb, obj1, "eql?", 1, obj2)); + if (mrb_obj_eq(mrb, obj1, obj2)) return TRUE; + return RTEST(mrb_funcall(mrb, obj1, "eql?", 1, obj2)); } - -- cgit v1.2.3 From 2a6b5b8ff520686b2774213b422611c04231168e Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 1 Jun 2012 01:40:12 +0900 Subject: stop using mrb_exec_recursive_paired() from Hash#== --- src/hash.c | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) (limited to 'src/hash.c') diff --git a/src/hash.c b/src/hash.c index 21d458def..e1789e3ab 100644 --- a/src/hash.c +++ b/src/hash.c @@ -37,9 +37,6 @@ mrb_hash_ht_hash_equal(mrb_state *mrb, mrb_value a, mrb_value b) KHASH_INIT(ht, mrb_value, mrb_value, 1, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal); -mrb_value mrb_exec_recursive_paired(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mrb_value, int), - mrb_value obj, mrb_value paired_obj, void* arg); - #ifndef FALSE #define FALSE 0 #endif @@ -1136,28 +1133,6 @@ mrb_hash_has_value(mrb_state *mrb, mrb_value hash) return mrb_hash_has_valueWithvalue(mrb, hash, val); } -static mrb_value -recursive_eql(mrb_state *mrb, mrb_value hash, mrb_value dt, int recur) -{ - khash_t(ht) *h1 = RHASH_TBL(hash); - khash_t(ht) *h2 = RHASH_TBL(dt); - khiter_t k1, k2; - mrb_value key1; - - for (k1 = kh_begin(h1); k1 != kh_end(h1); k1++) { - if (!kh_exist(h1, k1)) continue; - key1 = kh_key(h1,k1); - k2 = kh_get(ht, h2, key1); - if ( k2 != kh_end(h2)) { - if (mrb_equal(mrb, kh_value(h1,k1), kh_value(h2,k2))) { - continue; /* next key */ - } - } - return mrb_false_value(); - } - return mrb_true_value(); -} - static mrb_value hash_equal(mrb_state *mrb, mrb_value hash1, mrb_value hash2, int eql) { @@ -1172,9 +1147,25 @@ hash_equal(mrb_state *mrb, mrb_value hash1, mrb_value hash2, int eql) return mrb_fixnum_value(mrb_equal(mrb, hash2, hash1)); } if (RHASH_SIZE(hash1) != RHASH_SIZE(hash2)) return mrb_false_value(); - if (!RHASH(hash1)->ht || !RHASH(hash2)->ht) return mrb_true_value(); + else { + khash_t(ht) *h1 = RHASH_TBL(hash1); + khash_t(ht) *h2 = RHASH_TBL(hash2); + khiter_t k1, k2; + mrb_value key; - return mrb_exec_recursive_paired(mrb, recursive_eql, hash1, hash2, (void*)0); + for (k1 = kh_begin(h1); k1 != kh_end(h1); k1++) { + if (!kh_exist(h1, k1)) continue; + key = kh_key(h1,k1); + k2 = kh_get(ht, h2, key); + if (k2 != kh_end(h2)) { + if (mrb_equal(mrb, kh_value(h1,k1), kh_value(h2,k2))) { + continue; /* next key */ + } + } + return mrb_false_value(); + } + } + return mrb_true_value(); } /* 15.2.13.4.1 */ -- cgit v1.2.3 From 1321a157c25d7931ca57e3dafc27b4d0c6d8d5f0 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 1 Jun 2012 02:28:21 +0900 Subject: values need not to dup unlike keys --- src/hash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/hash.c') diff --git a/src/hash.c b/src/hash.c index e1789e3ab..12c03b6de 100644 --- a/src/hash.c +++ b/src/hash.c @@ -673,7 +673,7 @@ mrb_hash_values_at(mrb_state *mrb, int argc, mrb_value *argv, mrb_value hash) long i; for (i=0; i Date: Fri, 1 Jun 2012 02:30:54 +0900 Subject: small refactoring; hash->ht should not be NULL --- src/hash.c | 47 +++++++++-------------------------------------- 1 file changed, 9 insertions(+), 38 deletions(-) (limited to 'src/hash.c') diff --git a/src/hash.c b/src/hash.c index 12c03b6de..2b5657c75 100644 --- a/src/hash.c +++ b/src/hash.c @@ -59,12 +59,11 @@ mrb_hash_ht_key(mrb_state *mrb, mrb_value key) #define KEY(key) mrb_hash_ht_key(mrb, key) void -mrb_gc_mark_ht(mrb_state *mrb, struct RHash *c) +mrb_gc_mark_ht(mrb_state *mrb, struct RHash *hash) { khiter_t k; - khash_t(ht) *h = ((struct RHash*)c)->ht; + khash_t(ht) *h = hash->ht; - if (!h) return; for (k = kh_begin(h); k != kh_end(h); k++) if (kh_exist(h, k)) { mrb_gc_mark_value(mrb, kh_key(h, k)); @@ -73,23 +72,15 @@ mrb_gc_mark_ht(mrb_state *mrb, struct RHash *c) } size_t -mrb_gc_mark_ht_size(mrb_state *mrb, struct RHash *c) +mrb_gc_mark_ht_size(mrb_state *mrb, struct RHash *hash) { - size_t ht_size = 0; - khash_t(ht) *h = c->ht; - - /* ((struct RHash*)c)->ht */ - if (h) ht_size += kh_size(h)*2; - - return ht_size; + return kh_size(hash->ht)*2; } void -mrb_gc_free_ht(mrb_state *mrb, struct RHash *c) +mrb_gc_free_ht(mrb_state *mrb, struct RHash *hash) { - khash_t(ht) *h = c->ht; - - kh_destroy(ht, h); + kh_destroy(ht, hash->ht); } @@ -117,11 +108,9 @@ mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) /* mrb_hash_aref */ khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; - if (h) { - k = kh_get(ht, h, key); - if (k != kh_end(h)) - return kh_value(h, k); - } + k = kh_get(ht, h, key); + if (k != kh_end(h)) + return kh_value(h, k); /* not found */ if (MRB_RHASH_PROCDEFAULT_P(hash)) { @@ -173,21 +162,6 @@ mrb_hash_freeze(mrb_value hash) return (hash); } -mrb_value -mrb_hash(mrb_state *mrb, mrb_value obj) -{ - mrb_value hval = mrb_funcall(mrb, obj, "Hash", 0); -retry: - switch (mrb_type(hval)) { - case MRB_TT_FIXNUM: - return hval; - - default: - hval = mrb_to_int(mrb, hval); - goto retry; - } -} - mrb_value mrb_hash_dup(mrb_state *mrb, mrb_value hash) { @@ -1311,9 +1285,6 @@ mrb_hash_rassoc(mrb_state *mrb, mrb_value hash) mrb_value key, value, has_key; mrb_get_args(mrb, "o", &key); - if (mrb_nil_p(key)) - mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - has_key = mrb_hash_has_keyWithKey(mrb, hash, key); if (mrb_test(has_key)) { value = mrb_hash_get(mrb, hash, key); -- cgit v1.2.3 From 9b9b34569741c213de0d6ce29f9ea1ec49bdc1c5 Mon Sep 17 00:00:00 2001 From: Yukihiro Matsumoto Date: Fri, 1 Jun 2012 02:45:23 +0900 Subject: remove unnecessary header inclusion from hash.c --- src/hash.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'src/hash.c') diff --git a/src/hash.c b/src/hash.c index 2b5657c75..a06becd91 100644 --- a/src/hash.c +++ b/src/hash.c @@ -11,11 +11,7 @@ #include "mruby/array.h" #include "mruby/string.h" #include "mruby/variable.h" -#include "st.h" -#include #include - - #include static inline khint_t -- cgit v1.2.3