From 87f73abf5e7dcec6a9f5ebd213f4a9eb0a5d45db Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 4 Oct 2015 17:26:27 +0100 Subject: Error if trying to assign to variable not in scope --- .../zwobble/couscous/interpreter/Environment.java | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/interpreter/Environment.java') 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 stackFrame; + private final Map> stackFrame; private final Project project; - public Environment(Project project, Map stackFrame) { + public Environment(Project project, Map> 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 stackFrame) { + public Environment withStackFrame(Map> stackFrame) { return new Environment(project, stackFrame); } + + private void checkVariable(int variableId) { + if (!stackFrame.containsKey(variableId)) { + throw new VariableNotInScope(variableId); + } + } } -- cgit v1.2.3