aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-04 23:28:22 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-04 23:28:22 +0000
commit75b69c7f4e7ed84f82c549e36a3928a48720cc26 (patch)
treed400967b67b7e6ec7c922a586ae14c6cda35f6ed /src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
parentbb0b36b86f841ec6340fe6e727ed2ea9db1c2d64 (diff)
Move type coercion decisions into the backends
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Evaluator.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Evaluator.java37
1 files changed, 20 insertions, 17 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
index 3e01f36..bee536a 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java
@@ -1,23 +1,12 @@
package org.zwobble.couscous.interpreter;
-import java.util.List;
-import java.util.stream.Collectors;
-import org.zwobble.couscous.ast.AssignmentNode;
-import org.zwobble.couscous.ast.ConstructorCallNode;
-import org.zwobble.couscous.ast.ExpressionNode;
-import org.zwobble.couscous.ast.FieldAccessNode;
-import org.zwobble.couscous.ast.LiteralNode;
-import org.zwobble.couscous.ast.MethodCallNode;
-import org.zwobble.couscous.ast.StaticMethodCallNode;
-import org.zwobble.couscous.ast.TernaryConditionalNode;
-import org.zwobble.couscous.ast.ThisReferenceNode;
-import org.zwobble.couscous.ast.VariableReferenceNode;
+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.BooleanInterpreterValue;
-import org.zwobble.couscous.interpreter.values.ConcreteType;
-import org.zwobble.couscous.interpreter.values.InterpreterValue;
-import org.zwobble.couscous.interpreter.values.InterpreterValues;
+import org.zwobble.couscous.interpreter.values.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
public static InterpreterValue eval(Environment environment, ExpressionNode expression) {
@@ -107,7 +96,21 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> {
InterpreterValue left = eval(fieldAccess.getLeft());
return left.getField(fieldAccess.getFieldName());
}
-
+
+ @Override
+ public InterpreterValue visit(TypeCoercionNode typeCoercion) {
+ // TODO: check that the type coercion is valid
+ // TODO: boxing booleans
+ InterpreterValue value = eval(typeCoercion.getExpression());
+ if (typeCoercion.isIntegerBox()) {
+ return ((IntegerInterpreterValue)value).box();
+ } else if (typeCoercion.isIntegerUnbox()) {
+ return value.getField("value");
+ } else {
+ return value;
+ }
+ }
+
private List<InterpreterValue> evalArguments(List<? extends ExpressionNode> arguments) {
return arguments.stream()
.map(argument -> eval(argument))