From c3f1c8239578bfa1b74aa0175e39506d97682b40 Mon Sep 17 00:00:00 2001 From: Lukasz Baldyga Date: Thu, 3 Dec 2020 14:20:01 +0000 Subject: [PATCH] Made it possible to access variables down the stack --- .../Verbs/Value/ValueStorage.cs | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs index df0ed16..7090818 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs @@ -16,8 +16,9 @@ namespace Advanced_Software_Engineering.Verbs.Value { SetStack(0); } - public void SetStack(int stack) { - currentStack = stack < 0 ? 0 : stack; + private void SetStack(int stack) { + if (stack < 0) throw new Exception("Stack cannot be less than 0"); + if (!Variables.ContainsKey(stack)) Variables.Add(currentStack, new Dictionary()); } @@ -34,36 +35,42 @@ namespace Advanced_Software_Engineering.Verbs.Value { } } - public void SetVariable(string name, int stack, IValue value) { - if (stack == 0) Variables[stack][name] = value; - else { - if (CheckVariableExists(name, stack)) Variables[stack][name] = value; - else if (CheckVariableExists(name, 0)) Variables[0][name] = value; - else Variables[stack][name] = value; + private void SetVariable(string name, int stack, IValue value) { + for (int internalStack = stack; internalStack >= 0; internalStack--) { + if (value == null || CheckVariableExists(name, internalStack)) { + Variables[internalStack][name] = value; + return; + } } + Variables[stack][name] = value; } public void SetVariable(string name, IValue value) { SetVariable(name, currentStack, value); } - public IValue GetVariable(string name, int stack) { + private IValue GetVariable(string name, int stack) { return Variables[stack][name]; } public IValue GetVariable(string name) { - if (currentStack > 0 && CheckVariableExists(name, currentStack)) return GetVariable(name, currentStack); - else if (CheckVariableExists(name, 0)) return GetVariable(name, 0); - else throw new Exception("Cannot find variable " + name); + for (int stack = currentStack; stack >= 0; stack--) { + if (CheckVariableExists(name, stack)) return GetVariable(name, stack); + } + throw new Exception("Cannot find variable " + name); } - public bool CheckVariableExists(string name, int stack) { + private bool CheckVariableExists(string name, int stack) { if (name == null) return false; return Variables[stack].ContainsKey(name); } public bool CheckVariableExists(string name) { - return CheckVariableExists(name, currentStack) || CheckVariableExists(name, 0); + if (name == null) return false; + for (int stack = currentStack; stack >= 0; stack--) { + if (CheckVariableExists(name, stack)) return true; + } + return false; } } }