From 3b89e216cc98d4185c2d52e5dcafc6ca9cc46e8a Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sun, 7 Aug 2022 16:46:54 +0100 Subject: [PATCH] Fixed an non-optimized grouping bug --- source/compiler.c | 4 ++-- source/node.c | 9 +++++++++ source/node.h | 1 + source/parser.c | 2 +- source/repl_main.c | 6 ++++++ 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/source/compiler.c b/source/compiler.c index 84dccf9..e1ba003 100644 --- a/source/compiler.c +++ b/source/compiler.c @@ -68,9 +68,9 @@ void writeCompiler(Compiler* compiler, Node* node) { break; case NODE_GROUPING: - compiler->bytecode[compiler->count++] = OP_GROUPING_BEGIN; //1 byte + compiler->bytecode[compiler->count++] = (unsigned char)OP_GROUPING_BEGIN; //1 byte writeCompiler(compiler, node->grouping.child); - compiler->bytecode[compiler->count++] = OP_GROUPING_END; //1 byte + compiler->bytecode[compiler->count++] = (unsigned char)OP_GROUPING_END; //1 byte break; } } diff --git a/source/node.c b/source/node.c index 2e658e9..728a22d 100644 --- a/source/node.c +++ b/source/node.c @@ -60,6 +60,15 @@ void emitNodeBinary(Node** nodeHandle, Node* rhs, Opcode opcode) { *nodeHandle = tmp; } +void emitNodeGrouping(Node** nodeHandle) { + Node* tmp = ALLOCATE(Node, 1); + + tmp->type = NODE_GROUPING; + tmp->grouping.child = NULL; + + *nodeHandle = tmp; +} + void printNode(Node* node) { switch(node->type) { case NODE_LITERAL: diff --git a/source/node.h b/source/node.h index 0288b89..11a1812 100644 --- a/source/node.h +++ b/source/node.h @@ -49,6 +49,7 @@ void freeNode(Node* node); void emitNodeLiteral(Node** nodeHandle, Literal literal); void emitNodeUnary(Node** nodeHandle, Opcode opcode); void emitNodeBinary(Node** nodeHandle, Node* rhs, Opcode opcode); +void emitNodeGrouping(Node** nodeHandle); void printNode(Node* node); diff --git a/source/parser.c b/source/parser.c index 7ca4805..99dec9b 100644 --- a/source/parser.c +++ b/source/parser.c @@ -143,7 +143,7 @@ static Opcode grouping(Parser* parser, Node** nodeHandle, bool canBeAssigned) { } //process the result without optimisations - emitNodeUnary(nodeHandle, NODE_GROUPING); + emitNodeGrouping(nodeHandle); nodeHandle = &((*nodeHandle)->unary.child); //re-align after append (*nodeHandle) = tmpNode; return OP_EOF; diff --git a/source/repl_main.c b/source/repl_main.c index edf1a40..3194927 100644 --- a/source/repl_main.c +++ b/source/repl_main.c @@ -133,6 +133,12 @@ void repl() { int size = 0; char* tb = collateCompiler(&compiler, &size); + // for (int i = 0; i < size; i++) { + // printf("%d ", tb[i]); + // } + + // printf("\n"); + //run the bytecode initInterpreter(&interpreter, tb, size); runInterpreter(&interpreter);