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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 V(STRICT_MODE_FUNCTION_MAP_INDEX, Map, strict_mode_function_map) \ | 81 V(STRICT_MODE_FUNCTION_MAP_INDEX, Map, strict_mode_function_map) \ |
82 V(FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map, function_without_prototype_map) \ | 82 V(FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map, function_without_prototype_map) \ |
83 V(STRICT_MODE_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map, \ | 83 V(STRICT_MODE_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map, \ |
84 strict_mode_function_without_prototype_map) \ | 84 strict_mode_function_without_prototype_map) \ |
85 V(FUNCTION_INSTANCE_MAP_INDEX, Map, function_instance_map) \ | 85 V(FUNCTION_INSTANCE_MAP_INDEX, Map, function_instance_map) \ |
86 V(STRICT_MODE_FUNCTION_INSTANCE_MAP_INDEX, Map, \ | 86 V(STRICT_MODE_FUNCTION_INSTANCE_MAP_INDEX, Map, \ |
87 strict_mode_function_instance_map) \ | 87 strict_mode_function_instance_map) \ |
88 V(JS_ARRAY_MAP_INDEX, Map, js_array_map)\ | 88 V(JS_ARRAY_MAP_INDEX, Map, js_array_map)\ |
89 V(REGEXP_RESULT_MAP_INDEX, Map, regexp_result_map)\ | 89 V(REGEXP_RESULT_MAP_INDEX, Map, regexp_result_map)\ |
90 V(ARGUMENTS_BOILERPLATE_INDEX, JSObject, arguments_boilerplate) \ | 90 V(ARGUMENTS_BOILERPLATE_INDEX, JSObject, arguments_boilerplate) \ |
| 91 V(ALIASED_ARGUMENTS_BOILERPLATE_INDEX, JSObject, \ |
| 92 aliased_arguments_boilerplate) \ |
91 V(STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX, JSObject, \ | 93 V(STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX, JSObject, \ |
92 strict_mode_arguments_boilerplate) \ | 94 strict_mode_arguments_boilerplate) \ |
93 V(MESSAGE_LISTENERS_INDEX, JSObject, message_listeners) \ | 95 V(MESSAGE_LISTENERS_INDEX, JSObject, message_listeners) \ |
94 V(MAKE_MESSAGE_FUN_INDEX, JSFunction, make_message_fun) \ | 96 V(MAKE_MESSAGE_FUN_INDEX, JSFunction, make_message_fun) \ |
95 V(GET_STACK_TRACE_LINE_INDEX, JSFunction, get_stack_trace_line_fun) \ | 97 V(GET_STACK_TRACE_LINE_INDEX, JSFunction, get_stack_trace_line_fun) \ |
96 V(CONFIGURE_GLOBAL_INDEX, JSFunction, configure_global_fun) \ | 98 V(CONFIGURE_GLOBAL_INDEX, JSFunction, configure_global_fun) \ |
97 V(FUNCTION_CACHE_INDEX, JSObject, function_cache) \ | 99 V(FUNCTION_CACHE_INDEX, JSObject, function_cache) \ |
98 V(JSFUNCTION_RESULT_CACHES_INDEX, FixedArray, jsfunction_result_caches) \ | 100 V(JSFUNCTION_RESULT_CACHES_INDEX, FixedArray, jsfunction_result_caches) \ |
99 V(NORMALIZED_MAP_CACHE_INDEX, NormalizedMapCache, normalized_map_cache) \ | 101 V(NORMALIZED_MAP_CACHE_INDEX, NormalizedMapCache, normalized_map_cache) \ |
100 V(RUNTIME_CONTEXT_INDEX, Context, runtime_context) \ | 102 V(RUNTIME_CONTEXT_INDEX, Context, runtime_context) \ |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 ASSERT(context->IsContext()); | 176 ASSERT(context->IsContext()); |
175 return reinterpret_cast<Context*>(context); | 177 return reinterpret_cast<Context*>(context); |
176 } | 178 } |
177 | 179 |
178 // The default context slot layout; indices are FixedArray slot indices. | 180 // The default context slot layout; indices are FixedArray slot indices. |
179 enum { | 181 enum { |
180 // These slots are in all contexts. | 182 // These slots are in all contexts. |
181 CLOSURE_INDEX, | 183 CLOSURE_INDEX, |
182 FCONTEXT_INDEX, | 184 FCONTEXT_INDEX, |
183 PREVIOUS_INDEX, | 185 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). | |
187 EXTENSION_INDEX, | 186 EXTENSION_INDEX, |
188 GLOBAL_INDEX, | 187 GLOBAL_INDEX, |
189 MIN_CONTEXT_SLOTS, | 188 MIN_CONTEXT_SLOTS, |
190 | 189 |
191 // This slot holds the thrown value in catch contexts. | |
192 THROWN_OBJECT_INDEX = MIN_CONTEXT_SLOTS, | |
193 | |
194 // These slots are only in global contexts. | 190 // These slots are only in global contexts. |
195 GLOBAL_PROXY_INDEX = MIN_CONTEXT_SLOTS, | 191 GLOBAL_PROXY_INDEX = MIN_CONTEXT_SLOTS, |
196 SECURITY_TOKEN_INDEX, | 192 SECURITY_TOKEN_INDEX, |
197 ARGUMENTS_BOILERPLATE_INDEX, | 193 ARGUMENTS_BOILERPLATE_INDEX, |
| 194 ALIASED_ARGUMENTS_BOILERPLATE_INDEX, |
198 STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX, | 195 STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX, |
199 JS_ARRAY_MAP_INDEX, | 196 JS_ARRAY_MAP_INDEX, |
200 REGEXP_RESULT_MAP_INDEX, | 197 REGEXP_RESULT_MAP_INDEX, |
201 FUNCTION_MAP_INDEX, | 198 FUNCTION_MAP_INDEX, |
202 STRICT_MODE_FUNCTION_MAP_INDEX, | 199 STRICT_MODE_FUNCTION_MAP_INDEX, |
203 FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, | 200 FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, |
204 STRICT_MODE_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, | 201 STRICT_MODE_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, |
205 FUNCTION_INSTANCE_MAP_INDEX, | 202 FUNCTION_INSTANCE_MAP_INDEX, |
206 STRICT_MODE_FUNCTION_INSTANCE_MAP_INDEX, | 203 STRICT_MODE_FUNCTION_INSTANCE_MAP_INDEX, |
207 INITIAL_OBJECT_PROTOTYPE_INDEX, | 204 INITIAL_OBJECT_PROTOTYPE_INDEX, |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 Context* fcontext() { return Context::cast(get(FCONTEXT_INDEX)); } | 261 Context* fcontext() { return Context::cast(get(FCONTEXT_INDEX)); } |
265 void set_fcontext(Context* context) { set(FCONTEXT_INDEX, context); } | 262 void set_fcontext(Context* context) { set(FCONTEXT_INDEX, context); } |
266 | 263 |
267 Context* previous() { | 264 Context* previous() { |
268 Object* result = unchecked_previous(); | 265 Object* result = unchecked_previous(); |
269 ASSERT(IsBootstrappingOrContext(result)); | 266 ASSERT(IsBootstrappingOrContext(result)); |
270 return reinterpret_cast<Context*>(result); | 267 return reinterpret_cast<Context*>(result); |
271 } | 268 } |
272 void set_previous(Context* context) { set(PREVIOUS_INDEX, context); } | 269 void set_previous(Context* context) { set(PREVIOUS_INDEX, context); } |
273 | 270 |
274 bool has_extension() { return extension() != NULL; } | 271 bool has_extension() { return unchecked_extension() != NULL; } |
275 Object* extension() { return get(EXTENSION_INDEX); } | 272 JSObject* extension() { return JSObject::cast(unchecked_extension()); } |
276 void set_extension(Object* object) { set(EXTENSION_INDEX, object); } | 273 void set_extension(JSObject* object) { set(EXTENSION_INDEX, object); } |
277 | 274 |
278 GlobalObject* global() { | 275 GlobalObject* global() { |
279 Object* result = get(GLOBAL_INDEX); | 276 Object* result = get(GLOBAL_INDEX); |
280 ASSERT(IsBootstrappingOrGlobalObject(result)); | 277 ASSERT(IsBootstrappingOrGlobalObject(result)); |
281 return reinterpret_cast<GlobalObject*>(result); | 278 return reinterpret_cast<GlobalObject*>(result); |
282 } | 279 } |
283 void set_global(GlobalObject* global) { set(GLOBAL_INDEX, global); } | 280 void set_global(GlobalObject* global) { set(GLOBAL_INDEX, global); } |
284 | 281 |
285 // Returns a JSGlobalProxy object or null. | 282 // Returns a JSGlobalProxy object or null. |
286 JSObject* global_proxy(); | 283 JSObject* global_proxy(); |
287 void set_global_proxy(JSObject* global); | 284 void set_global_proxy(JSObject* global); |
288 | 285 |
289 // The builtins object. | 286 // The builtins object. |
290 JSBuiltinsObject* builtins(); | 287 JSBuiltinsObject* builtins(); |
291 | 288 |
292 // Compute the global context by traversing the context chain. | 289 // Compute the global context by traversing the context chain. |
293 Context* global_context(); | 290 Context* global_context(); |
294 | 291 |
295 // Predicates for context types. IsGlobalContext is defined on Object | 292 // Predicates for context types. IsGlobalContext is defined on Object |
296 // because we frequently have to know if arbitrary objects are global | 293 // because we frequently have to know if arbitrary objects are global |
297 // contexts. | 294 // contexts. |
298 bool IsFunctionContext() { | 295 bool IsFunctionContext() { |
299 Map* map = this->map(); | 296 Map* map = this->map(); |
300 return map == map->GetHeap()->function_context_map(); | 297 return map == map->GetHeap()->function_context_map(); |
301 } | 298 } |
302 bool IsCatchContext() { | 299 bool IsCatchContext() { |
303 Map* map = this->map(); | 300 Map* map = this->map(); |
304 return map == map->GetHeap()->catch_context_map(); | 301 return map == map->GetHeap()->catch_context_map(); |
305 } | 302 } |
306 bool IsWithContext() { | |
307 Map* map = this->map(); | |
308 return map == map->GetHeap()->with_context_map(); | |
309 } | |
310 | 303 |
311 // Tells whether the global context is marked with out of memory. | 304 // Tells whether the global context is marked with out of memory. |
312 inline bool has_out_of_memory(); | 305 inline bool has_out_of_memory(); |
313 | 306 |
314 // Mark the global context with out of memory. | 307 // Mark the global context with out of memory. |
315 inline void mark_out_of_memory(); | 308 inline void mark_out_of_memory(); |
316 | 309 |
317 // The exception holder is the object used as a with object in | 310 // The exception holder is the object used as a with object in |
318 // the implementation of a catch block. | 311 // the implementation of a catch block. |
319 bool is_exception_holder(Object* object) { | 312 bool is_exception_holder(Object* object) { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 kHeaderSize, kSize, kSize> ScavengeBodyDescriptor; | 381 kHeaderSize, kSize, kSize> ScavengeBodyDescriptor; |
389 | 382 |
390 typedef FixedBodyDescriptor< | 383 typedef FixedBodyDescriptor< |
391 kHeaderSize, | 384 kHeaderSize, |
392 kHeaderSize + FIRST_WEAK_SLOT * kPointerSize, | 385 kHeaderSize + FIRST_WEAK_SLOT * kPointerSize, |
393 kSize> MarkCompactBodyDescriptor; | 386 kSize> MarkCompactBodyDescriptor; |
394 | 387 |
395 private: | 388 private: |
396 // Unchecked access to the slots. | 389 // Unchecked access to the slots. |
397 Object* unchecked_previous() { return get(PREVIOUS_INDEX); } | 390 Object* unchecked_previous() { return get(PREVIOUS_INDEX); } |
| 391 Object* unchecked_extension() { return get(EXTENSION_INDEX); } |
398 | 392 |
399 #ifdef DEBUG | 393 #ifdef DEBUG |
400 // Bootstrapping-aware type checks. | 394 // Bootstrapping-aware type checks. |
401 static bool IsBootstrappingOrContext(Object* object); | 395 static bool IsBootstrappingOrContext(Object* object); |
402 static bool IsBootstrappingOrGlobalObject(Object* object); | 396 static bool IsBootstrappingOrGlobalObject(Object* object); |
403 #endif | 397 #endif |
404 }; | 398 }; |
405 | 399 |
406 } } // namespace v8::internal | 400 } } // namespace v8::internal |
407 | 401 |
408 #endif // V8_CONTEXTS_H_ | 402 #endif // V8_CONTEXTS_H_ |
OLD | NEW |