aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/interpreter/Environment.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2015-10-04 17:26:27 +0100
committerMichael Williamson <mike@zwobble.org>2015-10-04 17:26:27 +0100
commit87f73abf5e7dcec6a9f5ebd213f4a9eb0a5d45db (patch)
tree9bec5d45a55f728d5d32c4c8c26c165f88bf2dee /src/main/java/org/zwobble/couscous/interpreter/Environment.java
parent47fad1a4e01422c16c900d38938c210456337dca (diff)
Error if trying to assign to variable not in scope
Diffstat (limited to 'src/main/java/org/zwobble/couscous/interpreter/Environment.java')
-rw-r--r--src/main/java/org/zwobble/couscous/interpreter/Environment.java20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
index ced87c8..5985a94 100644
--- a/src/main/java/org/zwobble/couscous/interpreter/Environment.java
+++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java
@@ -2,6 +2,7 @@ package org.zwobble.couscous.interpreter;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import org.zwobble.couscous.Project;
import org.zwobble.couscous.ast.VariableNode;
@@ -9,24 +10,25 @@ import org.zwobble.couscous.values.ConcreteType;
import org.zwobble.couscous.values.InterpreterValue;
public class Environment {
- private final Map<Integer, InterpreterValue> stackFrame;
+ private final Map<Integer, Optional<InterpreterValue>> stackFrame;
private final Project project;
- public Environment(Project project, Map<Integer, InterpreterValue> stackFrame) {
+ public Environment(Project project, Map<Integer, Optional<InterpreterValue>> stackFrame) {
this.project = project;
this.stackFrame = new HashMap<>(stackFrame);
}
public InterpreterValue get(int referentId) {
- return stackFrame.get(referentId);
+ return stackFrame.get(referentId).get();
}
public void put(int variableId, InterpreterValue value) {
- stackFrame.put(variableId, value);
+ checkVariable(variableId);
+ stackFrame.put(variableId, Optional.of(value));
}
public void put(VariableNode variable, InterpreterValue value) {
- stackFrame.put(variable.getId(), value);
+ put(variable.getId(), value);
}
public ConcreteType<?> findClass(String className) {
@@ -34,7 +36,13 @@ public class Environment {
return project.findClass(className);
}
- public Environment withStackFrame(Map<Integer, InterpreterValue> stackFrame) {
+ public Environment withStackFrame(Map<Integer, Optional<InterpreterValue>> stackFrame) {
return new Environment(project, stackFrame);
}
+
+ private void checkVariable(int variableId) {
+ if (!stackFrame.containsKey(variableId)) {
+ throw new VariableNotInScope(variableId);
+ }
+ }
}