6
|
1 using System;
|
|
2 using System.Collections.Generic;
|
|
3
|
|
4 namespace Jint.Runtime.VM
|
|
5 {
|
|
6 class Scope
|
|
7 {
|
|
8 Frame m_frame;
|
|
9 Dictionary<string,int> m_vars;
|
|
10 Scope m_parent;
|
|
11
|
|
12 public const int ThisRegister = 0;
|
|
13 public const int ScopeRegister = 1;
|
|
14 public const int FirstVarRegsiter = 2;
|
|
15
|
|
16 public Scope (IDictionary<string,int> vars, Frame frame, Scope parent)
|
|
17 {
|
|
18 if (vars == null)
|
|
19 throw new ArgumentNullException ("vars");
|
|
20 if (frame == null)
|
|
21 throw new ArgumentNullException ("frame");
|
|
22
|
|
23 m_vars = new Dictionary<string, int> (vars);
|
|
24 m_frame = frame;
|
|
25 m_parent = parent;
|
|
26 }
|
|
27
|
|
28 public IReference Resolve(string name) {
|
|
29 if (String.IsNullOrEmpty (name))
|
|
30 throw new ArgumentException ("The specified variable name is invalid");
|
|
31
|
|
32 int index;
|
|
33 if (m_vars.TryGetValue (name, out index))
|
|
34 return new ScopeReference (this, index);
|
|
35
|
|
36 if (m_parent != null)
|
|
37 return m_parent.Resolve (name);
|
|
38 else
|
|
39 throw new KeyNotFoundException (String.Format("The specified variable '{0}' isn't found",name));
|
|
40 }
|
|
41 }
|
|
42 }
|
|
43
|