diff --git a/extlib/benz/data.c b/extlib/benz/data.c index 00042286..c61989df 100644 --- a/extlib/benz/data.c +++ b/extlib/benz/data.c @@ -4,11 +4,12 @@ struct pic_data * pic_data_alloc(pic_state *pic, const pic_data_type *type, void *userdata) { struct pic_data *data; + struct pic_dict *storage = pic_make_dict(pic); data = (struct pic_data *)pic_obj_alloc(pic, sizeof(struct pic_data), PIC_TT_DATA); data->type = type; data->data = userdata; - xh_init_str(&data->storage, sizeof(pic_value)); + data->storage = storage; return data; } diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index ca5d042d..41a4fea9 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -238,12 +238,13 @@ pic_dict_dictionary_to_alist(pic_state *pic) { struct pic_dict *dict; pic_value item, alist = pic_nil_value(); + pic_sym *sym; xh_entry *it; pic_get_args(pic, "d", &dict); - for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { - item = pic_cons(pic, pic_obj_value(xh_key(it, pic_sym *)), xh_val(it, pic_value)); + pic_dict_for_each (sym, dict, it) { + item = pic_cons(pic, pic_obj_value(sym), pic_dict_ref(pic, dict, sym)); pic_push(pic, item, alist); } @@ -273,13 +274,14 @@ pic_dict_dictionary_to_plist(pic_state *pic) { struct pic_dict *dict; pic_value plist = pic_nil_value(); + pic_sym *sym; xh_entry *it; pic_get_args(pic, "d", &dict); - for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { - pic_push(pic, pic_obj_value(xh_key(it, pic_sym *)), plist); - pic_push(pic, xh_val(it, pic_value), plist); + pic_dict_for_each (sym, dict, it) { + pic_push(pic, pic_obj_value(sym), plist); + pic_push(pic, pic_dict_ref(pic, dict, sym), plist); } return pic_reverse(pic, plist); diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index 9205abe2..adf449ec 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -442,11 +442,8 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) } case PIC_TT_DATA: { struct pic_data *data = (struct pic_data *)obj; - xh_entry *it; - for (it = xh_begin(&data->storage); it != NULL; it = xh_next(it)) { - gc_mark(pic, xh_val(it, pic_value)); - } + gc_mark_object(pic, (struct pic_object *)data->storage); if (data->type->mark) { data->type->mark(pic, data->data, gc_mark); } @@ -454,11 +451,12 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) } case PIC_TT_DICT: { struct pic_dict *dict = (struct pic_dict *)obj; + pic_sym *sym; xh_entry *it; - for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) { - gc_mark_object(pic, (struct pic_object *)xh_key(it, pic_sym *)); - gc_mark(pic, xh_val(it, pic_value)); + pic_dict_for_each (sym, dict, it) { + gc_mark_object(pic, (struct pic_object *)sym); + gc_mark(pic, pic_dict_ref(pic, dict, sym)); } break; } @@ -705,7 +703,6 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) if (data->type->dtor) { data->type->dtor(pic, data->data); } - xh_destroy(&data->storage); break; } case PIC_TT_DICT: { diff --git a/extlib/benz/include/picrin/data.h b/extlib/benz/include/picrin/data.h index 38a20c3d..f527eee7 100644 --- a/extlib/benz/include/picrin/data.h +++ b/extlib/benz/include/picrin/data.h @@ -18,7 +18,7 @@ typedef struct { struct pic_data { PIC_OBJECT_HEADER const pic_data_type *type; - xhash storage; /* const char * to pic_value table */ + struct pic_dict *storage; void *data; }; diff --git a/extlib/benz/write.c b/extlib/benz/write.c index e98e027c..c5ba08bb 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -169,6 +169,7 @@ write_core(struct writer_control *p, pic_value obj) pic_state *pic = p->pic; xFILE *file = p->file; size_t i; + pic_sym *sym; xh_entry *e, *it; int c; #if PIC_ENABLE_FLOAT @@ -297,9 +298,9 @@ write_core(struct writer_control *p, pic_value obj) break; case PIC_TT_DICT: xfprintf(pic, file, "#.(dictionary"); - for (it = xh_begin(&pic_dict_ptr(obj)->hash); it != NULL; it = xh_next(it)) { - xfprintf(pic, file, " '%s ", pic_symbol_name(pic, xh_key(it, pic_sym *))); - write_core(p, xh_val(it, pic_value)); + pic_dict_for_each (sym, pic_dict_ptr(obj), it) { + xfprintf(pic, file, " '%s ", pic_symbol_name(pic, sym)); + write_core(p, pic_dict_ref(pic, pic_dict_ptr(obj), sym)); } xfprintf(pic, file, ")"); break;