summaryrefslogtreecommitdiffhomepage
path: root/src/hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hash.c')
-rw-r--r--src/hash.c116
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 */