OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_CONTEXTS_H_ | 5 #ifndef V8_CONTEXTS_H_ |
6 #define V8_CONTEXTS_H_ | 6 #define V8_CONTEXTS_H_ |
7 | 7 |
8 #include "src/heap/heap.h" | 8 #include "src/heap/heap.h" |
9 #include "src/objects.h" | 9 #include "src/objects.h" |
10 | 10 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 js_array_fast_smi_elements_map_index) \ | 204 js_array_fast_smi_elements_map_index) \ |
205 V(JS_ARRAY_FAST_HOLEY_SMI_ELEMENTS_MAP_INDEX, Map, \ | 205 V(JS_ARRAY_FAST_HOLEY_SMI_ELEMENTS_MAP_INDEX, Map, \ |
206 js_array_fast_holey_smi_elements_map_index) \ | 206 js_array_fast_holey_smi_elements_map_index) \ |
207 V(JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, Map, js_array_fast_elements_map_index) \ | 207 V(JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, Map, js_array_fast_elements_map_index) \ |
208 V(JS_ARRAY_FAST_HOLEY_ELEMENTS_MAP_INDEX, Map, \ | 208 V(JS_ARRAY_FAST_HOLEY_ELEMENTS_MAP_INDEX, Map, \ |
209 js_array_fast_holey_elements_map_index) \ | 209 js_array_fast_holey_elements_map_index) \ |
210 V(JS_ARRAY_FAST_DOUBLE_ELEMENTS_MAP_INDEX, Map, \ | 210 V(JS_ARRAY_FAST_DOUBLE_ELEMENTS_MAP_INDEX, Map, \ |
211 js_array_fast_double_elements_map_index) \ | 211 js_array_fast_double_elements_map_index) \ |
212 V(JS_ARRAY_FAST_HOLEY_DOUBLE_ELEMENTS_MAP_INDEX, Map, \ | 212 V(JS_ARRAY_FAST_HOLEY_DOUBLE_ELEMENTS_MAP_INDEX, Map, \ |
213 js_array_fast_holey_double_elements_map_index) \ | 213 js_array_fast_holey_double_elements_map_index) \ |
214 V(JS_ARRAY_FAST_SMI_ELEMENTS_STRONG_MAP_INDEX, Map, \ | |
215 js_array_fast_smi_elements_strong_map_index) \ | |
216 V(JS_ARRAY_FAST_HOLEY_SMI_ELEMENTS_STRONG_MAP_INDEX, Map, \ | |
217 js_array_fast_holey_smi_elements_strong_map_index) \ | |
218 V(JS_ARRAY_FAST_ELEMENTS_STRONG_MAP_INDEX, Map, \ | |
219 js_array_fast_elements_strong_map_index) \ | |
220 V(JS_ARRAY_FAST_HOLEY_ELEMENTS_STRONG_MAP_INDEX, Map, \ | |
221 js_array_fast_holey_elements_strong_map_index) \ | |
222 V(JS_ARRAY_FAST_DOUBLE_ELEMENTS_STRONG_MAP_INDEX, Map, \ | |
223 js_array_fast_double_elements_strong_map_index) \ | |
224 V(JS_ARRAY_FAST_HOLEY_DOUBLE_ELEMENTS_STRONG_MAP_INDEX, Map, \ | |
225 js_array_fast_holey_double_elements_strong_map_index) \ | |
226 V(JS_MAP_FUN_INDEX, JSFunction, js_map_fun) \ | 214 V(JS_MAP_FUN_INDEX, JSFunction, js_map_fun) \ |
227 V(JS_MAP_MAP_INDEX, Map, js_map_map) \ | 215 V(JS_MAP_MAP_INDEX, Map, js_map_map) \ |
228 V(JS_OBJECT_STRONG_MAP_INDEX, Map, js_object_strong_map) \ | |
229 V(JS_SET_FUN_INDEX, JSFunction, js_set_fun) \ | 216 V(JS_SET_FUN_INDEX, JSFunction, js_set_fun) \ |
230 V(JS_SET_MAP_INDEX, Map, js_set_map) \ | 217 V(JS_SET_MAP_INDEX, Map, js_set_map) \ |
231 V(JS_WEAK_MAP_FUN_INDEX, JSFunction, js_weak_map_fun) \ | 218 V(JS_WEAK_MAP_FUN_INDEX, JSFunction, js_weak_map_fun) \ |
232 V(JS_WEAK_SET_FUN_INDEX, JSFunction, js_weak_set_fun) \ | 219 V(JS_WEAK_SET_FUN_INDEX, JSFunction, js_weak_set_fun) \ |
233 V(MAP_CACHE_INDEX, Object, map_cache) \ | 220 V(MAP_CACHE_INDEX, Object, map_cache) \ |
234 V(MAP_ITERATOR_MAP_INDEX, Map, map_iterator_map) \ | 221 V(MAP_ITERATOR_MAP_INDEX, Map, map_iterator_map) \ |
235 V(STRING_ITERATOR_MAP_INDEX, Map, string_iterator_map) \ | 222 V(STRING_ITERATOR_MAP_INDEX, Map, string_iterator_map) \ |
236 V(MESSAGE_LISTENERS_INDEX, JSObject, message_listeners) \ | 223 V(MESSAGE_LISTENERS_INDEX, JSObject, message_listeners) \ |
237 V(NATIVES_UTILS_OBJECT_INDEX, Object, natives_utils_object) \ | 224 V(NATIVES_UTILS_OBJECT_INDEX, Object, natives_utils_object) \ |
238 V(NORMALIZED_MAP_CACHE_INDEX, Object, normalized_map_cache) \ | 225 V(NORMALIZED_MAP_CACHE_INDEX, Object, normalized_map_cache) \ |
(...skipping 23 matching lines...) Expand all Loading... |
262 V(WASM_FUNCTION_MAP_INDEX, Map, wasm_function_map) \ | 249 V(WASM_FUNCTION_MAP_INDEX, Map, wasm_function_map) \ |
263 V(SLOPPY_GENERATOR_FUNCTION_MAP_INDEX, Map, sloppy_generator_function_map) \ | 250 V(SLOPPY_GENERATOR_FUNCTION_MAP_INDEX, Map, sloppy_generator_function_map) \ |
264 V(SLOW_ALIASED_ARGUMENTS_MAP_INDEX, Map, slow_aliased_arguments_map) \ | 251 V(SLOW_ALIASED_ARGUMENTS_MAP_INDEX, Map, slow_aliased_arguments_map) \ |
265 V(STRICT_ARGUMENTS_MAP_INDEX, Map, strict_arguments_map) \ | 252 V(STRICT_ARGUMENTS_MAP_INDEX, Map, strict_arguments_map) \ |
266 V(STRICT_FUNCTION_MAP_INDEX, Map, strict_function_map) \ | 253 V(STRICT_FUNCTION_MAP_INDEX, Map, strict_function_map) \ |
267 V(STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map, \ | 254 V(STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX, Map, \ |
268 strict_function_without_prototype_map) \ | 255 strict_function_without_prototype_map) \ |
269 V(STRICT_GENERATOR_FUNCTION_MAP_INDEX, Map, strict_generator_function_map) \ | 256 V(STRICT_GENERATOR_FUNCTION_MAP_INDEX, Map, strict_generator_function_map) \ |
270 V(STRING_FUNCTION_INDEX, JSFunction, string_function) \ | 257 V(STRING_FUNCTION_INDEX, JSFunction, string_function) \ |
271 V(STRING_FUNCTION_PROTOTYPE_MAP_INDEX, Map, string_function_prototype_map) \ | 258 V(STRING_FUNCTION_PROTOTYPE_MAP_INDEX, Map, string_function_prototype_map) \ |
272 V(STRONG_CONSTRUCTOR_MAP_INDEX, Map, strong_constructor_map) \ | |
273 V(STRONG_FUNCTION_MAP_INDEX, Map, strong_function_map) \ | |
274 V(STRONG_GENERATOR_FUNCTION_MAP_INDEX, Map, strong_generator_function_map) \ | |
275 V(STRONG_MAP_CACHE_INDEX, Object, strong_map_cache) \ | |
276 V(SYMBOL_FUNCTION_INDEX, JSFunction, symbol_function) \ | 259 V(SYMBOL_FUNCTION_INDEX, JSFunction, symbol_function) \ |
277 V(UINT16_ARRAY_FUN_INDEX, JSFunction, uint16_array_fun) \ | 260 V(UINT16_ARRAY_FUN_INDEX, JSFunction, uint16_array_fun) \ |
278 V(UINT16X8_FUNCTION_INDEX, JSFunction, uint16x8_function) \ | 261 V(UINT16X8_FUNCTION_INDEX, JSFunction, uint16x8_function) \ |
279 V(UINT32_ARRAY_FUN_INDEX, JSFunction, uint32_array_fun) \ | 262 V(UINT32_ARRAY_FUN_INDEX, JSFunction, uint32_array_fun) \ |
280 V(UINT32X4_FUNCTION_INDEX, JSFunction, uint32x4_function) \ | 263 V(UINT32X4_FUNCTION_INDEX, JSFunction, uint32x4_function) \ |
281 V(UINT8_ARRAY_FUN_INDEX, JSFunction, uint8_array_fun) \ | 264 V(UINT8_ARRAY_FUN_INDEX, JSFunction, uint8_array_fun) \ |
282 V(UINT8_CLAMPED_ARRAY_FUN_INDEX, JSFunction, uint8_clamped_array_fun) \ | 265 V(UINT8_CLAMPED_ARRAY_FUN_INDEX, JSFunction, uint8_clamped_array_fun) \ |
283 V(UINT8X16_FUNCTION_INDEX, JSFunction, uint8x16_function) \ | 266 V(UINT8X16_FUNCTION_INDEX, JSFunction, uint8x16_function) \ |
284 NATIVE_CONTEXT_INTRINSIC_FUNCTIONS(V) \ | 267 NATIVE_CONTEXT_INTRINSIC_FUNCTIONS(V) \ |
285 NATIVE_CONTEXT_IMPORTED_FIELDS(V) | 268 NATIVE_CONTEXT_IMPORTED_FIELDS(V) |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 // Scavenge treats them as strong references. | 392 // Scavenge treats them as strong references. |
410 OPTIMIZED_FUNCTIONS_LIST, // Weak. | 393 OPTIMIZED_FUNCTIONS_LIST, // Weak. |
411 OPTIMIZED_CODE_LIST, // Weak. | 394 OPTIMIZED_CODE_LIST, // Weak. |
412 DEOPTIMIZED_CODE_LIST, // Weak. | 395 DEOPTIMIZED_CODE_LIST, // Weak. |
413 NEXT_CONTEXT_LINK, // Weak. | 396 NEXT_CONTEXT_LINK, // Weak. |
414 | 397 |
415 // Total number of slots. | 398 // Total number of slots. |
416 NATIVE_CONTEXT_SLOTS, | 399 NATIVE_CONTEXT_SLOTS, |
417 FIRST_WEAK_SLOT = OPTIMIZED_FUNCTIONS_LIST, | 400 FIRST_WEAK_SLOT = OPTIMIZED_FUNCTIONS_LIST, |
418 FIRST_JS_ARRAY_MAP_SLOT = JS_ARRAY_FAST_SMI_ELEMENTS_MAP_INDEX, | 401 FIRST_JS_ARRAY_MAP_SLOT = JS_ARRAY_FAST_SMI_ELEMENTS_MAP_INDEX, |
419 FIRST_JS_ARRAY_STRONG_MAP_SLOT = | |
420 JS_ARRAY_FAST_SMI_ELEMENTS_STRONG_MAP_INDEX, | |
421 | 402 |
422 MIN_CONTEXT_SLOTS = GLOBAL_PROXY_INDEX, | 403 MIN_CONTEXT_SLOTS = GLOBAL_PROXY_INDEX, |
423 // This slot holds the thrown value in catch contexts. | 404 // This slot holds the thrown value in catch contexts. |
424 THROWN_OBJECT_INDEX = MIN_CONTEXT_SLOTS, | 405 THROWN_OBJECT_INDEX = MIN_CONTEXT_SLOTS, |
425 }; | 406 }; |
426 | 407 |
427 void IncrementErrorsThrown(); | 408 void IncrementErrorsThrown(); |
428 int GetErrorsThrown(); | 409 int GetErrorsThrown(); |
429 | 410 |
430 // Direct slot access. | 411 // Direct slot access. |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 PropertyAttributes* attributes, | 513 PropertyAttributes* attributes, |
533 BindingFlags* binding_flags); | 514 BindingFlags* binding_flags); |
534 | 515 |
535 // Code generation support. | 516 // Code generation support. |
536 static int SlotOffset(int index) { | 517 static int SlotOffset(int index) { |
537 return kHeaderSize + index * kPointerSize - kHeapObjectTag; | 518 return kHeaderSize + index * kPointerSize - kHeapObjectTag; |
538 } | 519 } |
539 | 520 |
540 static int FunctionMapIndex(LanguageMode language_mode, FunctionKind kind) { | 521 static int FunctionMapIndex(LanguageMode language_mode, FunctionKind kind) { |
541 if (IsGeneratorFunction(kind)) { | 522 if (IsGeneratorFunction(kind)) { |
542 return is_strong(language_mode) ? STRONG_GENERATOR_FUNCTION_MAP_INDEX : | 523 return is_strict(language_mode) ? STRICT_GENERATOR_FUNCTION_MAP_INDEX |
543 is_strict(language_mode) ? STRICT_GENERATOR_FUNCTION_MAP_INDEX | |
544 : SLOPPY_GENERATOR_FUNCTION_MAP_INDEX; | 524 : SLOPPY_GENERATOR_FUNCTION_MAP_INDEX; |
545 } | 525 } |
546 | 526 |
547 if (IsClassConstructor(kind)) { | 527 if (IsClassConstructor(kind)) { |
548 // Use strict function map (no own "caller" / "arguments") | 528 // Use strict function map (no own "caller" / "arguments") |
549 return is_strong(language_mode) ? STRONG_CONSTRUCTOR_MAP_INDEX | 529 return STRICT_FUNCTION_MAP_INDEX; |
550 : STRICT_FUNCTION_MAP_INDEX; | |
551 } | 530 } |
552 | 531 |
553 if (IsArrowFunction(kind) || IsConciseMethod(kind) || | 532 if (IsArrowFunction(kind) || IsConciseMethod(kind) || |
554 IsAccessorFunction(kind)) { | 533 IsAccessorFunction(kind)) { |
555 return is_strong(language_mode) | 534 return STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX; |
556 ? STRONG_FUNCTION_MAP_INDEX | |
557 : STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX; | |
558 } | 535 } |
559 | 536 |
560 return is_strong(language_mode) ? STRONG_FUNCTION_MAP_INDEX : | 537 return is_strict(language_mode) ? STRICT_FUNCTION_MAP_INDEX |
561 is_strict(language_mode) ? STRICT_FUNCTION_MAP_INDEX | |
562 : SLOPPY_FUNCTION_MAP_INDEX; | 538 : SLOPPY_FUNCTION_MAP_INDEX; |
563 } | 539 } |
564 | 540 |
565 static int ArrayMapIndex(ElementsKind elements_kind, | 541 static int ArrayMapIndex(ElementsKind elements_kind) { |
566 Strength strength = Strength::WEAK) { | |
567 DCHECK(IsFastElementsKind(elements_kind)); | 542 DCHECK(IsFastElementsKind(elements_kind)); |
568 return elements_kind + (is_strong(strength) ? FIRST_JS_ARRAY_STRONG_MAP_SLOT | 543 return elements_kind + FIRST_JS_ARRAY_MAP_SLOT; |
569 : FIRST_JS_ARRAY_MAP_SLOT); | |
570 } | 544 } |
571 | 545 |
572 static const int kSize = kHeaderSize + NATIVE_CONTEXT_SLOTS * kPointerSize; | 546 static const int kSize = kHeaderSize + NATIVE_CONTEXT_SLOTS * kPointerSize; |
573 static const int kNotFound = -1; | 547 static const int kNotFound = -1; |
574 | 548 |
575 // GC support. | 549 // GC support. |
576 typedef FixedBodyDescriptor< | 550 typedef FixedBodyDescriptor< |
577 kHeaderSize, kSize, kSize> ScavengeBodyDescriptor; | 551 kHeaderSize, kSize, kSize> ScavengeBodyDescriptor; |
578 | 552 |
579 typedef FixedBodyDescriptor< | 553 typedef FixedBodyDescriptor< |
580 kHeaderSize, | 554 kHeaderSize, |
581 kHeaderSize + FIRST_WEAK_SLOT * kPointerSize, | 555 kHeaderSize + FIRST_WEAK_SLOT * kPointerSize, |
582 kSize> MarkCompactBodyDescriptor; | 556 kSize> MarkCompactBodyDescriptor; |
583 | 557 |
584 private: | 558 private: |
585 #ifdef DEBUG | 559 #ifdef DEBUG |
586 // Bootstrapping-aware type checks. | 560 // Bootstrapping-aware type checks. |
587 static bool IsBootstrappingOrNativeContext(Isolate* isolate, Object* object); | 561 static bool IsBootstrappingOrNativeContext(Isolate* isolate, Object* object); |
588 static bool IsBootstrappingOrValidParentContext(Object* object, Context* kid); | 562 static bool IsBootstrappingOrValidParentContext(Object* object, Context* kid); |
589 #endif | 563 #endif |
590 | 564 |
591 STATIC_ASSERT(kHeaderSize == Internals::kContextHeaderSize); | 565 STATIC_ASSERT(kHeaderSize == Internals::kContextHeaderSize); |
592 STATIC_ASSERT(EMBEDDER_DATA_INDEX == Internals::kContextEmbedderDataIndex); | 566 STATIC_ASSERT(EMBEDDER_DATA_INDEX == Internals::kContextEmbedderDataIndex); |
593 }; | 567 }; |
594 | 568 |
595 } // namespace internal | 569 } // namespace internal |
596 } // namespace v8 | 570 } // namespace v8 |
597 | 571 |
598 #endif // V8_CONTEXTS_H_ | 572 #endif // V8_CONTEXTS_H_ |
OLD | NEW |