diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-04 17:26:27 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-04 17:26:27 +0100 |
| commit | 87f73abf5e7dcec6a9f5ebd213f4a9eb0a5d45db (patch) | |
| tree | 9bec5d45a55f728d5d32c4c8c26c165f88bf2dee /src/main/java/org/zwobble/couscous/interpreter/Environment.java | |
| parent | 47fad1a4e01422c16c900d38938c210456337dca (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.java | 20 |
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); + } + } } |
