| 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_OBJECTS_H_ | 5 #ifndef V8_OBJECTS_H_ |
| 6 #define V8_OBJECTS_H_ | 6 #define V8_OBJECTS_H_ |
| 7 | 7 |
| 8 #include <iosfwd> | 8 #include <iosfwd> |
| 9 | 9 |
| 10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
| (...skipping 2672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2683 // ... : ... | 2683 // ... : ... |
| 2684 // [first_index(CODE_PTR, EXTENDED_SECTION)]: code pointer entries | 2684 // [first_index(CODE_PTR, EXTENDED_SECTION)]: code pointer entries |
| 2685 // ... : ... | 2685 // ... : ... |
| 2686 // [first_index(HEAP_PTR, EXTENDED_SECTION)]: heap pointer entries | 2686 // [first_index(HEAP_PTR, EXTENDED_SECTION)]: heap pointer entries |
| 2687 // ... : ... | 2687 // ... : ... |
| 2688 // [first_index(INT32, EXTENDED_SECTION)] : 32 bit entries | 2688 // [first_index(INT32, EXTENDED_SECTION)] : 32 bit entries |
| 2689 // ... : ... | 2689 // ... : ... |
| 2690 // | 2690 // |
| 2691 class ConstantPoolArray: public HeapObject { | 2691 class ConstantPoolArray: public HeapObject { |
| 2692 public: | 2692 public: |
| 2693 enum WeakObjectState { | 2693 enum WeakObjectState { NO_WEAK_OBJECTS, WEAK_OBJECTS_IN_OPTIMIZED_CODE }; |
| 2694 NO_WEAK_OBJECTS, | |
| 2695 WEAK_OBJECTS_IN_OPTIMIZED_CODE, | |
| 2696 WEAK_OBJECTS_IN_IC | |
| 2697 }; | |
| 2698 | 2694 |
| 2699 enum Type { | 2695 enum Type { |
| 2700 INT64 = 0, | 2696 INT64 = 0, |
| 2701 CODE_PTR, | 2697 CODE_PTR, |
| 2702 HEAP_PTR, | 2698 HEAP_PTR, |
| 2703 INT32, | 2699 INT32, |
| 2704 // Number of types stored by the ConstantPoolArrays. | 2700 // Number of types stored by the ConstantPoolArrays. |
| 2705 NUMBER_OF_TYPES, | 2701 NUMBER_OF_TYPES, |
| 2706 FIRST_TYPE = INT64, | 2702 FIRST_TYPE = INT64, |
| 2707 LAST_TYPE = INT32 | 2703 LAST_TYPE = INT32 |
| (...skipping 2423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5131 inline bool is_keyed_load_stub() { return kind() == KEYED_LOAD_IC; } | 5127 inline bool is_keyed_load_stub() { return kind() == KEYED_LOAD_IC; } |
| 5132 inline bool is_store_stub() { return kind() == STORE_IC; } | 5128 inline bool is_store_stub() { return kind() == STORE_IC; } |
| 5133 inline bool is_keyed_store_stub() { return kind() == KEYED_STORE_IC; } | 5129 inline bool is_keyed_store_stub() { return kind() == KEYED_STORE_IC; } |
| 5134 inline bool is_call_stub() { return kind() == CALL_IC; } | 5130 inline bool is_call_stub() { return kind() == CALL_IC; } |
| 5135 inline bool is_binary_op_stub() { return kind() == BINARY_OP_IC; } | 5131 inline bool is_binary_op_stub() { return kind() == BINARY_OP_IC; } |
| 5136 inline bool is_compare_ic_stub() { return kind() == COMPARE_IC; } | 5132 inline bool is_compare_ic_stub() { return kind() == COMPARE_IC; } |
| 5137 inline bool is_compare_nil_ic_stub() { return kind() == COMPARE_NIL_IC; } | 5133 inline bool is_compare_nil_ic_stub() { return kind() == COMPARE_NIL_IC; } |
| 5138 inline bool is_to_boolean_ic_stub() { return kind() == TO_BOOLEAN_IC; } | 5134 inline bool is_to_boolean_ic_stub() { return kind() == TO_BOOLEAN_IC; } |
| 5139 inline bool is_keyed_stub(); | 5135 inline bool is_keyed_stub(); |
| 5140 inline bool is_optimized_code() { return kind() == OPTIMIZED_FUNCTION; } | 5136 inline bool is_optimized_code() { return kind() == OPTIMIZED_FUNCTION; } |
| 5141 inline bool is_weak_stub(); | 5137 inline bool embeds_maps_weakly() { |
| 5142 inline void mark_as_weak_stub(); | |
| 5143 inline bool is_invalidated_weak_stub(); | |
| 5144 inline void mark_as_invalidated_weak_stub(); | |
| 5145 | |
| 5146 inline bool CanBeWeakStub() { | |
| 5147 Kind k = kind(); | 5138 Kind k = kind(); |
| 5148 return (k == LOAD_IC || k == STORE_IC || k == KEYED_LOAD_IC || | 5139 return (k == LOAD_IC || k == STORE_IC || k == KEYED_LOAD_IC || |
| 5149 k == KEYED_STORE_IC || k == COMPARE_NIL_IC) && | 5140 k == KEYED_STORE_IC || k == COMPARE_NIL_IC) && |
| 5150 ic_state() == MONOMORPHIC; | 5141 ic_state() == MONOMORPHIC; |
| 5151 } | 5142 } |
| 5152 | 5143 |
| 5153 inline bool IsCodeStubOrIC(); | 5144 inline bool IsCodeStubOrIC(); |
| 5154 | 5145 |
| 5155 inline void set_raw_kind_specific_flags1(int value); | 5146 inline void set_raw_kind_specific_flags1(int value); |
| 5156 inline void set_raw_kind_specific_flags2(int value); | 5147 inline void set_raw_kind_specific_flags2(int value); |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5417 bool CanDeoptAt(Address pc); | 5408 bool CanDeoptAt(Address pc); |
| 5418 | 5409 |
| 5419 #ifdef VERIFY_HEAP | 5410 #ifdef VERIFY_HEAP |
| 5420 void VerifyEmbeddedObjectsDependency(); | 5411 void VerifyEmbeddedObjectsDependency(); |
| 5421 #endif | 5412 #endif |
| 5422 | 5413 |
| 5423 #ifdef DEBUG | 5414 #ifdef DEBUG |
| 5424 void VerifyEmbeddedObjectsInFullCode(); | 5415 void VerifyEmbeddedObjectsInFullCode(); |
| 5425 #endif // DEBUG | 5416 #endif // DEBUG |
| 5426 | 5417 |
| 5427 inline bool CanContainWeakObjects() { | 5418 inline bool CanContainWeakObjects() { return is_optimized_code(); } |
| 5428 return is_optimized_code() || is_weak_stub(); | |
| 5429 } | |
| 5430 | 5419 |
| 5431 inline bool IsWeakObject(Object* object) { | 5420 inline bool IsWeakObject(Object* object) { |
| 5432 return (is_optimized_code() && !is_turbofanned() && | 5421 return (is_optimized_code() && !is_turbofanned() && |
| 5433 IsWeakObjectInOptimizedCode(object)) || | 5422 IsWeakObjectInOptimizedCode(object)); |
| 5434 (is_weak_stub() && IsWeakObjectInIC(object)); | |
| 5435 } | 5423 } |
| 5436 | 5424 |
| 5437 static inline bool IsWeakObjectInOptimizedCode(Object* object); | 5425 static inline bool IsWeakObjectInOptimizedCode(Object* object); |
| 5438 static inline bool IsWeakObjectInIC(Object* object); | |
| 5439 | 5426 |
| 5440 // Max loop nesting marker used to postpose OSR. We don't take loop | 5427 // Max loop nesting marker used to postpose OSR. We don't take loop |
| 5441 // nesting that is deeper than 5 levels into account. | 5428 // nesting that is deeper than 5 levels into account. |
| 5442 static const int kMaxLoopNestingMarker = 6; | 5429 static const int kMaxLoopNestingMarker = 6; |
| 5443 | 5430 |
| 5444 // Layout description. | 5431 // Layout description. |
| 5445 static const int kRelocationInfoOffset = HeapObject::kHeaderSize; | 5432 static const int kRelocationInfoOffset = HeapObject::kHeaderSize; |
| 5446 static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize; | 5433 static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize; |
| 5447 static const int kDeoptimizationDataOffset = | 5434 static const int kDeoptimizationDataOffset = |
| 5448 kHandlerTableOffset + kPointerSize; | 5435 kHandlerTableOffset + kPointerSize; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5490 class KindField : public BitField<Kind, 7, 4> {}; | 5477 class KindField : public BitField<Kind, 7, 4> {}; |
| 5491 class ExtraICStateField: public BitField<ExtraICState, 11, | 5478 class ExtraICStateField: public BitField<ExtraICState, 11, |
| 5492 PlatformSmiTagging::kSmiValueSize - 11 + 1> {}; // NOLINT | 5479 PlatformSmiTagging::kSmiValueSize - 11 + 1> {}; // NOLINT |
| 5493 | 5480 |
| 5494 // KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION) | 5481 // KindSpecificFlags1 layout (STUB and OPTIMIZED_FUNCTION) |
| 5495 static const int kStackSlotsFirstBit = 0; | 5482 static const int kStackSlotsFirstBit = 0; |
| 5496 static const int kStackSlotsBitCount = 24; | 5483 static const int kStackSlotsBitCount = 24; |
| 5497 static const int kHasFunctionCacheBit = | 5484 static const int kHasFunctionCacheBit = |
| 5498 kStackSlotsFirstBit + kStackSlotsBitCount; | 5485 kStackSlotsFirstBit + kStackSlotsBitCount; |
| 5499 static const int kMarkedForDeoptimizationBit = kHasFunctionCacheBit + 1; | 5486 static const int kMarkedForDeoptimizationBit = kHasFunctionCacheBit + 1; |
| 5500 static const int kWeakStubBit = kMarkedForDeoptimizationBit + 1; | 5487 static const int kIsTurbofannedBit = kMarkedForDeoptimizationBit + 1; |
| 5501 static const int kInvalidatedWeakStubBit = kWeakStubBit + 1; | |
| 5502 static const int kIsTurbofannedBit = kInvalidatedWeakStubBit + 1; | |
| 5503 | 5488 |
| 5504 STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32); | 5489 STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32); |
| 5505 STATIC_ASSERT(kIsTurbofannedBit + 1 <= 32); | 5490 STATIC_ASSERT(kIsTurbofannedBit + 1 <= 32); |
| 5506 | 5491 |
| 5507 class StackSlotsField: public BitField<int, | 5492 class StackSlotsField: public BitField<int, |
| 5508 kStackSlotsFirstBit, kStackSlotsBitCount> {}; // NOLINT | 5493 kStackSlotsFirstBit, kStackSlotsBitCount> {}; // NOLINT |
| 5509 class HasFunctionCacheField : public BitField<bool, kHasFunctionCacheBit, 1> { | 5494 class HasFunctionCacheField : public BitField<bool, kHasFunctionCacheBit, 1> { |
| 5510 }; // NOLINT | 5495 }; // NOLINT |
| 5511 class MarkedForDeoptimizationField | 5496 class MarkedForDeoptimizationField |
| 5512 : public BitField<bool, kMarkedForDeoptimizationBit, 1> {}; // NOLINT | 5497 : public BitField<bool, kMarkedForDeoptimizationBit, 1> {}; // NOLINT |
| 5513 class WeakStubField : public BitField<bool, kWeakStubBit, 1> {}; // NOLINT | |
| 5514 class InvalidatedWeakStubField | |
| 5515 : public BitField<bool, kInvalidatedWeakStubBit, 1> {}; // NOLINT | |
| 5516 class IsTurbofannedField : public BitField<bool, kIsTurbofannedBit, 1> { | 5498 class IsTurbofannedField : public BitField<bool, kIsTurbofannedBit, 1> { |
| 5517 }; // NOLINT | 5499 }; // NOLINT |
| 5518 | 5500 |
| 5519 // KindSpecificFlags2 layout (ALL) | 5501 // KindSpecificFlags2 layout (ALL) |
| 5520 static const int kIsCrankshaftedBit = 0; | 5502 static const int kIsCrankshaftedBit = 0; |
| 5521 class IsCrankshaftedField: public BitField<bool, | 5503 class IsCrankshaftedField: public BitField<bool, |
| 5522 kIsCrankshaftedBit, 1> {}; // NOLINT | 5504 kIsCrankshaftedBit, 1> {}; // NOLINT |
| 5523 | 5505 |
| 5524 // KindSpecificFlags2 layout (STUB and OPTIMIZED_FUNCTION) | 5506 // KindSpecificFlags2 layout (STUB and OPTIMIZED_FUNCTION) |
| 5525 static const int kSafepointTableOffsetFirstBit = kIsCrankshaftedBit + 1; | 5507 static const int kSafepointTableOffsetFirstBit = kIsCrankshaftedBit + 1; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5587 // the number of codes is less than the length of the array. The order of the | 5569 // the number of codes is less than the length of the array. The order of the |
| 5588 // code objects within a group is not preserved. | 5570 // code objects within a group is not preserved. |
| 5589 // | 5571 // |
| 5590 // All code indexes used in the class are counted starting from the first | 5572 // All code indexes used in the class are counted starting from the first |
| 5591 // code object of the first group. In other words, code index 0 corresponds | 5573 // code object of the first group. In other words, code index 0 corresponds |
| 5592 // to array index n = kCodesStartIndex. | 5574 // to array index n = kCodesStartIndex. |
| 5593 | 5575 |
| 5594 class DependentCode: public FixedArray { | 5576 class DependentCode: public FixedArray { |
| 5595 public: | 5577 public: |
| 5596 enum DependencyGroup { | 5578 enum DependencyGroup { |
| 5597 // Group of IC stubs that weakly embed this map and depend on being | |
| 5598 // invalidated when the map is garbage collected. Dependent IC stubs form | |
| 5599 // a linked list. This group stores only the head of the list. This means | |
| 5600 // that the number_of_entries(kWeakICGroup) is 0 or 1. | |
| 5601 kWeakICGroup, | |
| 5602 // Group of code that weakly embed this map and depend on being | 5579 // Group of code that weakly embed this map and depend on being |
| 5603 // deoptimized when the map is garbage collected. | 5580 // deoptimized when the map is garbage collected. |
| 5604 kWeakCodeGroup, | 5581 kWeakCodeGroup, |
| 5605 // Group of code that embed a transition to this map, and depend on being | 5582 // Group of code that embed a transition to this map, and depend on being |
| 5606 // deoptimized when the transition is replaced by a new version. | 5583 // deoptimized when the transition is replaced by a new version. |
| 5607 kTransitionGroup, | 5584 kTransitionGroup, |
| 5608 // Group of code that omit run-time prototype checks for prototypes | 5585 // Group of code that omit run-time prototype checks for prototypes |
| 5609 // described by this map. The group is deoptimized whenever an object | 5586 // described by this map. The group is deoptimized whenever an object |
| 5610 // described by this map changes shape (and transitions to a new map), | 5587 // described by this map changes shape (and transitions to a new map), |
| 5611 // possibly invalidating the assumptions embedded in the code. | 5588 // possibly invalidating the assumptions embedded in the code. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5652 CompilationInfo* info, | 5629 CompilationInfo* info, |
| 5653 Code* code); | 5630 Code* code); |
| 5654 void RemoveCompilationInfo(DependentCode::DependencyGroup group, | 5631 void RemoveCompilationInfo(DependentCode::DependencyGroup group, |
| 5655 CompilationInfo* info); | 5632 CompilationInfo* info); |
| 5656 | 5633 |
| 5657 void DeoptimizeDependentCodeGroup(Isolate* isolate, | 5634 void DeoptimizeDependentCodeGroup(Isolate* isolate, |
| 5658 DependentCode::DependencyGroup group); | 5635 DependentCode::DependencyGroup group); |
| 5659 | 5636 |
| 5660 bool MarkCodeForDeoptimization(Isolate* isolate, | 5637 bool MarkCodeForDeoptimization(Isolate* isolate, |
| 5661 DependentCode::DependencyGroup group); | 5638 DependentCode::DependencyGroup group); |
| 5662 void AddToDependentICList(Handle<Code> stub); | |
| 5663 | 5639 |
| 5664 // The following low-level accessors should only be used by this class | 5640 // The following low-level accessors should only be used by this class |
| 5665 // and the mark compact collector. | 5641 // and the mark compact collector. |
| 5666 inline int number_of_entries(DependencyGroup group); | 5642 inline int number_of_entries(DependencyGroup group); |
| 5667 inline void set_number_of_entries(DependencyGroup group, int value); | 5643 inline void set_number_of_entries(DependencyGroup group, int value); |
| 5668 inline bool is_code_at(int i); | 5644 inline bool is_code_at(int i); |
| 5669 inline Code* code_at(int i); | 5645 inline Code* code_at(int i); |
| 5670 inline CompilationInfo* compilation_info_at(int i); | 5646 inline CompilationInfo* compilation_info_at(int i); |
| 5671 inline void set_object_at(int i, Object* object); | 5647 inline void set_object_at(int i, Object* object); |
| 5672 inline Object** slot_at(int i); | 5648 inline Object** slot_at(int i); |
| (...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6271 | 6247 |
| 6272 inline bool CanOmitMapChecks(); | 6248 inline bool CanOmitMapChecks(); |
| 6273 | 6249 |
| 6274 static void AddDependentCompilationInfo(Handle<Map> map, | 6250 static void AddDependentCompilationInfo(Handle<Map> map, |
| 6275 DependentCode::DependencyGroup group, | 6251 DependentCode::DependencyGroup group, |
| 6276 CompilationInfo* info); | 6252 CompilationInfo* info); |
| 6277 | 6253 |
| 6278 static void AddDependentCode(Handle<Map> map, | 6254 static void AddDependentCode(Handle<Map> map, |
| 6279 DependentCode::DependencyGroup group, | 6255 DependentCode::DependencyGroup group, |
| 6280 Handle<Code> code); | 6256 Handle<Code> code); |
| 6281 static void AddDependentIC(Handle<Map> map, | |
| 6282 Handle<Code> stub); | |
| 6283 | 6257 |
| 6284 bool IsMapInArrayPrototypeChain(); | 6258 bool IsMapInArrayPrototypeChain(); |
| 6285 | 6259 |
| 6286 static Handle<WeakCell> WeakCellForMap(Handle<Map> map); | 6260 static Handle<WeakCell> WeakCellForMap(Handle<Map> map); |
| 6287 | 6261 |
| 6288 // Dispatched behavior. | 6262 // Dispatched behavior. |
| 6289 DECLARE_PRINTER(Map) | 6263 DECLARE_PRINTER(Map) |
| 6290 DECLARE_VERIFIER(Map) | 6264 DECLARE_VERIFIER(Map) |
| 6291 | 6265 |
| 6292 #ifdef VERIFY_HEAP | 6266 #ifdef VERIFY_HEAP |
| (...skipping 4800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11093 } else { | 11067 } else { |
| 11094 value &= ~(1 << bit_position); | 11068 value &= ~(1 << bit_position); |
| 11095 } | 11069 } |
| 11096 return value; | 11070 return value; |
| 11097 } | 11071 } |
| 11098 }; | 11072 }; |
| 11099 | 11073 |
| 11100 } } // namespace v8::internal | 11074 } } // namespace v8::internal |
| 11101 | 11075 |
| 11102 #endif // V8_OBJECTS_H_ | 11076 #endif // V8_OBJECTS_H_ |
| OLD | NEW |