add object finalizer
This commit is contained in:
parent
dc2f25ef2a
commit
a5db43ba91
|
@ -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
|
29
src/gc.c
29
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;
|
||||
|
|
25
src/vm.c
25
src/vm.c
|
@ -2,30 +2,7 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#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)
|
||||
|
|
Loading…
Reference in New Issue