Fixed a bug in the IsTruthy function. The VisitBinaryExpression now processes more operations.
This commit is contained in:
+31
-7
@@ -23,19 +23,44 @@ void* VisitGroupingExpression(Expr* expression) {
|
|||||||
Object* VisitBinaryExpression(Expr* expression) {
|
Object* VisitBinaryExpression(Expr* expression) {
|
||||||
Object* left = Evaluate(expression->expression.Binary.left);
|
Object* left = Evaluate(expression->expression.Binary.left);
|
||||||
Object* right = Evaluate(expression->expression.Binary.right);
|
Object* right = Evaluate(expression->expression.Binary.right);
|
||||||
|
double computed_value;
|
||||||
|
|
||||||
switch(expression->expression.Binary.op->type) {
|
switch(expression->expression.Binary.op->type) {
|
||||||
case Greater:
|
case Greater:
|
||||||
|
computed_value = left->value.number > right->value.number;
|
||||||
|
FreeObject(left);
|
||||||
|
FreeObject(right);
|
||||||
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return left > right;
|
//return left > right;
|
||||||
case Greater_Equal:
|
case Greater_Equal:
|
||||||
|
computed_value = left->value.number >= right->value.number;
|
||||||
|
FreeObject(left);
|
||||||
|
FreeObject(right);
|
||||||
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return left >= right;
|
//return left >= right;
|
||||||
case Less:
|
case Less:
|
||||||
|
computed_value = left->value.number < right->value.number;
|
||||||
|
FreeObject(left);
|
||||||
|
FreeObject(right);
|
||||||
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return left < right;
|
//return left < right;
|
||||||
case Less_Equal:
|
case Less_Equal:
|
||||||
|
computed_value = left->value.number <= right->value.number;
|
||||||
|
FreeObject(left);
|
||||||
|
FreeObject(right);
|
||||||
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return left <= right;
|
//return left <= right;
|
||||||
case Bang_Equal:
|
case Bang_Equal:
|
||||||
|
computed_value = !IsEqual(left, right);
|
||||||
|
FreeObject(left);
|
||||||
|
FreeObject(right);
|
||||||
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return !IsEqual(left, right);
|
//return !IsEqual(left, right);
|
||||||
case Equal_Equal:
|
case Equal_Equal:
|
||||||
|
computed_value = IsEqual(left, right);
|
||||||
|
FreeObject(left);
|
||||||
|
FreeObject(right);
|
||||||
|
return CreateObject(&computed_value, TRUE);
|
||||||
//return IsEqual(left, right);
|
//return IsEqual(left, right);
|
||||||
case Minus:
|
case Minus:
|
||||||
left->value.number -= right->value.number;
|
left->value.number -= right->value.number;
|
||||||
@@ -178,22 +203,21 @@ int ConcatStringObject(Object* a, const Object* b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int IsTruthy(Object* object) {
|
int IsTruthy(Object* object) {
|
||||||
|
if (!object || object->instance == INS_NULL) return 0;
|
||||||
if (!object || object->instance == NIL) return 0;
|
if (object->instance == INS_BOOLEAN) return object->value.boolean;
|
||||||
if (object->instance == TRUE) return 0;
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int IsEqual(Object* a, Object* b) {
|
int IsEqual(Object* a, Object* b) {
|
||||||
if (a->instance == NIL && b->instance == NIL) return 1;
|
if (a->instance == INS_NULL && b->instance == INS_NULL) return 1;
|
||||||
if (a->instance == NIL) return 0;
|
if (a->instance == INS_NULL) return 0;
|
||||||
|
|
||||||
if (b->instance == Number && b->instance == Number) {
|
if (b->instance == INS_DOUBLE && b->instance == INS_DOUBLE) {
|
||||||
return a->value.number == b->value.number;
|
return a->value.number == b->value.number;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a->instance == String && b->instance == String) {
|
if (a->instance == INS_STRING && b->instance == INS_STRING) {
|
||||||
return strcmp(a->value.string, b->value.string) == 0;
|
return strcmp(a->value.string, b->value.string) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user