Reviewed-on: #7 Co-authored-by: tema5002 <tema5002@tuta.io> Co-committed-by: tema5002 <tema5002@tuta.io>
84 lines
1.9 KiB
C
84 lines
1.9 KiB
C
#include "vm.h"
|
|
#include "helper.h"
|
|
|
|
noomV_Object *noomV_allocObj(noom_LuaVM *vm, noomV_ObjTag tag, noom_uint_t size) {
|
|
noomV_Object *o = noom_alloc(size);
|
|
if(o == 0) return o;
|
|
|
|
o->tag = tag;
|
|
o->marked = 0;
|
|
o->next = vm->heap;
|
|
o->nextGray = 0;
|
|
vm->heap = o;
|
|
return o;
|
|
}
|
|
|
|
noomV_String *noomV_allocStr(noom_LuaVM *vm, const char *str, noom_uint_t len) {
|
|
noomV_String *s = (noomV_String*)noomV_allocObj(vm, NOOMV_OSTR, sizeof(noomV_String) + len + 1);
|
|
if (s == 0) return 0;
|
|
noom_memcpy(s->data, str, len);
|
|
s->data[len] = '\0';
|
|
return s;
|
|
}
|
|
|
|
noomV_Function *noomV_allocFunc(noom_LuaVM *vm, const char *str, noom_uint_t len) {
|
|
noomV_Function *f = (noomV_Function*)noomV_allocObj(vm, NOOMV_OFUNC, sizeof(noomV_Function));
|
|
if (f == 0) return 0;
|
|
f->chunkname = noomV_allocStr(vm, str, len);
|
|
if (f->chunkname == 0) return 0;
|
|
f->code = 0;
|
|
f->consts = 0;
|
|
f->protos = 0;
|
|
f->upvals = 0;
|
|
f->locals = 0;
|
|
f->codesize = 0;
|
|
f->linedefined = 0;
|
|
f->lastlinedefined = 0;
|
|
f->argc = 0;
|
|
f->flags = 0;
|
|
f->constsize = 0;
|
|
f->protosize = 0;
|
|
f->upvalsize = 0;
|
|
f->localsize = 0;
|
|
return f;
|
|
}
|
|
|
|
noomV_Table *noomV_allocTable(noom_LuaVM *vm) {
|
|
noomV_Table *t = (noomV_Table *)noomV_allocObj(vm, NOOMV_OTABLE, sizeof(noomV_Table));
|
|
if (t == 0) return 0;
|
|
t->meta = 0;
|
|
t->entries = 0;
|
|
t->used = 0;
|
|
t->len = 0;
|
|
t->entrydata = 0;
|
|
return t;
|
|
}
|
|
|
|
void noomV_freeObj(noomV_Object *obj) {
|
|
noom_free(obj);
|
|
}
|
|
|
|
noom_LuaVM *noom_createVM(noom_LuaVersion version) {
|
|
noom_LuaVM *vm = noom_alloc(sizeof(*vm));
|
|
if(vm == 0) return 0;
|
|
// initialize the universe to NULL, handles partial OOMs nicely
|
|
vm->heap = 0;
|
|
vm->graySet = 0;
|
|
vm->globals = 0;
|
|
vm->registry = 0;
|
|
vm->mainThread = 0;
|
|
vm->currentThread = 0;
|
|
vm->version = version;
|
|
return vm;
|
|
}
|
|
|
|
void noom_destroyVM(noom_LuaVM *vm) {
|
|
noomV_Object *iter = vm->heap;
|
|
while(iter) {
|
|
noomV_Object *cur = iter;
|
|
iter = iter->next;
|
|
noomV_freeObj(cur);
|
|
}
|
|
noom_free(vm);
|
|
}
|