Updated the Makefile, set debug option for the compiler, and fixed all the warnings generated by gcc with O2 optimization option for release builds.
This commit is contained in:
+19
-7
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user