2020-10-28 05:16:30 +00:00
|
|
|
#include "cstate.h"
|
|
|
|
#include "cchunk.h"
|
|
|
|
#include "cobj.h"
|
|
|
|
#include "cvm.h"
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
CState *cosmoV_newState() {
|
|
|
|
// we use C's malloc because we don't want to trigger a GC with an invalid state
|
|
|
|
CState *state = malloc(sizeof(CState));
|
|
|
|
|
|
|
|
if (state == NULL) {
|
|
|
|
CERROR("failed to allocate memory!");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
state->panic = false;
|
|
|
|
state->freezeGC = false;
|
|
|
|
|
|
|
|
// GC
|
|
|
|
state->objects = NULL;
|
|
|
|
state->grayCount = 0;
|
|
|
|
state->grayCapacity = 2;
|
|
|
|
state->grayStack = NULL;
|
|
|
|
state->allocatedBytes = 0;
|
|
|
|
state->nextGC = 1024 * 8; // threshhold starts at 8kb
|
|
|
|
|
|
|
|
// init stack
|
|
|
|
state->top = state->stack;
|
|
|
|
state->frameCount = 0;
|
|
|
|
state->openUpvalues = NULL;
|
|
|
|
|
|
|
|
cosmoT_initTable(state, &state->strings, 8); // init string table
|
|
|
|
cosmoT_initTable(state, &state->globals, 8); // init global table
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
|
|
|
|
void cosmoV_freeState(CState *state) {
|
|
|
|
// frees all the objects
|
|
|
|
CObj *objs = state->objects;
|
|
|
|
while (objs != NULL) {
|
|
|
|
CObj *next = objs->next;
|
2020-11-06 01:53:55 +00:00
|
|
|
cosmoO_free(state, objs);
|
2020-10-28 05:16:30 +00:00
|
|
|
objs = next;
|
|
|
|
}
|
|
|
|
|
|
|
|
// free our string & global table
|
|
|
|
cosmoT_clearTable(state, &state->strings);
|
|
|
|
cosmoT_clearTable(state, &state->globals);
|
|
|
|
|
|
|
|
// free our gray stack & finally free the state structure
|
|
|
|
free(state->grayStack);
|
|
|
|
free(state);
|
|
|
|
}
|
|
|
|
|
|
|
|
void cosmoV_register(CState *state, const char *identifier, CValue val) {
|
|
|
|
// we push the values so the garbage collector can find them
|
|
|
|
cosmoV_pushValue(state, val);
|
2020-11-03 04:32:39 +00:00
|
|
|
cosmoV_pushValue(state, cosmoV_newObj(cosmoO_copyString(state, identifier, strlen(identifier))));
|
2020-10-28 05:16:30 +00:00
|
|
|
|
2020-11-03 04:32:39 +00:00
|
|
|
CValue *oldVal = cosmoT_insert(state, &state->globals, *cosmoV_getTop(state, 0));
|
2020-10-28 05:16:30 +00:00
|
|
|
*oldVal = val;
|
|
|
|
|
|
|
|
cosmoV_setTop(state, 2); // pops the 2 values off the stack
|
|
|
|
}
|
|
|
|
|
|
|
|
void cosmoV_printStack(CState *state) {
|
|
|
|
printf("==== [[ stack dump ]] ====\n");
|
|
|
|
for (CValue *top = state->top - 1; top >= state->stack; top--) {
|
|
|
|
printf("%d: ", (int)(top - state->stack));
|
|
|
|
printValue(*top);
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
}
|