Fixed a bug in the IsTruthy function. The VisitBinaryExpression now processes more operations.

This commit is contained in:
2022-03-14 19:20:03 +00:00
parent 3044f23bcc
commit 1ded68ddee
+31 -7
View File
@@ -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;
}