From bf59a986289eab76e1d628776ea724d356d1a348 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Fri, 18 Mar 2022 17:01:15 +0000 Subject: [PATCH] Updated the Makefile, set debug option for the compiler, and fixed all the warnings generated by gcc with O2 optimization option for release builds. --- Makefile | 4 ++-- src/interpreter.c | 26 +++++++++++++++++++------- src/token.c | 2 +- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 49a4c16..d50b88b 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC = gcc -CFLAGS=-Wall -DDEBUG +CFLAGS=-g -Wall -DDEBUG SRCDIR=src OBJDIR=obj SRCS=$(wildcard $(SRCDIR)/*.c) @@ -31,7 +31,7 @@ $(OBJDIR): .PHONY: test clean: - rm -r $(BINDIR)/* $(OBJDIR)/* + rm -rf $(BINDIR)/* $(OBJDIR)/* test: $(BIN) test.lox \ No newline at end of file diff --git a/src/interpreter.c b/src/interpreter.c index 19f83e8..4f3ee10 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -14,7 +14,7 @@ Object* VisitBinaryExpression(Expr*); int IsTruthy(Object*); int IsEqual(Object*, Object*); int ConcatStringObject(Object*, const Object*); -void CheckNumberOperand(TokenType, int, ...); +void CheckNumberOperands(TokenType, int, ...); void PrintObject(Object*); void PrintObject(Object* o) { @@ -70,54 +70,61 @@ Object* VisitBinaryExpression(Expr* expression) { switch(expression->expression.Binary.op->type) { case Greater: + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); computed_value = left->value.number > right->value.number; FreeObject(left); FreeObject(right); return CreateObject(&computed_value, TRUE); //return left > right; case Greater_Equal: + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); computed_value = left->value.number >= right->value.number; FreeObject(left); FreeObject(right); return CreateObject(&computed_value, TRUE); //return left >= right; case Less: + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); computed_value = left->value.number < right->value.number; FreeObject(left); FreeObject(right); return CreateObject(&computed_value, TRUE); //return left < right; case Less_Equal: + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); computed_value = left->value.number <= right->value.number; FreeObject(left); FreeObject(right); return CreateObject(&computed_value, TRUE); //return left <= right; case Bang_Equal: + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); computed_value = !IsEqual(left, right); FreeObject(left); FreeObject(right); return CreateObject(&computed_value, TRUE); //return !IsEqual(left, right); case Equal_Equal: + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); computed_value = IsEqual(left, right); FreeObject(left); FreeObject(right); return CreateObject(&computed_value, TRUE); //return IsEqual(left, right); case Minus: - + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); left->value.number -= right->value.number; FreeObject(right); return left; //return left - right; case Slash: + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); left->value.number /= right->value.number; FreeObject(right); return left; //return *((double*)left) / *((double*)right); case Star: - printf("%f * %f = %f\n", left->value.number, right->value.number, left->value.number * right->value.number); + CheckNumberOperands(expression->expression.Binary.op->type, 2, left, right); left->value.number *= right->value.number; FreeObject(right); return left; @@ -158,7 +165,7 @@ Object* VisitUnaryExpression(Expr* expression) { switch (expression->expression.Unary.op->type) { case Minus: - CheckNumberOperand(expression->expression.Unary.op->type, right);//This needs to "throw" if the function fails. + CheckNumberOperands(expression->expression.Unary.op->type, 1, right);//This needs to "throw" if the function fails. computed_value = -right->value.number; FreeObject(right); c = CreateObject(&computed_value, Number); @@ -222,11 +229,16 @@ Object* CreateObject(const void* value, TokenType type) { break; default: if (value) { - int length = strlen(value); + unsigned int length = strlen(value); object->instance = INS_STRING; object->value.string = calloc(length + 1, sizeof(char)); + + if (!object->value.string) { + fprintf(stderr, "Faild to calloc %u bytes for a new string Object. %s.\n", length + 1, strerror(errno)); + return NULL; + } - strncpy(object->value.string, value, length); + memcpy(object->value.string, value, length); } else object->instance = INS_NULL; //TODO: this is most likely an error, but we'll ignore that for now. } @@ -284,7 +296,7 @@ int IsEqual(Object* a, Object* b) { return 0; } -void CheckNumberOperand(TokenType operator, int operandCount, ...) { +void CheckNumberOperands(TokenType operator, int operandCount, ...) { va_list list; va_start(list, operandCount); diff --git a/src/token.c b/src/token.c index f76176c..98a65f3 100644 --- a/src/token.c +++ b/src/token.c @@ -33,7 +33,7 @@ Token* CreateToken(const char* lexeme, void* literal, int line, TokenType type) const char* mapping_result = GetLexemeMapping(type); if (!mapping_result) { - fprintf(stderr, "Failed to get the mapping for %s\n", lexeme); + fprintf(stderr, "Failed to get the mapping for TokenType value %d.\n", type); free(token); return NULL; }