From bfed4e23f37f9a148f73be9d4e1118a33d1fa18c Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Fri, 31 Jan 2025 10:16:06 +1100 Subject: [PATCH] Repl works, also fixed a few small bugs --- repl/main.c | 53 +++++++++++++++++++++---------------- source/toy_console_colors.h | 2 ++ source/toy_module.c | 4 +++ source/toy_vm.c | 7 ++++- source/toy_vm.h | 2 +- 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/repl/main.c b/repl/main.c index 011234c..581c8b9 100644 --- a/repl/main.c +++ b/repl/main.c @@ -1,4 +1,9 @@ -#include "toy.h" +#include "toy_console_colors.h" + +#include "toy_lexer.h" +#include "toy_parser.h" +#include "toy_module_builder.h" +#include "toy_vm.h" #include #include @@ -111,21 +116,21 @@ static void printCallback(const char* msg) { } static void errorAndExitCallback(const char* msg) { - fprintf(stderr, "Error: %s\n", msg); + fprintf(stderr, TOY_CC_ERROR "Error: %s\n" TOY_CC_RESET, msg); exit(-1); } static void errorAndContinueCallback(const char* msg) { - fprintf(stderr, "Error: %s\n", msg); + fprintf(stderr, TOY_CC_ERROR "Error: %s\n" TOY_CC_RESET, msg); } static void assertFailureAndExitCallback(const char* msg) { - fprintf(stderr, "Assert Failure: %s\n", msg); + fprintf(stderr, TOY_CC_ASSERT "Assert Failure: %s\n" TOY_CC_RESET, msg); exit(-1); } static void assertFailureAndContinueCallback(const char* msg) { - fprintf(stderr, "Assert Failure: %s\n", msg); + fprintf(stderr, TOY_CC_ASSERT "Assert Failure: %s\n" TOY_CC_RESET, msg); } static void noOpCallback(const char* msg) { @@ -222,7 +227,7 @@ CmdLine parseCmdLine(int argc, const char* argv[]) { } else if (!strcmp(argv[i], "-f") || !strcmp(argv[i], "--file")) { - if (argc < i + 1) { + if (argc <= i + 1) { cmd.error = true; } else { @@ -291,7 +296,7 @@ int repl(const char* filepath) { Toy_VM vm; Toy_initVM(&vm); - printf("%s> ", prompt); //shows the terminal prompt + printf("%s> ", prompt); //shows the terminal prompt and begin //read from the terminal while(fgets(inputBuffer, INPUT_BUFFER_SIZE, stdin)) { @@ -301,8 +306,8 @@ int repl(const char* filepath) { inputBuffer[--length] = '\0'; } - if (length == 0) { - printf("%s> ", prompt); //shows the terminal prompt + if (length == 0 || !inputBuffer[ strspn(inputBuffer, " \r\n\t") ]) { + printf("%s> ", prompt); //shows the terminal prompt and restart continue; } @@ -311,7 +316,7 @@ int repl(const char* filepath) { break; } - //parse the input, prep the VM for run + //parse the input, prep the VM for execution Toy_Lexer lexer; Toy_bindLexer(&lexer, inputBuffer); Toy_Parser parser; @@ -325,15 +330,16 @@ int repl(const char* filepath) { continue; } - Toy_ModuleBundle bc = Toy_compileModuleBundle(ast); - Toy_bindVM(&vm, &bc); + void* buffer = Toy_compileModuleBuilder(ast); + Toy_Module module = Toy_parseModule(buffer); + Toy_bindVM(&vm, &module); //run Toy_runVM(&vm); - //free the bytecode, and leave the VM ready for the next loop + //free the memory, and leave the VM ready for the next loop Toy_resetVM(&vm); - Toy_freeModuleBundle(bc); + free(buffer); printf("%s> ", prompt); //shows the terminal prompt } @@ -435,7 +441,7 @@ int main(int argc, const char* argv[]) { versionCmdLine(argc, argv); } else if (cmd.infile != NULL) { - //run the given file + //read the source file int size; unsigned char* source = readFile(cmd.infile, &size); @@ -462,6 +468,7 @@ int main(int argc, const char* argv[]) { cmd.infile = NULL; cmd.infileLength = 0; + //compile the source code Toy_Lexer lexer; Toy_bindLexer(&lexer, (char*)source); @@ -472,15 +479,17 @@ int main(int argc, const char* argv[]) { Toy_Bucket* bucket = Toy_allocateBucket(TOY_BUCKET_IDEAL); Toy_Ast* ast = Toy_scanParser(&bucket, &parser); + void* buffer = Toy_compileModuleBuilder(ast); + Toy_freeBucket(&bucket); + free(source); - Toy_ModuleBundle bc = Toy_compileModuleBundle(ast); - - //run the setup + //run the compiled code Toy_VM vm; Toy_initVM(&vm); - Toy_bindVM(&vm, &bc); - //run + Toy_Module module = Toy_parseModule(buffer); + Toy_bindVM(&vm, &module); + Toy_runVM(&vm); //print the debug info @@ -491,9 +500,7 @@ int main(int argc, const char* argv[]) { //cleanup Toy_freeVM(&vm); - Toy_freeModuleBundle(bc); - Toy_freeBucket(&bucket); - free(source); + free(buffer); } else { repl(argv[0]); diff --git a/source/toy_console_colors.h b/source/toy_console_colors.h index 1f30823..9b06dde 100644 --- a/source/toy_console_colors.h +++ b/source/toy_console_colors.h @@ -41,6 +41,7 @@ NOTE: you need both font AND background for these to work #define TOY_CC_NOTICE TOY_CC_FONT_GREEN TOY_CC_BACK_BLACK #define TOY_CC_WARN TOY_CC_FONT_YELLOW TOY_CC_BACK_BLACK #define TOY_CC_ERROR TOY_CC_FONT_RED TOY_CC_BACK_BLACK +#define TOY_CC_ASSERT TOY_CC_FONT_PURPLE TOY_CC_BACK_BLACK #define TOY_CC_RESET "\033[0m" //for unsupported platforms, these become no-ops @@ -72,6 +73,7 @@ NOTE: you need both font AND background for these to work #define TOY_CC_NOTICE TOY_CC_FONT_GREEN TOY_CC_BACK_BLACK #define TOY_CC_WARN TOY_CC_FONT_YELLOW TOY_CC_BACK_BLACK #define TOY_CC_ERROR TOY_CC_FONT_RED TOY_CC_BACK_BLACK +#define TOY_CC_ASSERT TOY_CC_FONT_PURPLE TOY_CC_BACK_BLACK #define TOY_CC_RESET #endif diff --git a/source/toy_module.c b/source/toy_module.c index d330a49..781d0cb 100644 --- a/source/toy_module.c +++ b/source/toy_module.c @@ -8,6 +8,10 @@ static inline unsigned int readUnsignedInt(unsigned char** handle) { } Toy_Module Toy_parseModule(unsigned char* ptr) { + if (ptr == NULL) { + return (Toy_Module){ 0 }; + } + Toy_Module module; module.scopePtr = NULL; diff --git a/source/toy_vm.c b/source/toy_vm.c index aede964..8218d63 100644 --- a/source/toy_vm.c +++ b/source/toy_vm.c @@ -982,7 +982,7 @@ void Toy_inheritVM(Toy_VM* vm, Toy_VM* parent) { Toy_resetVM(vm); } -void Toy_bindVMToModule(Toy_VM* vm, Toy_Module* module) { +void Toy_bindVM(Toy_VM* vm, Toy_Module* module) { vm->code = module->code; vm->jumpsCount = module->jumpsCount; @@ -1000,6 +1000,11 @@ void Toy_bindVMToModule(Toy_VM* vm, Toy_Module* module) { } void Toy_runVM(Toy_VM* vm) { + if (vm->codeAddr == 0) { + //ignore uninitialized VMs or empty modules + return; + } + //TODO: read params into scope //prep the program counter for execution diff --git a/source/toy_vm.h b/source/toy_vm.h index 0f8d07d..e40e20b 100644 --- a/source/toy_vm.h +++ b/source/toy_vm.h @@ -47,7 +47,7 @@ TOY_API void Toy_resetVM(Toy_VM* vm); //persists memory TOY_API void Toy_initVM(Toy_VM* vm); //creates memory TOY_API void Toy_inheritVM(Toy_VM* vm, Toy_VM* parent); //inherits memory -TOY_API void Toy_bindVMToModule(Toy_VM* vm, Toy_Module* module); +TOY_API void Toy_bindVM(Toy_VM* vm, Toy_Module* module); TOY_API void Toy_runVM(Toy_VM* vm); TOY_API void Toy_freeVM(Toy_VM* vm);