|
1 # Debugger.Environment |
|
2 |
|
3 A `Debugger.Environment` instance represents a lexical environment, |
|
4 associating names with variables. Each [`Debugger.Frame`][frame] instance |
|
5 representing a debuggee frame has an associated environment object |
|
6 describing the variables in scope in that frame; and each |
|
7 [`Debugger.Object`][object] instance representing a debuggee function has an |
|
8 environment object representing the environment the function has closed |
|
9 over. |
|
10 |
|
11 ECMAScript environments form a tree, in which each local environment is |
|
12 parented by its enclosing environment (in ECMAScript terms, its 'outer' |
|
13 environment). We say an environment <i>binds</i> an identifier if that |
|
14 environment itself associates the identifier with a variable, independently |
|
15 of its outer environments. We say an identifier is <i>in scope</i> in an |
|
16 environment if the identifier is bound in that environment or any enclosing |
|
17 environment. |
|
18 |
|
19 SpiderMonkey creates `Debugger.Environment` instances as needed as the |
|
20 debugger inspects stack frames and function objects; calling |
|
21 `Debugger.Environment` as a function or constructor raises a `TypeError` |
|
22 exception. |
|
23 |
|
24 SpiderMonkey creates exactly one `Debugger.Environment` instance for each |
|
25 environment it presents via a given [`Debugger`][debugger-object] instance: |
|
26 if the debugger encounters the same environment through two different |
|
27 routes (perhaps two functions have closed over the same environment), |
|
28 SpiderMonkey presents the same `Debugger.Environment` instance to the |
|
29 debugger each time. This means that the debugger can use the `==` operator |
|
30 to recognize when two `Debugger.Environment` instances refer to the same |
|
31 environment in the debuggee, and place its own properties on a |
|
32 `Debugger.Environment` instance to store metadata about particular |
|
33 environments. |
|
34 |
|
35 (If more than one [`Debugger`][debugger-object] instance is debugging the |
|
36 same code, each [`Debugger`][debugger-object] gets a separate |
|
37 `Debugger.Environment` instance for a given environment. This allows the |
|
38 code using each [`Debugger`][debugger-object] instance to place whatever |
|
39 properties it likes on its own [`Debugger.Object`][object] instances, |
|
40 without worrying about interfering with other debuggers.) |
|
41 |
|
42 If a `Debugger.Environment` instance's referent is not a debuggee |
|
43 environment, then attempting to access its properties (other than |
|
44 `inspectable`) or call any its methods throws an instance of `Error`. |
|
45 |
|
46 `Debugger.Environment` instances protect their referents from the |
|
47 garbage collector; as long as the `Debugger.Environment` instance is |
|
48 live, the referent remains live. Garbage collection has no visible |
|
49 effect on `Debugger.Environment` instances. |
|
50 |
|
51 |
|
52 ## Accessor Properties of the Debugger.Environment Prototype Object |
|
53 |
|
54 A `Debugger.Environment` instance inherits the following accessor |
|
55 properties from its prototype: |
|
56 |
|
57 `inspectable` |
|
58 : True if this environment is a debuggee environment, and can therefore |
|
59 be inspected. False otherwise. All other properties and methods of |
|
60 `Debugger.Environment` instances throw if applied to a non-inspectable |
|
61 environment. |
|
62 |
|
63 `type` |
|
64 : The type of this environment object, one of the following values: |
|
65 |
|
66 * "declarative", indicating that the environment is a declarative |
|
67 environment record. Function calls, calls to `eval`, `let` blocks, |
|
68 `catch` blocks, and the like create declarative environment records. |
|
69 |
|
70 * "object", indicating that the environment's bindings are the |
|
71 properties of an object. The global object and DOM elements appear in |
|
72 the chain of environments via object environments. (Note that `with` |
|
73 statements have their own environment type.) |
|
74 |
|
75 * "with", indicating that the environment was introduced by a `with` |
|
76 statement. |
|
77 |
|
78 `parent` |
|
79 : The environment that encloses this one (the "outer" environment, in |
|
80 ECMAScript terminology), or `null` if this is the outermost environment. |
|
81 |
|
82 `object` |
|
83 : A [`Debugger.Object`][object] instance referring to the object whose |
|
84 properties this environment reflects. If this is a declarative |
|
85 environment record, this accessor throws a `TypeError` (since |
|
86 declarative environment records have no such object). Both `"object"` |
|
87 and `"with"` environments have `object` properties that provide the |
|
88 object whose properties they reflect as variable bindings. |
|
89 |
|
90 `callee` |
|
91 : If this environment represents the variable environment (the top-level |
|
92 environment within the function, which receives `var` definitions) for |
|
93 a call to a function <i>f</i>, then this property's value is a |
|
94 [`Debugger.Object`][object] instance referring to <i>f</i>. Otherwise, |
|
95 this property's value is `null`. |
|
96 |
|
97 |
|
98 |
|
99 ## Function Properties of the Debugger.Environment Prototype Object |
|
100 |
|
101 The methods described below may only be called with a `this` value |
|
102 referring to a `Debugger.Environment` instance; they may not be used as |
|
103 methods of other kinds of objects. |
|
104 |
|
105 `names()` |
|
106 : Return an array of strings giving the names of the identifiers bound by |
|
107 this environment. The result does not include the names of identifiers |
|
108 bound by enclosing environments. |
|
109 |
|
110 <code>getVariable(<i>name</i>)</code> |
|
111 : Return the value of the variable bound to <i>name</i> in this |
|
112 environment, or `undefined` if this environment does not bind |
|
113 <i>name</i>. <i>Name</i> must be a string that is a valid ECMAScript |
|
114 identifier name. The result is a debuggee value. |
|
115 |
|
116 JavaScript engines often omit variables from environments, to save space |
|
117 and reduce execution time. If the given variable should be in scope, but |
|
118 `getVariable` is unable to produce its value, it returns an ordinary |
|
119 JavaScript object (not a [`Debugger.Object`][object] instance) whose |
|
120 `optimizedOut` property is `true`. |
|
121 |
|
122 This is not an [invocation function][inv fr]; |
|
123 if this call would cause debuggee code to run (say, because the |
|
124 environment is a `"with"` environment, and <i>name</i> refers to an |
|
125 accessor property of the `with` statement's operand), this call throws a |
|
126 [`Debugger.DebuggeeWouldRun`][wouldrun] |
|
127 exception. |
|
128 |
|
129 <code>setVariable(<i>name</i>, <i>value</i>)</code> |
|
130 : Store <i>value</i> as the value of the variable bound to <i>name</i> in |
|
131 this environment. <i>Name</i> must be a string that is a valid |
|
132 ECMAScript identifier name; <i>value</i> must be a debuggee value. |
|
133 |
|
134 If this environment binds no variable named <i>name</i>, throw a |
|
135 `ReferenceError`. |
|
136 |
|
137 This is not an [invocation function][inv fr]; |
|
138 if this call would cause debuggee code to run, this call throws a |
|
139 [`Debugger.DebuggeeWouldRun`][wouldrun] |
|
140 exception. |
|
141 |
|
142 <code>getVariableDescriptor(<i>name</i>)</code> |
|
143 : Return an property descriptor describing the variable bound to |
|
144 <i>name</i> in this environment, of the sort returned by |
|
145 `Debugger.Object.prototype.getOwnPropertyDescriptor`. <i>Name</i> must |
|
146 be a string whose value is a valid ECMAScript identifier name. |
|
147 |
|
148 If this is an `"object"` or `"with"` environment record, this simply |
|
149 returns the descriptor for the given property of the environment's |
|
150 object. If this is a declarative environment record, this returns a |
|
151 descriptor reflecting the binding's mutability as the descriptor's |
|
152 `writable` property, and its deletability as the descriptor's |
|
153 `configurable` property. All declarative environment record bindings are |
|
154 marked as `enumerable`. <i>(This isn't great; the semantics of variables |
|
155 in declarative enviroments don't really match those of properties, so |
|
156 writing code that operates properly on descriptors for either kind may |
|
157 be difficult.)</i> |
|
158 |
|
159 If this environment binds no variable named <i>name</i>, throw a |
|
160 `ReferenceError`. |
|
161 |
|
162 <code>defineVariable(<i>name</i>, <i>descriptor</i>)</code> |
|
163 : Create or reconfigure the variable bound to <i>name</i> in this |
|
164 environment according to <i>descriptor</i>. <i>Descriptor</i> is the |
|
165 sort of value returned by `getVariableDescriptor`. On success, return |
|
166 `undefined`; on failure, throw an appropriate exception. <i>Name</i> |
|
167 must be a string whose value is a valid ECMAScript identifier name. |
|
168 |
|
169 If implementation restrictions prevent SpiderMonkey from creating or |
|
170 reconfiguring the variable as requested, this call throws an `Error` |
|
171 exception. |
|
172 |
|
173 <code>deleteVariable(<i>name</i>)</code> |
|
174 : Delete this environment's binding for <i>name</i>. |
|
175 |
|
176 If this environment binds no variable named <i>name</i>, throw a |
|
177 `ReferenceError`. |
|
178 |
|
179 If implementation restrictions prevent SpiderMonkey from deleting the |
|
180 variable as requested, this call throws an `Error` exception. |
|
181 |
|
182 <code>find(<i>name</i>)</code> |
|
183 : Return a reference to the innermost environment, starting with this |
|
184 environment, that binds <i>name</i>. If <i>name</i> is not in scope in |
|
185 this environment, return `null`. <i>Name</i> must be a string whose |
|
186 value is a valid ECMAScript identifier name. |
|
187 |
|
188 <code>eval(<i>code</i>)</code> <i>(future plan)</i> |
|
189 : Evaluate <i>code</i> in this environment, and return a |
|
190 [completion value][cv] describing how it completed. <i>Code</i> is a |
|
191 string. All extant handler methods, breakpoints, watchpoints, and so on |
|
192 remain active during the call. This function follows the |
|
193 [invocation function conventions][inv fr]. |
|
194 |
|
195 <i>Code</i> is interpreted as strict mode code when it contains a Use |
|
196 Strict Directive. |
|
197 |
|
198 If <i>code</i> is not strict mode code, then variable declarations in |
|
199 <i>code</i> affect this environment. (In the terms used by the |
|
200 ECMAScript specification, the `VariableEnvironment` of the execution |
|
201 context for the eval code is the `VariableEnvironment` this |
|
202 `Debugger.Environment` instance represents.) If implementation |
|
203 restrictions prevent SpiderMonkey from extending this environment as |
|
204 requested, this call throws an `Error` exception. |
|
205 |
|
206 <code>evalWithBindings(<i>code</i>, <i>bindings</i>)</code> <i>(future plan)</i> |
|
207 : Like `eval`, but evaluate <i>code</i> in this environment, extended with |
|
208 bindings from the object <i>bindings</i>. For each own enumerable |
|
209 property of <i>bindings</i> named <i>name</i> whose value is |
|
210 <i>value</i>, include a variable in the environment in which <i>code</i> |
|
211 is evaluated named <i>name</i>, whose value is <i>value</i>. Each |
|
212 <i>value</i> must be a debuggee value. (This is not like a `with` |
|
213 statement: <i>code</i> may access, assign to, and delete the introduced |
|
214 bindings without having any effect on the <i>bindings</i> object.) |
|
215 |
|
216 This method allows debugger code to introduce temporary bindings that |
|
217 are visible to the given debuggee code and which refer to debugger-held |
|
218 debuggee values, and do so without mutating any existing debuggee |
|
219 environment. |
|
220 |
|
221 Note that, like `eval`, declarations in the <i>code</i> passed to |
|
222 `evalWithBindings` affect this environment, even as <i>code</i> is |
|
223 evaluated with <i>bindings</i> visible. (In the terms used by the |
|
224 ECMAScript specification, the `VariableEnvironment` of the execution |
|
225 context for the eval code is the `VariableEnvironment` this environment |
|
226 represents, and the <i>bindings</i> appear in a new declarative |
|
227 environment, which is the eval code's `LexicalEnvironment`.) If |
|
228 implementation restrictions prevent SpiderMonkey from extending this |
|
229 environment as requested, this call throws an `Error` exception. |
|
230 |
|
231 |