use dictionary for rec->data
This commit is contained in:
parent
c86e97094d
commit
14a93ccf0f
|
@ -466,11 +466,8 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
|||
}
|
||||
case PIC_TT_RECORD: {
|
||||
struct pic_record *rec = (struct pic_record *)obj;
|
||||
xh_entry *it;
|
||||
|
||||
for (it = xh_begin(&rec->hash); it != NULL; it = xh_next(it)) {
|
||||
gc_mark(pic, xh_val(it, pic_value));
|
||||
}
|
||||
gc_mark_object(pic, (struct pic_object *)rec->data);
|
||||
break;
|
||||
}
|
||||
case PIC_TT_NIL:
|
||||
|
@ -662,8 +659,6 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj)
|
|||
break;
|
||||
}
|
||||
case PIC_TT_RECORD: {
|
||||
struct pic_record *rec = (struct pic_record *)obj;
|
||||
xh_destroy(&rec->hash);
|
||||
break;
|
||||
}
|
||||
case PIC_TT_NIL:
|
||||
|
|
|
@ -11,7 +11,7 @@ extern "C" {
|
|||
|
||||
struct pic_record {
|
||||
PIC_OBJECT_HEADER
|
||||
xhash hash;
|
||||
struct pic_dict *data;
|
||||
};
|
||||
|
||||
#define pic_record_p(v) (pic_type(v) == PIC_TT_RECORD)
|
||||
|
|
|
@ -4,14 +4,18 @@
|
|||
|
||||
#include "picrin.h"
|
||||
#include "picrin/record.h"
|
||||
#include "picrin/dict.h"
|
||||
|
||||
struct pic_record *
|
||||
pic_make_record(pic_state *pic, pic_value rectype)
|
||||
{
|
||||
struct pic_record *rec;
|
||||
struct pic_dict *data;
|
||||
|
||||
data = pic_make_dict(pic);
|
||||
|
||||
rec = (struct pic_record *)pic_obj_alloc(pic, sizeof(struct pic_record), PIC_TT_RECORD);
|
||||
xh_init_int(&rec->hash, sizeof(pic_value));
|
||||
rec->data = data;
|
||||
|
||||
pic_record_set(pic, rec, pic_intern_cstr(pic, "@@type"), rectype);
|
||||
|
||||
|
@ -27,21 +31,16 @@ pic_record_type(pic_state *pic, struct pic_record *rec)
|
|||
pic_value
|
||||
pic_record_ref(pic_state *pic, struct pic_record *rec, pic_sym slot)
|
||||
{
|
||||
xh_entry *e;
|
||||
|
||||
e = xh_get_int(&rec->hash, slot);
|
||||
if (! e) {
|
||||
if (! pic_dict_has(pic, rec->data, slot)) {
|
||||
pic_errorf(pic, "slot named ~s is not found for record: ~s", pic_sym_value(slot), rec);
|
||||
}
|
||||
return xh_val(e, pic_value);
|
||||
return pic_dict_ref(pic, rec->data, slot);
|
||||
}
|
||||
|
||||
void
|
||||
pic_record_set(pic_state *pic, struct pic_record *rec, pic_sym slot, pic_value val)
|
||||
{
|
||||
PIC_UNUSED(pic);
|
||||
|
||||
xh_put_int(&rec->hash, slot, &val);
|
||||
pic_dict_set(pic, rec->data, slot, val);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
|
|
Loading…
Reference in New Issue