ScriptStack 1.0.4
Loading...
Searching...
No Matches
Memory.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Collections.ObjectModel;
4using System.Text;
5
7{
8 public enum Scope
9 {
13 }
14
15 public class Memory
16 {
17
18 private Scope scope;
19 private Memory sharedMemory;
20 private Memory scriptMemory;
21 private Dictionary<string, object> variables;
22 private Dictionary<string, object> tempVariables;
23
24 private Memory(Scope scope, Memory sharedMemory, Memory scriptMemory)
25 {
26 this.scope = scope;
27 this.sharedMemory = sharedMemory;
28 this.scriptMemory = scriptMemory;
29 variables = new Dictionary<string, object>();
30 tempVariables = new Dictionary<string, object>();
31 }
32
33 internal void HideTemporaryVariables()
34 {
35
36 foreach (String identifier in variables.Keys)
37 if (identifier.StartsWith("["))
38 tempVariables[identifier] = variables[identifier];
39
40 foreach (String strIdentifier in tempVariables.Keys)
41 variables.Remove(strIdentifier);
42
43 }
44
45 internal void ExposeTemporaryVariables()
46 {
47
48 foreach (String identifier in tempVariables.Keys)
49 variables[identifier] = tempVariables[identifier];
50
51 tempVariables.Clear();
52
53 }
54
55 public static Memory AllocateSharedMemory()
56 {
57 return new Memory(Scope.Shared, null, null);
58 }
59
60 public static Memory AllocateScriptMemory(Memory sharedMemory)
61 {
62 return new Memory(Scope.Script, sharedMemory, null);
63 }
64
65 public static Memory AllocateLocalMemory(Memory scriptMemory)
66 {
67 return new Memory(
68 Scope.Local, scriptMemory.sharedMemory, scriptMemory);
69 }
70
71 public void Clear()
72 {
73 variables.Clear();
74 tempVariables.Clear();
75 }
76
77 public bool Exists(string identifier)
78 {
79
80 switch (scope)
81 {
82
83 case Scope.Shared:
84 return variables.ContainsKey(identifier);
85
86 case Scope.Script:
87 if (variables.ContainsKey(identifier))
88 return true;
89 else
90 return sharedMemory.Exists(identifier);
91
92 case Scope.Local:
93 if (variables.ContainsKey(identifier))
94 return true;
95 else
96 return scriptMemory.Exists(identifier);
97
98 default:
99 throw new ExecutionException("Der Scope '" + scope + "' ist unkelannt.");
100
101 }
102
103 }
104
105 public void Remove(string identifier)
106 {
107 variables.Remove(identifier);
108 }
109
110 public Scope Find(string identifier)
111 {
112 switch (scope)
113 {
114
115 case Scope.Shared:
116 if (variables.ContainsKey(identifier))
117 return scope;
118 else
119 throw new ExecutionException("Variable '" + identifier + "' undefined.");
120
121 case Scope.Script:
122 if (variables.ContainsKey(identifier))
123 return scope;
124 else
125 return sharedMemory.Find(identifier);
126
127 case Scope.Local:
128 if (variables.ContainsKey(identifier))
129 return scope;
130 else
131 return scriptMemory.Find(identifier);
132
133 default:
134 throw new ExecutionException("Unknown scope: " + scope);
135
136 }
137
138 }
139
140 public ReadOnlyCollection<string> Identifiers
141 {
142 get
143 {
144 List<String> listIdentifiers
145 = new List<String>(variables.Keys);
146 return listIdentifiers.AsReadOnly();
147 }
148 }
149
150 public object this[string identifier]
151 {
152 get
153 {
154 switch (scope)
155 {
156 case Scope.Shared:
157 if (!variables.ContainsKey(identifier))
158 throw new ExecutionException( "Globale Variable '" + identifier + "' wurde nicht deklariert.");
159 return variables[identifier];
160 case Scope.Script:
161 if (variables.ContainsKey(identifier))
162 return variables[identifier];
163 else
164 return sharedMemory[identifier];
165 case Scope.Local:
166 if (variables.ContainsKey(identifier))
167 return variables[identifier];
168 else
169 return scriptMemory[identifier];
170 default:
171 throw new ExecutionException("Der Scope '" + scope + "' int unbekannt.");
172 }
173 }
174 set
175 {
176 if (!Exists(identifier))
177 variables[identifier] = value;
178 else
179 {
180 switch (scope)
181 {
182 case Scope.Shared:
183 variables[identifier] = value;
184 break;
185 case Scope.Script:
186 if (sharedMemory.Exists(identifier))
187 sharedMemory[identifier] = value;
188 else
189 variables[identifier] = value;
190 break;
191 case Scope.Local:
192 if (scriptMemory.Exists(identifier))
193 scriptMemory[identifier] = value;
194 else
195 variables[identifier] = value;
196 break;
197 }
198 }
199 }
200 }
201
203 {
204 get { return scope; }
205 }
206
207 }
208
209}
void Remove(string identifier)
Definition Memory.cs:105
bool Exists(string identifier)
Definition Memory.cs:77
Scope Find(string identifier)
Definition Memory.cs:110
static Memory AllocateLocalMemory(Memory scriptMemory)
Definition Memory.cs:65
static Memory AllocateSharedMemory()
Definition Memory.cs:55
static Memory AllocateScriptMemory(Memory sharedMemory)
Definition Memory.cs:60
ReadOnlyCollection< string > Identifiers
Definition Memory.cs:141
Internal representation of a text file (source code) which can be passed to the Interpreter to execut...
Definition Script.cs:18