diff options
Diffstat (limited to 'src/hash.c')
| -rw-r--r-- | src/hash.c | 116 |
1 files changed, 55 insertions, 61 deletions
diff --git a/src/hash.c b/src/hash.c index 078faf1d3..cb34dae75 100644 --- a/src/hash.c +++ b/src/hash.c @@ -9,10 +9,8 @@ #include "mruby/khash.h" #include "mruby/class.h" #include "mruby/array.h" -#include "error.h" #include "mruby/string.h" -#include "mruby/numeric.h" -#include "mruby/struct.h" +#include "mruby/variable.h" #include "st.h" #include <errno.h> #include <string.h> @@ -66,12 +64,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 RClass *c) +mrb_gc_mark_ht(mrb_state *mrb, struct RHash *c) { khiter_t k; khash_t(ht) *h = ((struct RHash*)c)->ht; - mrb_gc_mark_value(mrb, ((struct RHash*)c)->ifnone); if (!h) return; for (k = kh_begin(h); k != kh_end(h); k++) if (kh_exist(h, k)) { @@ -86,9 +83,6 @@ mrb_gc_mark_ht_size(mrb_state *mrb, struct RClass *c) size_t ht_size = 0; khash_t(ht) *h = ((struct RHash*)c)->ht; - /* ((struct RHash*)c)->ifnone */ - ht_size++; - /* ((struct RHash*)c)->ht */ if (h) ht_size += kh_size(h)*2; @@ -112,7 +106,7 @@ mrb_hash_new_capa(mrb_state *mrb, size_t capa) h = mrb_obj_alloc(mrb, MRB_TT_HASH, mrb->hash_class); h->ht = kh_init(ht, mrb); kh_resize(ht, h->ht, capa); - h->ifnone = mrb_nil_value(); + h->iv = 0; return mrb_obj_value(h); } @@ -125,7 +119,7 @@ mrb_hash_new(mrb_state *mrb, int capa) mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) /* mrb_hash_aref */ /* mrb_hash_lookup */ { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; if (h) { @@ -138,15 +132,13 @@ mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key) /* mrb_hash_aref */ if (MRB_RHASH_PROCDEFAULT_P(hash)) { return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key); } - else { - return RHASH_IFNONE(hash); - } + return RHASH_IFNONE(hash); } mrb_value mrb_hash_getWithDef(mrb_state *mrb, mrb_value hash, mrb_value vkey, mrb_value def) /* mrb_hash_lookup2 */ { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; if (h) { @@ -166,7 +158,7 @@ mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val) /* mr khiter_t k; mrb_hash_modify(mrb, hash); - h = RHASH_H_TBL(hash); + h = RHASH_TBL(hash); k = kh_get(ht, h, key); if (k == kh_end(h)) { @@ -201,18 +193,6 @@ retry: } } -static mrb_value -hash_s_new(mrb_state *mrb, mrb_value klass) -{ - mrb_value *argv; - int argc; - - mrb_get_args(mrb, "*", &argv, &argc); - mrb_value hash = mrb_hash_new_capa(mrb, 0); - mrb_obj_call_init(mrb, hash, argc, argv); - return hash; -} - mrb_value mrb_hash_dup(mrb_state *mrb, mrb_value hash) { @@ -224,7 +204,7 @@ mrb_hash_dup(mrb_state *mrb, mrb_value hash) ret->ht = kh_init(ht, mrb); if (!RHASH_EMPTY_P(hash)) { - h = RHASH_H_TBL(hash); + h = RHASH_TBL(hash); ret_h = ret->ht; for (k = kh_begin(h); k != kh_end(h); k++) { @@ -247,10 +227,10 @@ mrb_hash_modify_check(mrb_state *mrb, mrb_value hash) khash_t(ht) * mrb_hash_tbl(mrb_state *mrb, mrb_value hash) { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); - if (!RHASH_H_TBL(hash)) { - RHASH_H_TBL(hash) = kh_init(ht, mrb); + if (!RHASH_TBL(hash)) { + RHASH_TBL(hash) = kh_init(ht, mrb); } return h; } @@ -301,21 +281,20 @@ mrb_hash_modify(mrb_state *mrb, mrb_value hash) static mrb_value mrb_hash_init_core(mrb_state *mrb, mrb_value hash) { - mrb_value block; + mrb_value block, ifnone; mrb_value *argv; int argc; mrb_get_args(mrb, "o*", &block, &argv, &argc); mrb_hash_modify(mrb, hash); - if (mrb_nil_p(block)) { if (argc > 0) { if (argc != 1) mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); - RHASH_IFNONE(hash) = argv[0]; + ifnone = argv[0]; } else { - RHASH_IFNONE(hash) = mrb_nil_value(); + ifnone = mrb_nil_value(); } } else { @@ -323,9 +302,9 @@ mrb_hash_init_core(mrb_state *mrb, mrb_value hash) mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments"); } RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT; - RHASH_PROCDEFAULT(hash) = block; + ifnone = block; } - + mrb_iv_set(mrb, hash, mrb_intern(mrb, "ifnone"), ifnone); return hash; } @@ -497,7 +476,7 @@ mrb_hash_set_default(mrb_state *mrb, mrb_value hash) mrb_get_args(mrb, "o", &ifnone); mrb_hash_modify(mrb, hash); - RHASH_IFNONE(hash) = ifnone; + mrb_iv_set(mrb, hash, mrb_intern(mrb, "ifnone"), ifnone); RHASH(hash)->flags &= ~(MRB_HASH_PROC_DEFAULT); return ifnone; @@ -541,10 +520,23 @@ mrb_hash_default_proc(mrb_state *mrb, mrb_value hash) * h["cat"] #=> "catcat" */ +static mrb_value +mrb_hash_set_default_proc(mrb_state *mrb, mrb_value hash) +{ + mrb_value ifnone; + mrb_get_args(mrb, "o", &ifnone); + + mrb_hash_modify(mrb, hash); + mrb_iv_set(mrb, hash, mrb_intern(mrb, "ifnone"), ifnone); + RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT; + + return ifnone; +} + mrb_value mrb_hash_delete_key(mrb_state *mrb, mrb_value hash, mrb_value key) { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; mrb_value delVal; @@ -610,7 +602,7 @@ struct shift_var { static mrb_value mrb_hash_shift(mrb_state *mrb, mrb_value hash) { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; mrb_value delKey, delVal; mrb_value result; @@ -625,8 +617,8 @@ mrb_hash_shift(mrb_state *mrb, mrb_value hash) delVal = mrb_hash_delete_key(mrb, hash, delKey); result = mrb_hash_new(mrb, 1); - k = kh_put(ht, RHASH_H_TBL(result), KEY(delKey)); - kh_value(RHASH_H_TBL(result), k) = delVal; + k = kh_put(ht, RHASH_TBL(result), KEY(delKey)); + kh_value(RHASH_TBL(result), k) = delVal; return result; } } @@ -688,7 +680,7 @@ mrb_hash_shift(mrb_state *mrb, mrb_value hash) mrb_value mrb_hash_values_at(mrb_state *mrb, int argc, mrb_value *argv, mrb_value hash) { - mrb_value result = mrb_ary_new_capa(mrb, argc);//mrb_ary_new2(argc); + mrb_value result = mrb_ary_new_capa(mrb, argc); long i; for (i=0; i<argc; i++) { @@ -747,7 +739,7 @@ mrb_hash_values_at(mrb_state *mrb, int argc, mrb_value *argv, mrb_value hash) static mrb_value mrb_hash_clear(mrb_state *mrb, mrb_value hash) { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); kh_clear(ht, h); return hash; @@ -799,7 +791,7 @@ mrb_hash_aset(mrb_state *mrb, mrb_value self) static mrb_value mrb_hash_replace(mrb_state *mrb, mrb_value hash) { - mrb_value hash2; + mrb_value hash2, ifnone; khash_t(ht) *h2; khiter_t k; @@ -810,7 +802,7 @@ mrb_hash_replace(mrb_state *mrb, mrb_value hash) if (mrb_obj_equal(mrb, hash, hash2)) return hash; mrb_hash_clear(mrb, hash); - h2 = RHASH_H_TBL(hash2); + h2 = RHASH_TBL(hash2); if (h2) { for (k = kh_begin(h2); k != kh_end(h2); k++) { if (kh_exist(h2, k)) @@ -820,11 +812,13 @@ mrb_hash_replace(mrb_state *mrb, mrb_value hash) if (MRB_RHASH_PROCDEFAULT_P(hash2)) { RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT; - RHASH_PROCDEFAULT(hash) = RHASH_PROCDEFAULT(hash2); + ifnone = RHASH_PROCDEFAULT(hash2); } else { - RHASH_IFNONE(hash) = RHASH_IFNONE(hash2); + ifnone = RHASH_IFNONE(hash2); } + mrb_iv_set(mrb, hash, mrb_intern(mrb, "ifnone"), ifnone); + return hash; } @@ -845,7 +839,7 @@ mrb_hash_replace(mrb_state *mrb, mrb_value hash) static mrb_value mrb_hash_size_m(mrb_state *mrb, mrb_value self) { - khash_t(ht) *h = RHASH_H_TBL(self); + khash_t(ht) *h = RHASH_TBL(self); if (!h) return mrb_fixnum_value(0); return mrb_fixnum_value(kh_size(h)); @@ -864,7 +858,7 @@ mrb_hash_size_m(mrb_state *mrb, mrb_value self) static mrb_value mrb_hash_empty_p(mrb_state *mrb, mrb_value self) { - khash_t(ht) *h = RHASH_H_TBL(self); + khash_t(ht) *h = RHASH_TBL(self); khiter_t k; if (h) { for (k = kh_begin(h); k != kh_end(h); k++) @@ -941,12 +935,12 @@ static mrb_value inspect_hash(mrb_state *mrb, mrb_value hash, int recur) { mrb_value str, str2; - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; - if (recur) return mrb_str_new2(mrb, "{...}"); + if (recur) return mrb_str_new_cstr(mrb, "{...}"); - str = mrb_str_new2(mrb, "{"); + str = mrb_str_new_cstr(mrb, "{"); if (h && kh_size(h) > 0) { for (k = kh_begin(h); k != kh_end(h); k++) { int ai; @@ -987,7 +981,7 @@ static mrb_value mrb_hash_inspect(mrb_state *mrb, mrb_value hash) { if (RHASH_EMPTY_P(hash)) - return mrb_str_new2(mrb, "{}"); + return mrb_str_new_cstr(mrb, "{}"); return inspect_hash(mrb, hash, 0); } @@ -1021,7 +1015,7 @@ mrb_hash_to_hash(mrb_state *mrb, mrb_value hash) static mrb_value mrb_hash_keys(mrb_state *mrb, mrb_value hash) { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; mrb_value ary = mrb_ary_new(mrb); @@ -1053,7 +1047,7 @@ mrb_hash_keys(mrb_state *mrb, mrb_value hash) static mrb_value mrb_hash_values(mrb_state *mrb, mrb_value hash) { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; mrb_value ary = mrb_ary_new(mrb); @@ -1072,7 +1066,7 @@ mrb_hash_values(mrb_state *mrb, mrb_value hash) static mrb_value mrb_hash_has_keyWithKey(mrb_state *mrb, mrb_value hash, mrb_value key) { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; if (h) { @@ -1115,7 +1109,7 @@ mrb_hash_has_key(mrb_state *mrb, mrb_value hash) static mrb_value mrb_hash_has_valueWithvalue(mrb_state *mrb, mrb_value hash, mrb_value value) { - khash_t(ht) *h = RHASH_H_TBL(hash); + khash_t(ht) *h = RHASH_TBL(hash); khiter_t k; if (h) { @@ -1158,8 +1152,8 @@ mrb_hash_has_value(mrb_state *mrb, mrb_value hash) static mrb_value recursive_eql(mrb_state *mrb, mrb_value hash, mrb_value dt, int recur) { - khash_t(ht) *h1 = RHASH_H_TBL(hash); - khash_t(ht) *h2 = RHASH_H_TBL(dt); + khash_t(ht) *h1 = RHASH_TBL(hash); + khash_t(ht) *h2 = RHASH_TBL(dt); khiter_t k1, k2; mrb_value key1; @@ -1388,7 +1382,6 @@ mrb_init_hash(mrb_state *mrb) h = mrb->hash_class = mrb_define_class(mrb, "Hash", mrb->object_class); MRB_SET_INSTANCE_TT(h, MRB_TT_HASH); - //mrb_define_class_method(mrb, h, "new", hash_s_new, ARGS_ANY()); mrb_include_module(mrb, h, mrb_class_get(mrb, "Enumerable")); mrb_define_method(mrb, h, "==", mrb_hash_equal, ARGS_REQ(1)); /* 15.2.13.4.1 */ mrb_define_method(mrb, h, "[]", mrb_hash_aget, ARGS_REQ(1)); /* 15.2.13.4.2 */ @@ -1397,6 +1390,7 @@ mrb_init_hash(mrb_state *mrb) mrb_define_method(mrb, h, "default", mrb_hash_default, ARGS_ANY()); /* 15.2.13.4.5 */ mrb_define_method(mrb, h, "default=", mrb_hash_set_default, ARGS_REQ(1)); /* 15.2.13.4.6 */ mrb_define_method(mrb, h, "default_proc", mrb_hash_default_proc,ARGS_NONE()); /* 15.2.13.4.7 */ + mrb_define_method(mrb, h, "default_proc=", mrb_hash_set_default_proc,ARGS_REQ(1)); /* 15.2.13.4.7 */ mrb_define_method(mrb, h, "__delete", mrb_hash_delete, ARGS_REQ(1)); /* core of 15.2.13.4.8 */ //mrb_define_method(mrb, h, "each", mrb_hash_each_pair, ARGS_NONE()); /* 15.2.13.4.9 */ /* move to mrblib\hash.rb */ //mrb_define_method(mrb, h, "each_key", mrb_hash_each_key, ARGS_NONE()); /* 15.2.13.4.10 */ /* move to mrblib\hash.rb */ |
