From a5db43ba9186489cc76c68f6db7c19f2a6108f0d Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 13 Oct 2013 19:00:39 +0900 Subject: [PATCH] add object finalizer --- include/picrin/irep.h | 28 ++++++++++++++++++++++++++++ src/gc.c | 29 +++++++++++++++++++++++++++++ src/vm.c | 25 +------------------------ 3 files changed, 58 insertions(+), 24 deletions(-) create mode 100644 include/picrin/irep.h diff --git a/include/picrin/irep.h b/include/picrin/irep.h new file mode 100644 index 00000000..37374f06 --- /dev/null +++ b/include/picrin/irep.h @@ -0,0 +1,28 @@ +#ifndef IREP_H__ +#define IREP_H__ + +enum pic_instruction { + OP_PUSHNIL, + OP_PUSHI, + OP_PUSHUNDEF, + OP_GREF, + OP_GSET, + OP_CONS, + OP_ADD, + OP_STOP +}; + +struct pic_code { + enum pic_instruction insn; + union { + int i; + struct pic_pair *gvar; + } u; +}; + +struct pic_irep { + struct pic_code *code; + size_t clen, ccapa; +}; + +#endif diff --git a/src/gc.c b/src/gc.c index c584de57..a1ebef63 100644 --- a/src/gc.c +++ b/src/gc.c @@ -2,6 +2,7 @@ #include "picrin.h" #include "picrin/gc.h" +#include "picrin/irep.h" void init_heap_page(struct heap_page *heap) @@ -180,6 +181,33 @@ gc_unmark(union header *p) p->s.mark = PIC_GC_UNMARK; } +static void +gc_finalize_object(pic_state *pic, struct pic_object *obj) +{ + switch (obj->tt) { + case PIC_TT_SYMBOL: { + char *name; + name = ((struct pic_symbol *)obj)->name; + free(name); + break; + } + case PIC_TT_PAIR: { + break; + } + case PIC_TT_PROC: { + struct pic_proc *proc; + + proc = (struct pic_proc *)obj; + + /* free irep */ + free(proc->u.irep->code); + free(proc->u.irep); + } + default: + pic_raise(pic, "logic flaw"); + } +} + static void gc_sweep_phase(pic_state *pic) { @@ -193,6 +221,7 @@ gc_sweep_phase(pic_state *pic) continue; } /* free! */ + gc_finalize_object(pic, (struct pic_object *)(bp + 1)); if (bp + bp->s.size == p->s.ptr) { bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; diff --git a/src/vm.c b/src/vm.c index d42a6dd8..cc601aff 100644 --- a/src/vm.c +++ b/src/vm.c @@ -2,30 +2,7 @@ #include #include "picrin.h" - -enum pic_instruction { - OP_PUSHNIL, - OP_PUSHI, - OP_PUSHUNDEF, - OP_GREF, - OP_GSET, - OP_CONS, - OP_ADD, - OP_STOP -}; - -struct pic_code { - enum pic_instruction insn; - union { - int i; - struct pic_pair *gvar; - } u; -}; - -struct pic_irep { - struct pic_code *code; - size_t clen, ccapa; -}; +#include "picrin/irep.h" static pic_value pic_assq(pic_state *pic, pic_value key, pic_value assoc)