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* left = Evaluate(expression->expression.Binary.left);
|
||||
Object* right = Evaluate(expression->expression.Binary.right);
|
||||
double computed_value;
|
||||
|
||||
switch(expression->expression.Binary.op->type) {
|
||||
case Greater:
|
||||
computed_value = left->value.number > right->value.number;
|
||||
FreeObject(left);
|
||||
FreeObject(right);
|
||||
return CreateObject(&computed_value, TRUE);
|
||||
//return left > right;
|
||||
case Greater_Equal:
|
||||
computed_value = left->value.number >= right->value.number;
|
||||
FreeObject(left);
|
||||
FreeObject(right);
|
||||
return CreateObject(&computed_value, TRUE);
|
||||
//return left >= right;
|
||||
case Less:
|
||||
computed_value = left->value.number < right->value.number;
|
||||
FreeObject(left);
|
||||
FreeObject(right);
|
||||
return CreateObject(&computed_value, TRUE);
|
||||
//return left < right;
|
||||
case Less_Equal:
|
||||
computed_value = left->value.number <= right->value.number;
|
||||
FreeObject(left);
|
||||
FreeObject(right);
|
||||
return CreateObject(&computed_value, TRUE);
|
||||
//return left <= right;
|
||||
case Bang_Equal:
|
||||
computed_value = !IsEqual(left, right);
|
||||
FreeObject(left);
|
||||
FreeObject(right);
|
||||
return CreateObject(&computed_value, TRUE);
|
||||
//return !IsEqual(left, right);
|
||||
case Equal_Equal:
|
||||
computed_value = IsEqual(left, right);
|
||||
FreeObject(left);
|
||||
FreeObject(right);
|
||||
return CreateObject(&computed_value, TRUE);
|
||||
//return IsEqual(left, right);
|
||||
case Minus:
|
||||
left->value.number -= right->value.number;
|
||||
@@ -178,22 +203,21 @@ int ConcatStringObject(Object* a, const Object* b) {
|
||||
}
|
||||
|
||||
int IsTruthy(Object* object) {
|
||||
|
||||
if (!object || object->instance == NIL) return 0;
|
||||
if (object->instance == TRUE) return 0;
|
||||
if (!object || object->instance == INS_NULL) return 0;
|
||||
if (object->instance == INS_BOOLEAN) return object->value.boolean;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int IsEqual(Object* a, Object* b) {
|
||||
if (a->instance == NIL && b->instance == NIL) return 1;
|
||||
if (a->instance == NIL) return 0;
|
||||
if (a->instance == INS_NULL && b->instance == INS_NULL) return 1;
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user