From 70e0b6ab2078bd4743aa064587977b64a935746c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 4 Jan 2016 23:46:01 +0000 Subject: Move boxing methods from type coercion node into evaluator --- .../zwobble/couscous/interpreter/Evaluator.java | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java') diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index bee536a..910cba7 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -4,6 +4,8 @@ import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.interpreter.values.*; +import org.zwobble.couscous.values.BooleanValue; +import org.zwobble.couscous.values.IntegerValue; import java.util.List; import java.util.stream.Collectors; @@ -102,15 +104,35 @@ public class Evaluator implements ExpressionNodeMapper { // TODO: check that the type coercion is valid // TODO: boxing booleans InterpreterValue value = eval(typeCoercion.getExpression()); - if (typeCoercion.isIntegerBox()) { + if (isIntegerBox(typeCoercion)) { return ((IntegerInterpreterValue)value).box(); - } else if (typeCoercion.isIntegerUnbox()) { + } else if (isIntegerUnbox(typeCoercion)) { return value.getField("value"); } else { return value; } } + private static boolean isIntegerBox(TypeCoercionNode typeCoercion) { + return typeCoercion.getExpression().getType().equals(IntegerValue.REF) && + !typeCoercion.getType().equals(IntegerValue.REF); + } + + private static boolean isIntegerUnbox(TypeCoercionNode typeCoercion) { + return !typeCoercion.getExpression().getType().equals(IntegerValue.REF) && + typeCoercion.getType().equals(IntegerValue.REF); + } + + private static boolean isBooleanBox(TypeCoercionNode typeCoercion) { + return typeCoercion.getExpression().getType().equals(BooleanValue.REF) && + !typeCoercion.getType().equals(BooleanValue.REF); + } + + private static boolean isBooleanUnbox(TypeCoercionNode typeCoercion) { + return !typeCoercion.getExpression().getType().equals(BooleanValue.REF) && + typeCoercion.getType().equals(BooleanValue.REF); + } + private List evalArguments(List arguments) { return arguments.stream() .map(argument -> eval(argument)) -- cgit v1.2.3