diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/YEngine/MMRScriptVarDict.cs (renamed from OpenSim/Region/ScriptEngine/XMREngine/MMRScriptVarDict.cs) | 253 |
1 files changed, 158 insertions, 95 deletions
diff --git a/OpenSim/Region/ScriptEngine/XMREngine/MMRScriptVarDict.cs b/OpenSim/Region/ScriptEngine/YEngine/MMRScriptVarDict.cs index 67e1c34..2561d02 100644 --- a/OpenSim/Region/ScriptEngine/XMREngine/MMRScriptVarDict.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/MMRScriptVarDict.cs | |||
@@ -33,63 +33,80 @@ using System.Collections.Generic; | |||
33 | * @brief Collection of variable/function/method definitions | 33 | * @brief Collection of variable/function/method definitions |
34 | */ | 34 | */ |
35 | 35 | ||
36 | namespace OpenSim.Region.ScriptEngine.XMREngine | 36 | namespace OpenSim.Region.ScriptEngine.Yengine |
37 | { | 37 | { |
38 | public class VarDict : IEnumerable { | 38 | public class VarDict: IEnumerable |
39 | { | ||
39 | public VarDict outerVarDict; // next outer VarDict to search | 40 | public VarDict outerVarDict; // next outer VarDict to search |
40 | public TokenDeclSDTypeClass thisClass; // this VarDict is for members of thisClass | 41 | public TokenDeclSDTypeClass thisClass; // this VarDict is for members of thisClass |
41 | 42 | ||
42 | private struct ArgTypes { | 43 | private struct ArgTypes |
44 | { | ||
43 | public TokenType[] argTypes; | 45 | public TokenType[] argTypes; |
44 | 46 | ||
45 | public bool CanBeCalledBy (TokenType[] calledBy) | 47 | public bool CanBeCalledBy(TokenType[] calledBy) |
46 | { | 48 | { |
47 | if ((argTypes == null) && (calledBy == null)) return true; | 49 | if((argTypes == null) && (calledBy == null)) |
48 | if ((argTypes == null) || (calledBy == null)) return false; | 50 | return true; |
49 | if (argTypes.Length != calledBy.Length) return false; | 51 | if((argTypes == null) || (calledBy == null)) |
50 | for (int i = argTypes.Length; -- i >= 0;) { | 52 | return false; |
51 | if (!TypeCast.IsAssignableFrom (argTypes[i], calledBy[i])) return false; | 53 | if(argTypes.Length != calledBy.Length) |
54 | return false; | ||
55 | for(int i = argTypes.Length; --i >= 0;) | ||
56 | { | ||
57 | if(!TypeCast.IsAssignableFrom(argTypes[i], calledBy[i])) | ||
58 | return false; | ||
52 | } | 59 | } |
53 | return true; | 60 | return true; |
54 | } | 61 | } |
55 | 62 | ||
56 | public override bool Equals (Object that) | 63 | public override bool Equals(Object that) |
57 | { | 64 | { |
58 | if (that == null) return false; | 65 | if(that == null) |
59 | if (that.GetType () != typeof (ArgTypes)) return false; | 66 | return false; |
67 | if(that.GetType() != typeof(ArgTypes)) | ||
68 | return false; | ||
60 | TokenType[] at = this.argTypes; | 69 | TokenType[] at = this.argTypes; |
61 | TokenType[] bt = ((ArgTypes)that).argTypes; | 70 | TokenType[] bt = ((ArgTypes)that).argTypes; |
62 | if ((at == null) && (bt == null)) return true; | 71 | if((at == null) && (bt == null)) |
63 | if ((at == null) || (bt == null)) return false; | 72 | return true; |
64 | if (at.Length != bt.Length) return false; | 73 | if((at == null) || (bt == null)) |
65 | for (int i = at.Length; -- i >= 0;) { | 74 | return false; |
66 | if (at[i].ToString () != bt[i].ToString ()) return false; | 75 | if(at.Length != bt.Length) |
76 | return false; | ||
77 | for(int i = at.Length; --i >= 0;) | ||
78 | { | ||
79 | if(at[i].ToString() != bt[i].ToString()) | ||
80 | return false; | ||
67 | } | 81 | } |
68 | return true; | 82 | return true; |
69 | } | 83 | } |
70 | 84 | ||
71 | public override int GetHashCode () | 85 | public override int GetHashCode() |
72 | { | 86 | { |
73 | TokenType[] at = this.argTypes; | 87 | TokenType[] at = this.argTypes; |
74 | if (at == null) return -1; | 88 | if(at == null) |
89 | return -1; | ||
75 | int hc = 0; | 90 | int hc = 0; |
76 | for (int i = at.Length; -- i >= 0;) { | 91 | for(int i = at.Length; --i >= 0;) |
92 | { | ||
77 | int c = (hc < 0) ? 1 : 0; | 93 | int c = (hc < 0) ? 1 : 0; |
78 | hc = hc * 2 + c; | 94 | hc = hc * 2 + c; |
79 | hc ^= at[i].ToString ().GetHashCode (); | 95 | hc ^= at[i].ToString().GetHashCode(); |
80 | } | 96 | } |
81 | return hc; | 97 | return hc; |
82 | } | 98 | } |
83 | } | 99 | } |
84 | 100 | ||
85 | private struct TDVEntry { | 101 | private struct TDVEntry |
102 | { | ||
86 | public int count; | 103 | public int count; |
87 | public TokenDeclVar var; | 104 | public TokenDeclVar var; |
88 | } | 105 | } |
89 | 106 | ||
90 | private bool isFrozen = false; | 107 | private bool isFrozen = false; |
91 | private bool locals; | 108 | private bool locals; |
92 | private Dictionary<string, Dictionary<ArgTypes, TDVEntry>> master = new Dictionary<string, Dictionary<ArgTypes, TDVEntry>> (); | 109 | private Dictionary<string, Dictionary<ArgTypes, TDVEntry>> master = new Dictionary<string, Dictionary<ArgTypes, TDVEntry>>(); |
93 | private int count = 0; | 110 | private int count = 0; |
94 | private VarDict frozenLocals = null; | 111 | private VarDict frozenLocals = null; |
95 | 112 | ||
@@ -98,7 +115,7 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
98 | * @param locals = false: cannot be frozen, allows forward references | 115 | * @param locals = false: cannot be frozen, allows forward references |
99 | * true: can be frozen, thus forbidding forward references | 116 | * true: can be frozen, thus forbidding forward references |
100 | */ | 117 | */ |
101 | public VarDict (bool locals) | 118 | public VarDict(bool locals) |
102 | { | 119 | { |
103 | this.locals = locals; | 120 | this.locals = locals; |
104 | } | 121 | } |
@@ -106,19 +123,21 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
106 | /** | 123 | /** |
107 | * @brief Add new variable to the dictionary. | 124 | * @brief Add new variable to the dictionary. |
108 | */ | 125 | */ |
109 | public bool AddEntry (TokenDeclVar var) | 126 | public bool AddEntry(TokenDeclVar var) |
110 | { | 127 | { |
111 | if (isFrozen) { | 128 | if(isFrozen) |
112 | throw new Exception ("var dict is frozen"); | 129 | { |
130 | throw new Exception("var dict is frozen"); | ||
113 | } | 131 | } |
114 | 132 | ||
115 | /* | 133 | /* |
116 | * Make sure we have a sub-dictionary based on the bare name (ie, no signature) | 134 | * Make sure we have a sub-dictionary based on the bare name (ie, no signature) |
117 | */ | 135 | */ |
118 | Dictionary<ArgTypes, TDVEntry> typedic; | 136 | Dictionary<ArgTypes, TDVEntry> typedic; |
119 | if (!master.TryGetValue (var.name.val, out typedic)) { | 137 | if(!master.TryGetValue(var.name.val, out typedic)) |
120 | typedic = new Dictionary<ArgTypes, TDVEntry> (); | 138 | { |
121 | master.Add (var.name.val, typedic); | 139 | typedic = new Dictionary<ArgTypes, TDVEntry>(); |
140 | master.Add(var.name.val, typedic); | ||
122 | } | 141 | } |
123 | 142 | ||
124 | /* | 143 | /* |
@@ -127,41 +146,50 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
127 | * Methods always have a non-null argument list, even if only 0 entries long. | 146 | * Methods always have a non-null argument list, even if only 0 entries long. |
128 | */ | 147 | */ |
129 | ArgTypes types; | 148 | ArgTypes types; |
130 | types.argTypes = (var.argDecl == null) ? null : KeyTypesToStringTypes (var.argDecl.types); | 149 | types.argTypes = (var.argDecl == null) ? null : KeyTypesToStringTypes(var.argDecl.types); |
131 | if (typedic.ContainsKey (types)) return false; | 150 | if(typedic.ContainsKey(types)) |
151 | return false; | ||
132 | 152 | ||
133 | /* | 153 | /* |
134 | * It is unique, add to its name-specific sub-dictionary. | 154 | * It is unique, add to its name-specific sub-dictionary. |
135 | */ | 155 | */ |
136 | TDVEntry entry; | 156 | TDVEntry entry; |
137 | entry.count = ++ count; | 157 | entry.count = ++count; |
138 | entry.var = var; | 158 | entry.var = var; |
139 | typedic.Add (types, entry); | 159 | typedic.Add(types, entry); |
140 | return true; | 160 | return true; |
141 | } | 161 | } |
142 | 162 | ||
143 | public int Count { get { return count; } } | 163 | public int Count |
164 | { | ||
165 | get | ||
166 | { | ||
167 | return count; | ||
168 | } | ||
169 | } | ||
144 | 170 | ||
145 | /** | 171 | /** |
146 | * @brief If this is not a local variable frame, just return the frame as is. | 172 | * @brief If this is not a local variable frame, just return the frame as is. |
147 | * If this is a local variable frame, return a version that is frozen, | 173 | * If this is a local variable frame, return a version that is frozen, |
148 | * ie, one that does not contain any future additions. | 174 | * ie, one that does not contain any future additions. |
149 | */ | 175 | */ |
150 | public VarDict FreezeLocals () | 176 | public VarDict FreezeLocals() |
151 | { | 177 | { |
152 | /* | 178 | /* |
153 | * If not local var frame, return original frame as is. | 179 | * If not local var frame, return original frame as is. |
154 | * This will allow forward references as the future additions | 180 | * This will allow forward references as the future additions |
155 | * will be seen by lookups done in this dictionary. | 181 | * will be seen by lookups done in this dictionary. |
156 | */ | 182 | */ |
157 | if (!locals) return this; | 183 | if(!locals) |
184 | return this; | ||
158 | 185 | ||
159 | /* | 186 | /* |
160 | * If local var frame, return a copy frozen at this point. | 187 | * If local var frame, return a copy frozen at this point. |
161 | * This disallows forward referenes as those future additions | 188 | * This disallows forward referenes as those future additions |
162 | * will not be seen by lookups done in the frozen dictionary. | 189 | * will not be seen by lookups done in the frozen dictionary. |
163 | */ | 190 | */ |
164 | if ((frozenLocals == null) || (frozenLocals.count != this.count)) { | 191 | if((frozenLocals == null) || (frozenLocals.count != this.count)) |
192 | { | ||
165 | 193 | ||
166 | /* | 194 | /* |
167 | * Make a copy of the current var dictionary frame. | 195 | * Make a copy of the current var dictionary frame. |
@@ -169,12 +197,12 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
169 | * contain additions made after this point, those additions | 197 | * contain additions made after this point, those additions |
170 | * will have a count .gt. frozen count and will be ignored. | 198 | * will have a count .gt. frozen count and will be ignored. |
171 | */ | 199 | */ |
172 | frozenLocals = new VarDict (true); | 200 | frozenLocals = new VarDict(true); |
173 | 201 | ||
174 | frozenLocals.outerVarDict = this.outerVarDict; | 202 | frozenLocals.outerVarDict = this.outerVarDict; |
175 | frozenLocals.thisClass = this.thisClass; | 203 | frozenLocals.thisClass = this.thisClass; |
176 | frozenLocals.master = this.master; | 204 | frozenLocals.master = this.master; |
177 | frozenLocals.count = this.count; | 205 | frozenLocals.count = this.count; |
178 | frozenLocals.frozenLocals = frozenLocals; | 206 | frozenLocals.frozenLocals = frozenLocals; |
179 | 207 | ||
180 | /* | 208 | /* |
@@ -196,23 +224,27 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
196 | * else: list of matching functions/variables | 224 | * else: list of matching functions/variables |
197 | * for variables, always of length 1 | 225 | * for variables, always of length 1 |
198 | */ | 226 | */ |
199 | private List<TokenDeclVar> found = new List<TokenDeclVar> (); | 227 | private List<TokenDeclVar> found = new List<TokenDeclVar>(); |
200 | public TokenDeclVar[] FindCallables (string name, TokenType[] argTypes) | 228 | public TokenDeclVar[] FindCallables(string name, TokenType[] argTypes) |
201 | { | 229 | { |
202 | argTypes = KeyTypesToStringTypes (argTypes); | 230 | argTypes = KeyTypesToStringTypes(argTypes); |
203 | TokenDeclVar var = FindExact (name, argTypes); | 231 | TokenDeclVar var = FindExact(name, argTypes); |
204 | if (var != null) return new TokenDeclVar[] { var }; | 232 | if(var != null) |
233 | return new TokenDeclVar[] { var }; | ||
205 | 234 | ||
206 | Dictionary<ArgTypes, TDVEntry> typedic; | 235 | Dictionary<ArgTypes, TDVEntry> typedic; |
207 | if (!master.TryGetValue (name, out typedic)) return null; | 236 | if(!master.TryGetValue(name, out typedic)) |
237 | return null; | ||
208 | 238 | ||
209 | found.Clear (); | 239 | found.Clear(); |
210 | foreach (KeyValuePair<ArgTypes, TDVEntry> kvp in typedic) { | 240 | foreach(KeyValuePair<ArgTypes, TDVEntry> kvp in typedic) |
211 | if ((kvp.Value.count <= this.count) && kvp.Key.CanBeCalledBy (argTypes)) { | 241 | { |
212 | found.Add (kvp.Value.var); | 242 | if((kvp.Value.count <= this.count) && kvp.Key.CanBeCalledBy(argTypes)) |
243 | { | ||
244 | found.Add(kvp.Value.var); | ||
213 | } | 245 | } |
214 | } | 246 | } |
215 | return (found.Count > 0) ? found.ToArray () : null; | 247 | return (found.Count > 0) ? found.ToArray() : null; |
216 | } | 248 | } |
217 | 249 | ||
218 | /** | 250 | /** |
@@ -223,19 +255,22 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
223 | * @returns null: no matching function/variable found | 255 | * @returns null: no matching function/variable found |
224 | * else: the matching function/variable | 256 | * else: the matching function/variable |
225 | */ | 257 | */ |
226 | public TokenDeclVar FindExact (string name, TokenType[] argTypes) | 258 | public TokenDeclVar FindExact(string name, TokenType[] argTypes) |
227 | { | 259 | { |
228 | /* | 260 | /* |
229 | * Look for list of stuff that matches the given name. | 261 | * Look for list of stuff that matches the given name. |
230 | */ | 262 | */ |
231 | Dictionary<ArgTypes, TDVEntry> typedic; | 263 | Dictionary<ArgTypes, TDVEntry> typedic; |
232 | if (!master.TryGetValue (name, out typedic)) return null; | 264 | if(!master.TryGetValue(name, out typedic)) |
265 | return null; | ||
233 | 266 | ||
234 | /* | 267 | /* |
235 | * Loop through all fields/methods declared by that name, regardless of arg signature. | 268 | * Loop through all fields/methods declared by that name, regardless of arg signature. |
236 | */ | 269 | */ |
237 | foreach (TDVEntry entry in typedic.Values) { | 270 | foreach(TDVEntry entry in typedic.Values) |
238 | if (entry.count > this.count) continue; | 271 | { |
272 | if(entry.count > this.count) | ||
273 | continue; | ||
239 | TokenDeclVar var = entry.var; | 274 | TokenDeclVar var = entry.var; |
240 | 275 | ||
241 | /* | 276 | /* |
@@ -248,12 +283,13 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
248 | /* | 283 | /* |
249 | * Convert any key args to string args. | 284 | * Convert any key args to string args. |
250 | */ | 285 | */ |
251 | declArgs = KeyTypesToStringTypes (declArgs); | 286 | declArgs = KeyTypesToStringTypes(declArgs); |
252 | 287 | ||
253 | /* | 288 | /* |
254 | * If both are null, they are signature-less (ie, both are fields), and so match. | 289 | * If both are null, they are signature-less (ie, both are fields), and so match. |
255 | */ | 290 | */ |
256 | if ((declArgs == null) && (argTypes == null)) return var; | 291 | if((declArgs == null) && (argTypes == null)) |
292 | return var; | ||
257 | 293 | ||
258 | /* | 294 | /* |
259 | * If calling a delegate, it is a match, regardless of delegate arg types. | 295 | * If calling a delegate, it is a match, regardless of delegate arg types. |
@@ -261,29 +297,38 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
261 | * trying to cast the arguments to the delegate arg types. | 297 | * trying to cast the arguments to the delegate arg types. |
262 | * We don't allow overloading same field name with different delegate types. | 298 | * We don't allow overloading same field name with different delegate types. |
263 | */ | 299 | */ |
264 | if ((declArgs == null) && (argTypes != null)) { | 300 | if((declArgs == null) && (argTypes != null)) |
301 | { | ||
265 | TokenType fieldType = var.type; | 302 | TokenType fieldType = var.type; |
266 | if (fieldType is TokenTypeSDTypeDelegate) return var; | 303 | if(fieldType is TokenTypeSDTypeDelegate) |
304 | return var; | ||
267 | } | 305 | } |
268 | 306 | ||
269 | /* | 307 | /* |
270 | * If not both null, no match, keep looking. | 308 | * If not both null, no match, keep looking. |
271 | */ | 309 | */ |
272 | if ((declArgs == null) || (argTypes == null)) continue; | 310 | if((declArgs == null) || (argTypes == null)) |
311 | continue; | ||
273 | 312 | ||
274 | /* | 313 | /* |
275 | * Both not null, match argument types to make sure we have correct overload. | 314 | * Both not null, match argument types to make sure we have correct overload. |
276 | */ | 315 | */ |
277 | int i = declArgs.Length; | 316 | int i = declArgs.Length; |
278 | if (i != argTypes.Length) continue; | 317 | if(i != argTypes.Length) |
279 | while (-- i >= 0) { | 318 | continue; |
280 | string da = declArgs[i].ToString (); | 319 | while(--i >= 0) |
281 | string ga = argTypes[i].ToString (); | 320 | { |
282 | if (da == "key") da = "string"; | 321 | string da = declArgs[i].ToString(); |
283 | if (ga == "key") ga = "string"; | 322 | string ga = argTypes[i].ToString(); |
284 | if (da != ga) break; | 323 | if(da == "key") |
324 | da = "string"; | ||
325 | if(ga == "key") | ||
326 | ga = "string"; | ||
327 | if(da != ga) | ||
328 | break; | ||
285 | } | 329 | } |
286 | if (i < 0) return var; | 330 | if(i < 0) |
331 | return var; | ||
287 | } | 332 | } |
288 | 333 | ||
289 | /* | 334 | /* |
@@ -299,20 +344,26 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
299 | * @param argTypes = argument types as declared in source code | 344 | * @param argTypes = argument types as declared in source code |
300 | * @returns argTypes with any key replaced by string | 345 | * @returns argTypes with any key replaced by string |
301 | */ | 346 | */ |
302 | private static TokenType[] KeyTypesToStringTypes (TokenType[] argTypes) | 347 | private static TokenType[] KeyTypesToStringTypes(TokenType[] argTypes) |
303 | { | 348 | { |
304 | if (argTypes != null) { | 349 | if(argTypes != null) |
350 | { | ||
305 | int i; | 351 | int i; |
306 | int nats = argTypes.Length; | 352 | int nats = argTypes.Length; |
307 | for (i = nats; -- i >= 0;) { | 353 | for(i = nats; --i >= 0;) |
308 | if (argTypes[i] is TokenTypeKey) break; | 354 | { |
355 | if(argTypes[i] is TokenTypeKey) | ||
356 | break; | ||
309 | } | 357 | } |
310 | if (i >= 0) { | 358 | if(i >= 0) |
359 | { | ||
311 | TokenType[] at = new TokenType[nats]; | 360 | TokenType[] at = new TokenType[nats]; |
312 | for (i = nats; -- i >= 0;) { | 361 | for(i = nats; --i >= 0;) |
362 | { | ||
313 | at[i] = argTypes[i]; | 363 | at[i] = argTypes[i]; |
314 | if (argTypes[i] is TokenTypeKey) { | 364 | if(argTypes[i] is TokenTypeKey) |
315 | at[i] = new TokenTypeStr (argTypes[i]); | 365 | { |
366 | at[i] = new TokenTypeStr(argTypes[i]); | ||
316 | } | 367 | } |
317 | } | 368 | } |
318 | return at; | 369 | return at; |
@@ -324,48 +375,60 @@ namespace OpenSim.Region.ScriptEngine.XMREngine | |||
324 | // foreach goes through all the TokenDeclVars that were added | 375 | // foreach goes through all the TokenDeclVars that were added |
325 | 376 | ||
326 | // IEnumerable | 377 | // IEnumerable |
327 | public IEnumerator GetEnumerator () | 378 | public IEnumerator GetEnumerator() |
328 | { | 379 | { |
329 | return new VarDictEnumerator (this.master, this.count); | 380 | return new VarDictEnumerator(this.master, this.count); |
330 | } | 381 | } |
331 | 382 | ||
332 | private class VarDictEnumerator : IEnumerator { | 383 | private class VarDictEnumerator: IEnumerator |
384 | { | ||
333 | private IEnumerator masterEnum; | 385 | private IEnumerator masterEnum; |
334 | private IEnumerator typedicEnum; | 386 | private IEnumerator typedicEnum; |
335 | private int count; | 387 | private int count; |
336 | 388 | ||
337 | public VarDictEnumerator (Dictionary<string, Dictionary<ArgTypes, TDVEntry>> master, int count) | 389 | public VarDictEnumerator(Dictionary<string, Dictionary<ArgTypes, TDVEntry>> master, int count) |
338 | { | 390 | { |
339 | masterEnum = master.Values.GetEnumerator (); | 391 | masterEnum = master.Values.GetEnumerator(); |
340 | this.count = count; | 392 | this.count = count; |
341 | } | 393 | } |
342 | 394 | ||
343 | // IEnumerator | 395 | // IEnumerator |
344 | public void Reset () | 396 | public void Reset() |
345 | { | 397 | { |
346 | masterEnum.Reset (); | 398 | masterEnum.Reset(); |
347 | typedicEnum = null; | 399 | typedicEnum = null; |
348 | } | 400 | } |
349 | 401 | ||
350 | // IEnumerator | 402 | // IEnumerator |
351 | public bool MoveNext () | 403 | public bool MoveNext() |
352 | { | 404 | { |
353 | while (true) { | 405 | while(true) |
354 | if (typedicEnum != null) { | 406 | { |
355 | while (typedicEnum.MoveNext ()) { | 407 | if(typedicEnum != null) |
356 | if (((TDVEntry)typedicEnum.Current).count <= this.count) return true; | 408 | { |
409 | while(typedicEnum.MoveNext()) | ||
410 | { | ||
411 | if(((TDVEntry)typedicEnum.Current).count <= this.count) | ||
412 | return true; | ||
357 | } | 413 | } |
358 | typedicEnum = null; | 414 | typedicEnum = null; |
359 | } | 415 | } |
360 | if (!masterEnum.MoveNext ()) return false; | 416 | if(!masterEnum.MoveNext()) |
417 | return false; | ||
361 | Dictionary<ArgTypes, TDVEntry> ctd; | 418 | Dictionary<ArgTypes, TDVEntry> ctd; |
362 | ctd = (Dictionary<ArgTypes, TDVEntry>)masterEnum.Current; | 419 | ctd = (Dictionary<ArgTypes, TDVEntry>)masterEnum.Current; |
363 | typedicEnum = ctd.Values.GetEnumerator (); | 420 | typedicEnum = ctd.Values.GetEnumerator(); |
364 | } | 421 | } |
365 | } | 422 | } |
366 | 423 | ||
367 | // IEnumerator | 424 | // IEnumerator |
368 | public object Current { get { return ((TDVEntry)typedicEnum.Current).var; } } | 425 | public object Current |
426 | { | ||
427 | get | ||
428 | { | ||
429 | return ((TDVEntry)typedicEnum.Current).var; | ||
430 | } | ||
431 | } | ||
369 | } | 432 | } |
370 | } | 433 | } |
371 | } | 434 | } |