Browse Source

actually run the GC

master
Martin Dørum 3 years ago
parent
commit
08cd621d90
2 changed files with 20 additions and 8 deletions
  1. 1
    0
      include/lang2/vm/vm.h
  2. 19
    8
      lib/vm/vm.c

+ 1
- 0
include/lang2/vm/vm.h View File

@@ -91,6 +91,7 @@ int l2_vm_namespace_replace(struct l2_vm *vm, struct l2_vm_value *ns, l2_word ke

struct l2_vm {
int halted;
int gc_scheduled;
l2_word *ops;
size_t opcount;
l2_word iptr;

+ 19
- 8
lib/vm/vm.c View File

@@ -12,16 +12,20 @@ static struct l2_io_file_writer std_error;

static l2_word alloc_val(struct l2_vm *vm) {
size_t id = l2_bitset_set_next(&vm->valueset);
if (id >= vm->valuessize) {
if (vm->valuessize == 0) {
vm->valuessize = 16;
}
if (id + 16 >= vm->valuessize) {
if (id >= vm->valuessize) {
if (vm->valuessize == 0) {
vm->valuessize = 64;
}

while (id >= vm->valuessize) {
vm->valuessize *= 2;
}
while (id >= vm->valuessize) {
vm->valuessize *= 2;
}

vm->values = realloc(vm->values, sizeof(*vm->values) * vm->valuessize);
vm->values = realloc(vm->values, sizeof(*vm->values) * vm->valuessize);
} else {
vm->gc_scheduled = 1;
}
}

return (l2_word)id;
@@ -112,6 +116,7 @@ static size_t gc_sweep(struct l2_vm *vm) {

struct l2_vm_value *val = &vm->values[i];
if (!(val->flags & L2_VAL_MARKED)) {
l2_bitset_unset(&vm->valueset, i);
gc_free(vm, i);
freed += 1;
} else {
@@ -150,6 +155,7 @@ void l2_vm_init(struct l2_vm *vm, l2_word *ops, size_t opcount) {
vm->std_error = &std_error.w;

vm->halted = 0;
vm->gc_scheduled = 0;
vm->ops = ops;
vm->opcount = opcount;
vm->iptr = 0;
@@ -565,4 +571,9 @@ void l2_vm_step(struct l2_vm *vm) {
vm->halted = 1;
break;
}

if (vm->gc_scheduled) {
l2_vm_gc(vm);
vm->gc_scheduled = 0;
}
}

Loading…
Cancel
Save