| 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 1537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1548 static inline HeapObject* FromAddress(Address address) { | 1548 static inline HeapObject* FromAddress(Address address) { |
| 1549 DCHECK_TAG_ALIGNED(address); | 1549 DCHECK_TAG_ALIGNED(address); |
| 1550 return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); | 1550 return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); |
| 1551 } | 1551 } |
| 1552 | 1552 |
| 1553 // Returns the address of this HeapObject. | 1553 // Returns the address of this HeapObject. |
| 1554 inline Address address() { | 1554 inline Address address() { |
| 1555 return reinterpret_cast<Address>(this) - kHeapObjectTag; | 1555 return reinterpret_cast<Address>(this) - kHeapObjectTag; |
| 1556 } | 1556 } |
| 1557 | 1557 |
| 1558 // Iterates over pointers contained in the object (including the Map) | 1558 // Iterates over pointers contained in the object (including the Map). |
| 1559 // If it's not performance critical iteration use the non-templatized |
| 1560 // version. |
| 1559 void Iterate(ObjectVisitor* v); | 1561 void Iterate(ObjectVisitor* v); |
| 1560 | 1562 |
| 1563 template <typename ObjectVisitor> |
| 1564 inline void IterateFast(ObjectVisitor* v); |
| 1565 |
| 1561 // Iterates over all pointers contained in the object except the | 1566 // Iterates over all pointers contained in the object except the |
| 1562 // first map pointer. The object type is given in the first | 1567 // first map pointer. The object type is given in the first |
| 1563 // parameter. This function does not access the map pointer in the | 1568 // parameter. This function does not access the map pointer in the |
| 1564 // object, and so is safe to call while the map pointer is modified. | 1569 // object, and so is safe to call while the map pointer is modified. |
| 1570 // If it's not performance critical iteration use the non-templatized |
| 1571 // version. |
| 1572 void IterateBody(ObjectVisitor* v); |
| 1565 void IterateBody(InstanceType type, int object_size, ObjectVisitor* v); | 1573 void IterateBody(InstanceType type, int object_size, ObjectVisitor* v); |
| 1566 | 1574 |
| 1575 template <typename ObjectVisitor> |
| 1576 inline void IterateBodyFast(ObjectVisitor* v); |
| 1577 |
| 1578 template <typename ObjectVisitor> |
| 1579 inline void IterateBodyFast(InstanceType type, int object_size, |
| 1580 ObjectVisitor* v); |
| 1581 |
| 1582 // Returns true if the object contains a tagged value at given offset. |
| 1583 // It is used for invalid slots filtering. If the offset points outside |
| 1584 // of the object or to the map word, the result is UNDEFINED (!!!). |
| 1585 bool IsValidSlot(int offset); |
| 1586 |
| 1567 // Returns the heap object's size in bytes | 1587 // Returns the heap object's size in bytes |
| 1568 inline int Size(); | 1588 inline int Size(); |
| 1569 | 1589 |
| 1570 // Indicates what type of values this heap object may contain. | 1590 // Indicates what type of values this heap object may contain. |
| 1571 inline HeapObjectContents ContentType(); | 1591 inline HeapObjectContents ContentType(); |
| 1572 | 1592 |
| 1573 // Given a heap object's map pointer, returns the heap size in bytes | 1593 // Given a heap object's map pointer, returns the heap size in bytes |
| 1574 // Useful when the map pointer field is used for other purposes. | 1594 // Useful when the map pointer field is used for other purposes. |
| 1575 // GC internal. | 1595 // GC internal. |
| 1576 inline int SizeFromMap(Map* map); | 1596 inline int SizeFromMap(Map* map); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 | 1636 |
| 1617 inline AllocationAlignment RequiredAlignment(); | 1637 inline AllocationAlignment RequiredAlignment(); |
| 1618 | 1638 |
| 1619 // Layout description. | 1639 // Layout description. |
| 1620 // First field in a heap object is map. | 1640 // First field in a heap object is map. |
| 1621 static const int kMapOffset = Object::kHeaderSize; | 1641 static const int kMapOffset = Object::kHeaderSize; |
| 1622 static const int kHeaderSize = kMapOffset + kPointerSize; | 1642 static const int kHeaderSize = kMapOffset + kPointerSize; |
| 1623 | 1643 |
| 1624 STATIC_ASSERT(kMapOffset == Internals::kHeapObjectMapOffset); | 1644 STATIC_ASSERT(kMapOffset == Internals::kHeapObjectMapOffset); |
| 1625 | 1645 |
| 1626 protected: | |
| 1627 // helpers for calling an ObjectVisitor to iterate over pointers in the | |
| 1628 // half-open range [start, end) specified as integer offsets | |
| 1629 inline void IteratePointers(ObjectVisitor* v, int start, int end); | |
| 1630 // as above, for the single element at "offset" | |
| 1631 inline void IteratePointer(ObjectVisitor* v, int offset); | |
| 1632 // as above, for the next code link of a code object. | |
| 1633 inline void IterateNextCodeLink(ObjectVisitor* v, int offset); | |
| 1634 | |
| 1635 private: | 1646 private: |
| 1636 DISALLOW_IMPLICIT_CONSTRUCTORS(HeapObject); | 1647 DISALLOW_IMPLICIT_CONSTRUCTORS(HeapObject); |
| 1637 }; | 1648 }; |
| 1638 | 1649 |
| 1639 | 1650 |
| 1640 // This is the base class for object's body descriptors. | 1651 template <int start_offset, int end_offset, int size> |
| 1641 class BodyDescriptorBase { | 1652 class FixedBodyDescriptor; |
| 1642 protected: | |
| 1643 static inline void IterateBodyImpl(HeapObject* obj, int start_offset, | |
| 1644 int end_offset, ObjectVisitor* v); | |
| 1645 | |
| 1646 template <typename StaticVisitor> | |
| 1647 static inline void IterateBodyImpl(Heap* heap, HeapObject* obj, | |
| 1648 int start_offset, int end_offset); | |
| 1649 | |
| 1650 static inline void IteratePointers(HeapObject* obj, int start_offset, | |
| 1651 int end_offset, ObjectVisitor* v); | |
| 1652 | |
| 1653 template <typename StaticVisitor> | |
| 1654 static inline void IteratePointers(Heap* heap, HeapObject* obj, | |
| 1655 int start_offset, int end_offset); | |
| 1656 }; | |
| 1657 | 1653 |
| 1658 | 1654 |
| 1659 // This class describes a body of an object of a fixed size | |
| 1660 // in which all pointer fields are located in the [start_offset, end_offset) | |
| 1661 // interval. | |
| 1662 template <int start_offset, int end_offset, int size> | |
| 1663 class FixedBodyDescriptor : public BodyDescriptorBase { | |
| 1664 public: | |
| 1665 static const int kStartOffset = start_offset; | |
| 1666 static const int kEndOffset = end_offset; | |
| 1667 static const int kSize = size; | |
| 1668 | |
| 1669 static inline void IterateBody(HeapObject* obj, ObjectVisitor* v) { | |
| 1670 IterateBodyImpl(obj, start_offset, end_offset, v); | |
| 1671 } | |
| 1672 | |
| 1673 template <typename StaticVisitor> | |
| 1674 static inline void IterateBody(HeapObject* obj) { | |
| 1675 Heap* heap = obj->GetHeap(); | |
| 1676 IterateBodyImpl<StaticVisitor>(heap, obj, start_offset, end_offset); | |
| 1677 } | |
| 1678 }; | |
| 1679 | |
| 1680 | |
| 1681 // This base class describes a body of an object of a variable size | |
| 1682 // in which all pointer fields are located in the [start_offset, object_size) | |
| 1683 // interval. | |
| 1684 template <int start_offset> | 1655 template <int start_offset> |
| 1685 class FlexibleBodyDescriptorBase : public BodyDescriptorBase { | 1656 class FlexibleBodyDescriptor; |
| 1686 public: | |
| 1687 static const int kStartOffset = start_offset; | |
| 1688 | |
| 1689 static inline void IterateBody(HeapObject* obj, int object_size, | |
| 1690 ObjectVisitor* v) { | |
| 1691 IterateBodyImpl(obj, start_offset, object_size, v); | |
| 1692 } | |
| 1693 | |
| 1694 template <typename StaticVisitor> | |
| 1695 static inline void IterateBody(HeapObject* obj, int object_size) { | |
| 1696 Heap* heap = obj->GetHeap(); | |
| 1697 IterateBodyImpl<StaticVisitor>(heap, obj, start_offset, object_size); | |
| 1698 } | |
| 1699 }; | |
| 1700 | |
| 1701 | |
| 1702 // This class describes a body of an object of a variable size | |
| 1703 // in which all pointer fields are located in the [start_offset, object_size) | |
| 1704 // interval. The size of the object is taken from the map. | |
| 1705 template <int start_offset> | |
| 1706 class FlexibleBodyDescriptor : public FlexibleBodyDescriptorBase<start_offset> { | |
| 1707 public: | |
| 1708 static inline int SizeOf(Map* map, HeapObject* object); | |
| 1709 }; | |
| 1710 | 1657 |
| 1711 | 1658 |
| 1712 // The HeapNumber class describes heap allocated numbers that cannot be | 1659 // The HeapNumber class describes heap allocated numbers that cannot be |
| 1713 // represented in a Smi (small integer) | 1660 // represented in a Smi (small integer) |
| 1714 class HeapNumber: public HeapObject { | 1661 class HeapNumber: public HeapObject { |
| 1715 public: | 1662 public: |
| 1716 // [value]: number value. | 1663 // [value]: number value. |
| 1717 inline double value() const; | 1664 inline double value() const; |
| 1718 inline void set_value(double value); | 1665 inline void set_value(double value); |
| 1719 | 1666 |
| (...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2681 // Swap two elements in a pair of arrays. If this array and the | 2628 // Swap two elements in a pair of arrays. If this array and the |
| 2682 // numbers array are the same object, the elements are only swapped | 2629 // numbers array are the same object, the elements are only swapped |
| 2683 // once. | 2630 // once. |
| 2684 void SwapPairs(FixedArray* numbers, int i, int j); | 2631 void SwapPairs(FixedArray* numbers, int i, int j); |
| 2685 | 2632 |
| 2686 // Sort prefix of this array and the numbers array as pairs wrt. the | 2633 // Sort prefix of this array and the numbers array as pairs wrt. the |
| 2687 // numbers. If the numbers array and the this array are the same | 2634 // numbers. If the numbers array and the this array are the same |
| 2688 // object, the prefix of this array is sorted. | 2635 // object, the prefix of this array is sorted. |
| 2689 void SortPairs(FixedArray* numbers, uint32_t len); | 2636 void SortPairs(FixedArray* numbers, uint32_t len); |
| 2690 | 2637 |
| 2691 class BodyDescriptor : public FlexibleBodyDescriptorBase<kHeaderSize> { | 2638 typedef FlexibleBodyDescriptor<kHeaderSize> BodyDescriptor; |
| 2692 public: | |
| 2693 static inline int SizeOf(Map* map, HeapObject* object); | |
| 2694 }; | |
| 2695 | 2639 |
| 2696 protected: | 2640 protected: |
| 2697 // Set operation on FixedArray without using write barriers. Can | 2641 // Set operation on FixedArray without using write barriers. Can |
| 2698 // only be used for storing old space objects or smis. | 2642 // only be used for storing old space objects or smis. |
| 2699 static inline void NoWriteBarrierSet(FixedArray* array, | 2643 static inline void NoWriteBarrierSet(FixedArray* array, |
| 2700 int index, | 2644 int index, |
| 2701 Object* value); | 2645 Object* value); |
| 2702 | 2646 |
| 2703 // Set operation on FixedArray without incremental write barrier. Can | 2647 // Set operation on FixedArray without incremental write barrier. Can |
| 2704 // only be used if the object is guaranteed to be white (whiteness witness | 2648 // only be used if the object is guaranteed to be white (whiteness witness |
| (...skipping 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4416 inline int parameter_count() const; | 4360 inline int parameter_count() const; |
| 4417 inline void set_parameter_count(int number_of_parameters); | 4361 inline void set_parameter_count(int number_of_parameters); |
| 4418 | 4362 |
| 4419 // Accessors for the constant pool. | 4363 // Accessors for the constant pool. |
| 4420 DECL_ACCESSORS(constant_pool, FixedArray) | 4364 DECL_ACCESSORS(constant_pool, FixedArray) |
| 4421 | 4365 |
| 4422 DECLARE_CAST(BytecodeArray) | 4366 DECLARE_CAST(BytecodeArray) |
| 4423 | 4367 |
| 4424 // Dispatched behavior. | 4368 // Dispatched behavior. |
| 4425 inline int BytecodeArraySize(); | 4369 inline int BytecodeArraySize(); |
| 4426 inline void BytecodeArrayIterateBody(ObjectVisitor* v); | |
| 4427 | 4370 |
| 4428 DECLARE_PRINTER(BytecodeArray) | 4371 DECLARE_PRINTER(BytecodeArray) |
| 4429 DECLARE_VERIFIER(BytecodeArray) | 4372 DECLARE_VERIFIER(BytecodeArray) |
| 4430 | 4373 |
| 4431 void Disassemble(std::ostream& os); | 4374 void Disassemble(std::ostream& os); |
| 4432 | 4375 |
| 4433 // Layout description. | 4376 // Layout description. |
| 4434 static const int kFrameSizeOffset = FixedArrayBase::kHeaderSize; | 4377 static const int kFrameSizeOffset = FixedArrayBase::kHeaderSize; |
| 4435 static const int kParameterSizeOffset = kFrameSizeOffset + kIntSize; | 4378 static const int kParameterSizeOffset = kFrameSizeOffset + kIntSize; |
| 4436 static const int kConstantPoolOffset = kParameterSizeOffset + kIntSize; | 4379 static const int kConstantPoolOffset = kParameterSizeOffset + kIntSize; |
| 4437 static const int kHeaderSize = kConstantPoolOffset + kPointerSize; | 4380 static const int kHeaderSize = kConstantPoolOffset + kPointerSize; |
| 4438 | 4381 |
| 4439 static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); | 4382 static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); |
| 4440 | 4383 |
| 4441 // Maximal memory consumption for a single BytecodeArray. | 4384 // Maximal memory consumption for a single BytecodeArray. |
| 4442 static const int kMaxSize = 512 * MB; | 4385 static const int kMaxSize = 512 * MB; |
| 4443 // Maximal length of a single BytecodeArray. | 4386 // Maximal length of a single BytecodeArray. |
| 4444 static const int kMaxLength = kMaxSize - kHeaderSize; | 4387 static const int kMaxLength = kMaxSize - kHeaderSize; |
| 4445 | 4388 |
| 4389 class BodyDescriptor; |
| 4390 |
| 4446 private: | 4391 private: |
| 4447 DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArray); | 4392 DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArray); |
| 4448 }; | 4393 }; |
| 4449 | 4394 |
| 4450 | 4395 |
| 4451 // FreeSpace are fixed-size free memory blocks used by the heap and GC. | 4396 // FreeSpace are fixed-size free memory blocks used by the heap and GC. |
| 4452 // They look like heap objects (are heap object tagged and have a map) so that | 4397 // They look like heap objects (are heap object tagged and have a map) so that |
| 4453 // the heap remains iterable. They have a size and a next pointer. | 4398 // the heap remains iterable. They have a size and a next pointer. |
| 4454 // The next pointer is the raw address of the next FreeSpace object (or NULL) | 4399 // The next pointer is the raw address of the next FreeSpace object (or NULL) |
| 4455 // in the free list. | 4400 // in the free list. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4501 public: | 4446 public: |
| 4502 // [base_pointer]: Either points to the FixedTypedArrayBase itself or nullptr. | 4447 // [base_pointer]: Either points to the FixedTypedArrayBase itself or nullptr. |
| 4503 DECL_ACCESSORS(base_pointer, Object) | 4448 DECL_ACCESSORS(base_pointer, Object) |
| 4504 | 4449 |
| 4505 // [external_pointer]: Contains the offset between base_pointer and the start | 4450 // [external_pointer]: Contains the offset between base_pointer and the start |
| 4506 // of the data. If the base_pointer is a nullptr, the external_pointer | 4451 // of the data. If the base_pointer is a nullptr, the external_pointer |
| 4507 // therefore points to the actual backing store. | 4452 // therefore points to the actual backing store. |
| 4508 DECL_ACCESSORS(external_pointer, void) | 4453 DECL_ACCESSORS(external_pointer, void) |
| 4509 | 4454 |
| 4510 // Dispatched behavior. | 4455 // Dispatched behavior. |
| 4511 inline void FixedTypedArrayBaseIterateBody(ObjectVisitor* v); | |
| 4512 | |
| 4513 template <typename StaticVisitor> | |
| 4514 inline void FixedTypedArrayBaseIterateBody(); | |
| 4515 | |
| 4516 DECLARE_CAST(FixedTypedArrayBase) | 4456 DECLARE_CAST(FixedTypedArrayBase) |
| 4517 | 4457 |
| 4518 static const int kBasePointerOffset = FixedArrayBase::kHeaderSize; | 4458 static const int kBasePointerOffset = FixedArrayBase::kHeaderSize; |
| 4519 static const int kExternalPointerOffset = kBasePointerOffset + kPointerSize; | 4459 static const int kExternalPointerOffset = kBasePointerOffset + kPointerSize; |
| 4520 static const int kHeaderSize = | 4460 static const int kHeaderSize = |
| 4521 DOUBLE_POINTER_ALIGN(kExternalPointerOffset + kPointerSize); | 4461 DOUBLE_POINTER_ALIGN(kExternalPointerOffset + kPointerSize); |
| 4522 | 4462 |
| 4523 static const int kDataOffset = kHeaderSize; | 4463 static const int kDataOffset = kHeaderSize; |
| 4524 | 4464 |
| 4465 class BodyDescriptor; |
| 4466 |
| 4525 inline int size(); | 4467 inline int size(); |
| 4526 | 4468 |
| 4527 static inline int TypedArraySize(InstanceType type, int length); | 4469 static inline int TypedArraySize(InstanceType type, int length); |
| 4528 inline int TypedArraySize(InstanceType type); | 4470 inline int TypedArraySize(InstanceType type); |
| 4529 | 4471 |
| 4530 // Use with care: returns raw pointer into heap. | 4472 // Use with care: returns raw pointer into heap. |
| 4531 inline void* DataPtr(); | 4473 inline void* DataPtr(); |
| 4532 | 4474 |
| 4533 inline int DataSize(); | 4475 inline int DataSize(); |
| 4534 | 4476 |
| (...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5185 inline int ExecutableSize(); | 5127 inline int ExecutableSize(); |
| 5186 | 5128 |
| 5187 // Locating source position. | 5129 // Locating source position. |
| 5188 int SourcePosition(Address pc); | 5130 int SourcePosition(Address pc); |
| 5189 int SourceStatementPosition(Address pc); | 5131 int SourceStatementPosition(Address pc); |
| 5190 | 5132 |
| 5191 DECLARE_CAST(Code) | 5133 DECLARE_CAST(Code) |
| 5192 | 5134 |
| 5193 // Dispatched behavior. | 5135 // Dispatched behavior. |
| 5194 inline int CodeSize(); | 5136 inline int CodeSize(); |
| 5195 inline void CodeIterateBody(ObjectVisitor* v); | |
| 5196 | |
| 5197 template<typename StaticVisitor> | |
| 5198 inline void CodeIterateBody(Heap* heap); | |
| 5199 | 5137 |
| 5200 DECLARE_PRINTER(Code) | 5138 DECLARE_PRINTER(Code) |
| 5201 DECLARE_VERIFIER(Code) | 5139 DECLARE_VERIFIER(Code) |
| 5202 | 5140 |
| 5203 void ClearInlineCaches(); | 5141 void ClearInlineCaches(); |
| 5204 void ClearInlineCaches(Kind kind); | 5142 void ClearInlineCaches(Kind kind); |
| 5205 | 5143 |
| 5206 BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset); | 5144 BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset); |
| 5207 uint32_t TranslateAstIdToPcOffset(BailoutId ast_id); | 5145 uint32_t TranslateAstIdToPcOffset(BailoutId ast_id); |
| 5208 | 5146 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5287 static const int kPrologueOffset = kKindSpecificFlags2Offset + kIntSize; | 5225 static const int kPrologueOffset = kKindSpecificFlags2Offset + kIntSize; |
| 5288 static const int kConstantPoolOffset = kPrologueOffset + kIntSize; | 5226 static const int kConstantPoolOffset = kPrologueOffset + kIntSize; |
| 5289 static const int kHeaderPaddingStart = | 5227 static const int kHeaderPaddingStart = |
| 5290 kConstantPoolOffset + kConstantPoolSize; | 5228 kConstantPoolOffset + kConstantPoolSize; |
| 5291 | 5229 |
| 5292 // Add padding to align the instruction start following right after | 5230 // Add padding to align the instruction start following right after |
| 5293 // the Code object header. | 5231 // the Code object header. |
| 5294 static const int kHeaderSize = | 5232 static const int kHeaderSize = |
| 5295 (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask; | 5233 (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask; |
| 5296 | 5234 |
| 5235 class BodyDescriptor; |
| 5236 |
| 5297 // Byte offsets within kKindSpecificFlags1Offset. | 5237 // Byte offsets within kKindSpecificFlags1Offset. |
| 5298 static const int kFullCodeFlags = kKindSpecificFlags1Offset; | 5238 static const int kFullCodeFlags = kKindSpecificFlags1Offset; |
| 5299 class FullCodeFlagsHasDeoptimizationSupportField: | 5239 class FullCodeFlagsHasDeoptimizationSupportField: |
| 5300 public BitField<bool, 0, 1> {}; // NOLINT | 5240 public BitField<bool, 0, 1> {}; // NOLINT |
| 5301 class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {}; | 5241 class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {}; |
| 5302 class FullCodeFlagsHasRelocInfoForSerialization | 5242 class FullCodeFlagsHasRelocInfoForSerialization |
| 5303 : public BitField<bool, 2, 1> {}; | 5243 : public BitField<bool, 2, 1> {}; |
| 5304 // Bit 3 in this bitfield is unused. | 5244 // Bit 3 in this bitfield is unused. |
| 5305 class ProfilerTicksField : public BitField<int, 4, 28> {}; | 5245 class ProfilerTicksField : public BitField<int, 4, 28> {}; |
| 5306 | 5246 |
| (...skipping 3890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9197 // which the pointer cache has to be refreshed. | 9137 // which the pointer cache has to be refreshed. |
| 9198 inline void update_data_cache(); | 9138 inline void update_data_cache(); |
| 9199 | 9139 |
| 9200 inline const uint8_t* GetChars(); | 9140 inline const uint8_t* GetChars(); |
| 9201 | 9141 |
| 9202 // Dispatched behavior. | 9142 // Dispatched behavior. |
| 9203 inline uint16_t ExternalOneByteStringGet(int index); | 9143 inline uint16_t ExternalOneByteStringGet(int index); |
| 9204 | 9144 |
| 9205 DECLARE_CAST(ExternalOneByteString) | 9145 DECLARE_CAST(ExternalOneByteString) |
| 9206 | 9146 |
| 9207 // Garbage collection support. | 9147 class BodyDescriptor; |
| 9208 inline void ExternalOneByteStringIterateBody(ObjectVisitor* v); | |
| 9209 | |
| 9210 template <typename StaticVisitor> | |
| 9211 inline void ExternalOneByteStringIterateBody(); | |
| 9212 | 9148 |
| 9213 private: | 9149 private: |
| 9214 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalOneByteString); | 9150 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalOneByteString); |
| 9215 }; | 9151 }; |
| 9216 | 9152 |
| 9217 | 9153 |
| 9218 // The ExternalTwoByteString class is an external string backed by a UTF-16 | 9154 // The ExternalTwoByteString class is an external string backed by a UTF-16 |
| 9219 // encoded string. | 9155 // encoded string. |
| 9220 class ExternalTwoByteString: public ExternalString { | 9156 class ExternalTwoByteString: public ExternalString { |
| 9221 public: | 9157 public: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 9236 inline const uint16_t* GetChars(); | 9172 inline const uint16_t* GetChars(); |
| 9237 | 9173 |
| 9238 // Dispatched behavior. | 9174 // Dispatched behavior. |
| 9239 inline uint16_t ExternalTwoByteStringGet(int index); | 9175 inline uint16_t ExternalTwoByteStringGet(int index); |
| 9240 | 9176 |
| 9241 // For regexp code. | 9177 // For regexp code. |
| 9242 inline const uint16_t* ExternalTwoByteStringGetData(unsigned start); | 9178 inline const uint16_t* ExternalTwoByteStringGetData(unsigned start); |
| 9243 | 9179 |
| 9244 DECLARE_CAST(ExternalTwoByteString) | 9180 DECLARE_CAST(ExternalTwoByteString) |
| 9245 | 9181 |
| 9246 // Garbage collection support. | 9182 class BodyDescriptor; |
| 9247 inline void ExternalTwoByteStringIterateBody(ObjectVisitor* v); | |
| 9248 | |
| 9249 template<typename StaticVisitor> | |
| 9250 inline void ExternalTwoByteStringIterateBody(); | |
| 9251 | 9183 |
| 9252 private: | 9184 private: |
| 9253 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); | 9185 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); |
| 9254 }; | 9186 }; |
| 9255 | 9187 |
| 9256 | 9188 |
| 9257 // Utility superclass for stack-allocated objects that must be updated | 9189 // Utility superclass for stack-allocated objects that must be updated |
| 9258 // on gc. It provides two ways for the gc to update instances, either | 9190 // on gc. It provides two ways for the gc to update instances, either |
| 9259 // iterating or updating after gc. | 9191 // iterating or updating after gc. |
| 9260 class Relocatable BASE_EMBEDDED { | 9192 class Relocatable BASE_EMBEDDED { |
| (...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9879 static void Initialize(Handle<JSWeakCollection> collection, Isolate* isolate); | 9811 static void Initialize(Handle<JSWeakCollection> collection, Isolate* isolate); |
| 9880 static void Set(Handle<JSWeakCollection> collection, Handle<Object> key, | 9812 static void Set(Handle<JSWeakCollection> collection, Handle<Object> key, |
| 9881 Handle<Object> value, int32_t hash); | 9813 Handle<Object> value, int32_t hash); |
| 9882 static bool Delete(Handle<JSWeakCollection> collection, Handle<Object> key, | 9814 static bool Delete(Handle<JSWeakCollection> collection, Handle<Object> key, |
| 9883 int32_t hash); | 9815 int32_t hash); |
| 9884 | 9816 |
| 9885 static const int kTableOffset = JSObject::kHeaderSize; | 9817 static const int kTableOffset = JSObject::kHeaderSize; |
| 9886 static const int kNextOffset = kTableOffset + kPointerSize; | 9818 static const int kNextOffset = kTableOffset + kPointerSize; |
| 9887 static const int kSize = kNextOffset + kPointerSize; | 9819 static const int kSize = kNextOffset + kPointerSize; |
| 9888 | 9820 |
| 9821 class BodyDescriptor; |
| 9822 |
| 9889 private: | 9823 private: |
| 9890 DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection); | 9824 DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection); |
| 9891 }; | 9825 }; |
| 9892 | 9826 |
| 9893 | 9827 |
| 9894 // The JSWeakMap describes EcmaScript Harmony weak maps | 9828 // The JSWeakMap describes EcmaScript Harmony weak maps |
| 9895 class JSWeakMap: public JSWeakCollection { | 9829 class JSWeakMap: public JSWeakCollection { |
| 9896 public: | 9830 public: |
| 9897 DECLARE_CAST(JSWeakMap) | 9831 DECLARE_CAST(JSWeakMap) |
| 9898 | 9832 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9957 static bool SetupAllocatingData(Handle<JSArrayBuffer> array_buffer, | 9891 static bool SetupAllocatingData(Handle<JSArrayBuffer> array_buffer, |
| 9958 Isolate* isolate, size_t allocated_length, | 9892 Isolate* isolate, size_t allocated_length, |
| 9959 bool initialize = true, | 9893 bool initialize = true, |
| 9960 SharedFlag shared = SharedFlag::kNotShared); | 9894 SharedFlag shared = SharedFlag::kNotShared); |
| 9961 | 9895 |
| 9962 // Dispatched behavior. | 9896 // Dispatched behavior. |
| 9963 DECLARE_PRINTER(JSArrayBuffer) | 9897 DECLARE_PRINTER(JSArrayBuffer) |
| 9964 DECLARE_VERIFIER(JSArrayBuffer) | 9898 DECLARE_VERIFIER(JSArrayBuffer) |
| 9965 | 9899 |
| 9966 static const int kByteLengthOffset = JSObject::kHeaderSize; | 9900 static const int kByteLengthOffset = JSObject::kHeaderSize; |
| 9967 | |
| 9968 // NOTE: GC will visit objects fields: | |
| 9969 // 1. From JSObject::BodyDescriptor::kStartOffset to kByteLengthOffset + | |
| 9970 // kPointerSize | |
| 9971 // 2. From start of the internal fields and up to the end of them | |
| 9972 static const int kBackingStoreOffset = kByteLengthOffset + kPointerSize; | 9901 static const int kBackingStoreOffset = kByteLengthOffset + kPointerSize; |
| 9973 static const int kBitFieldSlot = kBackingStoreOffset + kPointerSize; | 9902 static const int kBitFieldSlot = kBackingStoreOffset + kPointerSize; |
| 9974 #if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT | 9903 #if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT |
| 9975 static const int kBitFieldOffset = kBitFieldSlot; | 9904 static const int kBitFieldOffset = kBitFieldSlot; |
| 9976 #else | 9905 #else |
| 9977 static const int kBitFieldOffset = kBitFieldSlot + kIntSize; | 9906 static const int kBitFieldOffset = kBitFieldSlot + kIntSize; |
| 9978 #endif | 9907 #endif |
| 9979 static const int kSize = kBitFieldSlot + kPointerSize; | 9908 static const int kSize = kBitFieldSlot + kPointerSize; |
| 9980 | 9909 |
| 9981 static const int kSizeWithInternalFields = | 9910 static const int kSizeWithInternalFields = |
| 9982 kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize; | 9911 kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize; |
| 9983 | 9912 |
| 9984 template <typename StaticVisitor> | 9913 // Iterates all fields in the object including internal ones except |
| 9985 static inline void JSArrayBufferIterateBody(Heap* heap, HeapObject* obj); | 9914 // kBackingStoreOffset and kBitFieldSlot. |
| 9986 | 9915 class BodyDescriptor; |
| 9987 static inline void JSArrayBufferIterateBody(HeapObject* obj, | |
| 9988 ObjectVisitor* v); | |
| 9989 | 9916 |
| 9990 class IsExternal : public BitField<bool, 1, 1> {}; | 9917 class IsExternal : public BitField<bool, 1, 1> {}; |
| 9991 class IsNeuterable : public BitField<bool, 2, 1> {}; | 9918 class IsNeuterable : public BitField<bool, 2, 1> {}; |
| 9992 class WasNeutered : public BitField<bool, 3, 1> {}; | 9919 class WasNeutered : public BitField<bool, 3, 1> {}; |
| 9993 class IsShared : public BitField<bool, 4, 1> {}; | 9920 class IsShared : public BitField<bool, 4, 1> {}; |
| 9994 | 9921 |
| 9995 private: | 9922 private: |
| 9996 DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer); | 9923 DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer); |
| 9997 }; | 9924 }; |
| 9998 | 9925 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10084 // Foreign describes objects pointing from JavaScript to C structures. | 10011 // Foreign describes objects pointing from JavaScript to C structures. |
| 10085 class Foreign: public HeapObject { | 10012 class Foreign: public HeapObject { |
| 10086 public: | 10013 public: |
| 10087 // [address]: field containing the address. | 10014 // [address]: field containing the address. |
| 10088 inline Address foreign_address(); | 10015 inline Address foreign_address(); |
| 10089 inline void set_foreign_address(Address value); | 10016 inline void set_foreign_address(Address value); |
| 10090 | 10017 |
| 10091 DECLARE_CAST(Foreign) | 10018 DECLARE_CAST(Foreign) |
| 10092 | 10019 |
| 10093 // Dispatched behavior. | 10020 // Dispatched behavior. |
| 10094 inline void ForeignIterateBody(ObjectVisitor* v); | |
| 10095 | |
| 10096 template<typename StaticVisitor> | |
| 10097 inline void ForeignIterateBody(); | |
| 10098 | |
| 10099 // Dispatched behavior. | |
| 10100 DECLARE_PRINTER(Foreign) | 10021 DECLARE_PRINTER(Foreign) |
| 10101 DECLARE_VERIFIER(Foreign) | 10022 DECLARE_VERIFIER(Foreign) |
| 10102 | 10023 |
| 10103 // Layout description. | 10024 // Layout description. |
| 10104 | 10025 |
| 10105 static const int kForeignAddressOffset = HeapObject::kHeaderSize; | 10026 static const int kForeignAddressOffset = HeapObject::kHeaderSize; |
| 10106 static const int kSize = kForeignAddressOffset + kPointerSize; | 10027 static const int kSize = kForeignAddressOffset + kPointerSize; |
| 10107 | 10028 |
| 10108 STATIC_ASSERT(kForeignAddressOffset == Internals::kForeignAddressOffset); | 10029 STATIC_ASSERT(kForeignAddressOffset == Internals::kForeignAddressOffset); |
| 10109 | 10030 |
| 10031 class BodyDescriptor; |
| 10032 |
| 10110 private: | 10033 private: |
| 10111 DISALLOW_IMPLICIT_CONSTRUCTORS(Foreign); | 10034 DISALLOW_IMPLICIT_CONSTRUCTORS(Foreign); |
| 10112 }; | 10035 }; |
| 10113 | 10036 |
| 10114 | 10037 |
| 10115 // The JSArray describes JavaScript Arrays | 10038 // The JSArray describes JavaScript Arrays |
| 10116 // Such an array can be in one of two modes: | 10039 // Such an array can be in one of two modes: |
| 10117 // - fast, backing storage is a FixedArray and length <= elements.length(); | 10040 // - fast, backing storage is a FixedArray and length <= elements.length(); |
| 10118 // Please note: push and pop can be used to grow and shrink the array. | 10041 // Please note: push and pop can be used to grow and shrink the array. |
| 10119 // - slow, backing storage is a HashTable with numbers as keys. | 10042 // - slow, backing storage is a HashTable with numbers as keys. |
| (...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10763 // Visits a handle that has an embedder-assigned class ID. | 10686 // Visits a handle that has an embedder-assigned class ID. |
| 10764 virtual void VisitEmbedderReference(Object** p, uint16_t class_id) {} | 10687 virtual void VisitEmbedderReference(Object** p, uint16_t class_id) {} |
| 10765 | 10688 |
| 10766 // Intended for serialization/deserialization checking: insert, or | 10689 // Intended for serialization/deserialization checking: insert, or |
| 10767 // check for the presence of, a tag at this position in the stream. | 10690 // check for the presence of, a tag at this position in the stream. |
| 10768 // Also used for marking up GC roots in heap snapshots. | 10691 // Also used for marking up GC roots in heap snapshots. |
| 10769 virtual void Synchronize(VisitorSynchronization::SyncTag tag) {} | 10692 virtual void Synchronize(VisitorSynchronization::SyncTag tag) {} |
| 10770 }; | 10693 }; |
| 10771 | 10694 |
| 10772 | 10695 |
| 10773 typedef FlexibleBodyDescriptor<HeapObject::kHeaderSize> StructBodyDescriptor; | |
| 10774 | |
| 10775 | |
| 10776 // BooleanBit is a helper class for setting and getting a bit in an integer. | 10696 // BooleanBit is a helper class for setting and getting a bit in an integer. |
| 10777 class BooleanBit : public AllStatic { | 10697 class BooleanBit : public AllStatic { |
| 10778 public: | 10698 public: |
| 10779 static inline bool get(int value, int bit_position) { | 10699 static inline bool get(int value, int bit_position) { |
| 10780 return (value & (1 << bit_position)) != 0; | 10700 return (value & (1 << bit_position)) != 0; |
| 10781 } | 10701 } |
| 10782 | 10702 |
| 10783 static inline int set(int value, int bit_position, bool v) { | 10703 static inline int set(int value, int bit_position, bool v) { |
| 10784 if (v) { | 10704 if (v) { |
| 10785 value |= (1 << bit_position); | 10705 value |= (1 << bit_position); |
| 10786 } else { | 10706 } else { |
| 10787 value &= ~(1 << bit_position); | 10707 value &= ~(1 << bit_position); |
| 10788 } | 10708 } |
| 10789 return value; | 10709 return value; |
| 10790 } | 10710 } |
| 10791 }; | 10711 }; |
| 10792 | 10712 |
| 10793 | 10713 |
| 10794 } // NOLINT, false-positive due to second-order macros. | 10714 } // NOLINT, false-positive due to second-order macros. |
| 10795 } // NOLINT, false-positive due to second-order macros. | 10715 } // NOLINT, false-positive due to second-order macros. |
| 10796 | 10716 |
| 10797 #endif // V8_OBJECTS_H_ | 10717 #endif // V8_OBJECTS_H_ |
| OLD | NEW |