repl now shares state

This commit is contained in:
CPunch 2020-10-28 18:38:50 -05:00
parent 8e71cab642
commit a15c8d67a1

View File

@ -7,12 +7,18 @@
#include "cmem.h" #include "cmem.h"
static void interpret(const char* script) { static bool _ACTIVE;
CState *state = cosmoV_newState();
int cosmoB_quitRepl(CState *state, int nargs, CValue *args) {
_ACTIVE = false;
return 0; // we don't do anything to the stack
}
static void interpret(CState *state, const char* script) {
// cosmoP_compileString pushes the result onto the stack (NIL or COBJ_FUNCTION) // cosmoP_compileString pushes the result onto the stack (NIL or COBJ_FUNCTION)
CObjFunction* func = cosmoP_compileString(state, script); CObjFunction* func = cosmoP_compileString(state, script);
cosmoB_loadlibrary(state);
if (func != NULL) { if (func != NULL) {
disasmChunk(&func->chunk, "_main", 0); disasmChunk(&func->chunk, "_main", 0);
@ -22,14 +28,19 @@ static void interpret(const char* script) {
//cosmoT_printTable(&state->globals, "globals"); //cosmoT_printTable(&state->globals, "globals");
//cosmoT_printTable(&state->strings, "strings"); //cosmoT_printTable(&state->strings, "strings");
} }
cosmoV_freeState(state);
} }
static void repl() { static void repl() {
char line[1024]; char line[1024];
_ACTIVE = true;
while (true) { CState *state = cosmoV_newState();
cosmoB_loadlibrary(state);
// TODO: there's gotta be a better way to do this
cosmoV_register(state, "quit", cosmoV_newObj(cosmoO_newCFunction(state, cosmoB_quitRepl)));
while (_ACTIVE) {
printf("> "); printf("> ");
if (!fgets(line, sizeof(line), stdin)) { // better than gets() if (!fgets(line, sizeof(line), stdin)) { // better than gets()
@ -37,8 +48,10 @@ static void repl() {
break; break;
} }
interpret(line); interpret(state, line);
} }
cosmoV_freeState(state);
} }
static char *readFile(const char* path) { static char *readFile(const char* path) {
@ -75,9 +88,12 @@ static char *readFile(const char* path) {
static void runFile(const char* fileName) { static void runFile(const char* fileName) {
char* script = readFile(fileName); char* script = readFile(fileName);
CState *state = cosmoV_newState();
interpret(script);
interpret(state, script);
cosmoV_freeState(state);
free(script); free(script);
} }