OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 ASSERT(context->IsContext()); | 174 ASSERT(context->IsContext()); |
175 return reinterpret_cast<Context*>(context); | 175 return reinterpret_cast<Context*>(context); |
176 } | 176 } |
177 | 177 |
178 // The default context slot layout; indices are FixedArray slot indices. | 178 // The default context slot layout; indices are FixedArray slot indices. |
179 enum { | 179 enum { |
180 // These slots are in all contexts. | 180 // These slots are in all contexts. |
181 CLOSURE_INDEX, | 181 CLOSURE_INDEX, |
182 FCONTEXT_INDEX, | 182 FCONTEXT_INDEX, |
183 PREVIOUS_INDEX, | 183 PREVIOUS_INDEX, |
| 184 // The extension slot is used for either the global object (in global |
| 185 // contexts), eval extension object (function contexts), subject of with |
| 186 // (with contexts), or the variable name (catch contexts). |
184 EXTENSION_INDEX, | 187 EXTENSION_INDEX, |
185 GLOBAL_INDEX, | 188 GLOBAL_INDEX, |
186 MIN_CONTEXT_SLOTS, | 189 MIN_CONTEXT_SLOTS, |
187 | 190 |
| 191 // This slot holds the thrown value in catch contexts. |
| 192 THROWN_OBJECT_INDEX = MIN_CONTEXT_SLOTS, |
| 193 |
188 // These slots are only in global contexts. | 194 // These slots are only in global contexts. |
189 GLOBAL_PROXY_INDEX = MIN_CONTEXT_SLOTS, | 195 GLOBAL_PROXY_INDEX = MIN_CONTEXT_SLOTS, |
190 SECURITY_TOKEN_INDEX, | 196 SECURITY_TOKEN_INDEX, |
191 ARGUMENTS_BOILERPLATE_INDEX, | 197 ARGUMENTS_BOILERPLATE_INDEX, |
192 STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX, | 198 STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX, |
193 JS_ARRAY_MAP_INDEX, | 199 JS_ARRAY_MAP_INDEX, |
194 REGEXP_RESULT_MAP_INDEX, | 200 REGEXP_RESULT_MAP_INDEX, |
195 FUNCTION_MAP_INDEX, | 201 FUNCTION_MAP_INDEX, |
196 STRICT_MODE_FUNCTION_MAP_INDEX, | 202 STRICT_MODE_FUNCTION_MAP_INDEX, |
197 FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, | 203 FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 Context* fcontext() { return Context::cast(get(FCONTEXT_INDEX)); } | 264 Context* fcontext() { return Context::cast(get(FCONTEXT_INDEX)); } |
259 void set_fcontext(Context* context) { set(FCONTEXT_INDEX, context); } | 265 void set_fcontext(Context* context) { set(FCONTEXT_INDEX, context); } |
260 | 266 |
261 Context* previous() { | 267 Context* previous() { |
262 Object* result = unchecked_previous(); | 268 Object* result = unchecked_previous(); |
263 ASSERT(IsBootstrappingOrContext(result)); | 269 ASSERT(IsBootstrappingOrContext(result)); |
264 return reinterpret_cast<Context*>(result); | 270 return reinterpret_cast<Context*>(result); |
265 } | 271 } |
266 void set_previous(Context* context) { set(PREVIOUS_INDEX, context); } | 272 void set_previous(Context* context) { set(PREVIOUS_INDEX, context); } |
267 | 273 |
268 bool has_extension() { return unchecked_extension() != NULL; } | 274 bool has_extension() { return extension() != NULL; } |
269 JSObject* extension() { return JSObject::cast(unchecked_extension()); } | 275 Object* extension() { return get(EXTENSION_INDEX); } |
270 void set_extension(JSObject* object) { set(EXTENSION_INDEX, object); } | 276 void set_extension(Object* object) { set(EXTENSION_INDEX, object); } |
271 | 277 |
272 GlobalObject* global() { | 278 GlobalObject* global() { |
273 Object* result = get(GLOBAL_INDEX); | 279 Object* result = get(GLOBAL_INDEX); |
274 ASSERT(IsBootstrappingOrGlobalObject(result)); | 280 ASSERT(IsBootstrappingOrGlobalObject(result)); |
275 return reinterpret_cast<GlobalObject*>(result); | 281 return reinterpret_cast<GlobalObject*>(result); |
276 } | 282 } |
277 void set_global(GlobalObject* global) { set(GLOBAL_INDEX, global); } | 283 void set_global(GlobalObject* global) { set(GLOBAL_INDEX, global); } |
278 | 284 |
279 // Returns a JSGlobalProxy object or null. | 285 // Returns a JSGlobalProxy object or null. |
280 JSObject* global_proxy(); | 286 JSObject* global_proxy(); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 kHeaderSize, kSize, kSize> ScavengeBodyDescriptor; | 384 kHeaderSize, kSize, kSize> ScavengeBodyDescriptor; |
379 | 385 |
380 typedef FixedBodyDescriptor< | 386 typedef FixedBodyDescriptor< |
381 kHeaderSize, | 387 kHeaderSize, |
382 kHeaderSize + FIRST_WEAK_SLOT * kPointerSize, | 388 kHeaderSize + FIRST_WEAK_SLOT * kPointerSize, |
383 kSize> MarkCompactBodyDescriptor; | 389 kSize> MarkCompactBodyDescriptor; |
384 | 390 |
385 private: | 391 private: |
386 // Unchecked access to the slots. | 392 // Unchecked access to the slots. |
387 Object* unchecked_previous() { return get(PREVIOUS_INDEX); } | 393 Object* unchecked_previous() { return get(PREVIOUS_INDEX); } |
388 Object* unchecked_extension() { return get(EXTENSION_INDEX); } | |
389 | 394 |
390 #ifdef DEBUG | 395 #ifdef DEBUG |
391 // Bootstrapping-aware type checks. | 396 // Bootstrapping-aware type checks. |
392 static bool IsBootstrappingOrContext(Object* object); | 397 static bool IsBootstrappingOrContext(Object* object); |
393 static bool IsBootstrappingOrGlobalObject(Object* object); | 398 static bool IsBootstrappingOrGlobalObject(Object* object); |
394 #endif | 399 #endif |
395 }; | 400 }; |
396 | 401 |
397 } } // namespace v8::internal | 402 } } // namespace v8::internal |
398 | 403 |
399 #endif // V8_CONTEXTS_H_ | 404 #endif // V8_CONTEXTS_H_ |
OLD | NEW |