Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/objects.h

Issue 1440243002: Object's body descriptors refactoring. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@new-visitor-base
Patch Set: Refactoring & cleanup Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "src/assert-scope.h" 11 #include "src/assert-scope.h"
12 #include "src/bailout-reason.h" 12 #include "src/bailout-reason.h"
13 #include "src/base/bits.h" 13 #include "src/base/bits.h"
14 #include "src/base/smart-pointers.h" 14 #include "src/base/smart-pointers.h"
15 #include "src/builtins.h" 15 #include "src/builtins.h"
16 #include "src/checks.h" 16 #include "src/checks.h"
17 #include "src/elements-kind.h" 17 #include "src/elements-kind.h"
18 #include "src/field-index.h" 18 #include "src/field-index.h"
19 #include "src/flags.h" 19 #include "src/flags.h"
20 #include "src/list.h" 20 #include "src/list.h"
21 #include "src/objects-body-descriptors-fwd.h"
21 #include "src/property-details.h" 22 #include "src/property-details.h"
22 #include "src/unicode.h" 23 #include "src/unicode.h"
23 #include "src/unicode-decoder.h" 24 #include "src/unicode-decoder.h"
24 #include "src/zone.h" 25 #include "src/zone.h"
25 26
26 #if V8_TARGET_ARCH_ARM 27 #if V8_TARGET_ARCH_ARM
27 #include "src/arm/constants-arm.h" // NOLINT 28 #include "src/arm/constants-arm.h" // NOLINT
28 #elif V8_TARGET_ARCH_ARM64 29 #elif V8_TARGET_ARCH_ARM64
29 #include "src/arm64/constants-arm64.h" // NOLINT 30 #include "src/arm64/constants-arm64.h" // NOLINT
30 #elif V8_TARGET_ARCH_MIPS 31 #elif V8_TARGET_ARCH_MIPS
(...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after
1548 static inline HeapObject* FromAddress(Address address) { 1549 static inline HeapObject* FromAddress(Address address) {
1549 DCHECK_TAG_ALIGNED(address); 1550 DCHECK_TAG_ALIGNED(address);
1550 return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); 1551 return reinterpret_cast<HeapObject*>(address + kHeapObjectTag);
1551 } 1552 }
1552 1553
1553 // Returns the address of this HeapObject. 1554 // Returns the address of this HeapObject.
1554 inline Address address() { 1555 inline Address address() {
1555 return reinterpret_cast<Address>(this) - kHeapObjectTag; 1556 return reinterpret_cast<Address>(this) - kHeapObjectTag;
1556 } 1557 }
1557 1558
1558 // Iterates over pointers contained in the object (including the Map) 1559 // Iterates over pointers contained in the object (including the Map).
1560 // If it's not performance critical iteration use the non-templatized
1561 // version.
1559 void Iterate(ObjectVisitor* v); 1562 void Iterate(ObjectVisitor* v);
1560 1563
1564 template <typename ObjectVisitor>
1565 inline void IterateFast(ObjectVisitor* v);
1566
1561 // Iterates over all pointers contained in the object except the 1567 // Iterates over all pointers contained in the object except the
1562 // first map pointer. The object type is given in the first 1568 // first map pointer. The object type is given in the first
1563 // parameter. This function does not access the map pointer in the 1569 // 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. 1570 // object, and so is safe to call while the map pointer is modified.
1571 // If it's not performance critical iteration use the non-templatized
1572 // version.
1573 void IterateBody(ObjectVisitor* v);
1565 void IterateBody(InstanceType type, int object_size, ObjectVisitor* v); 1574 void IterateBody(InstanceType type, int object_size, ObjectVisitor* v);
1566 1575
1576 template <typename ObjectVisitor>
1577 inline void IterateBodyFast(ObjectVisitor* v);
1578
1579 template <typename ObjectVisitor>
1580 inline void IterateBodyFast(InstanceType type, int object_size,
1581 ObjectVisitor* v);
1582
1583 // Returns true if the object contains a tagged value at given offset.
1584 // It is used for invalid slots filtering. If the offset points outside
1585 // of the object or to the map word, the result is UNDEFINED (!!!).
1586 bool IsValidSlot(int offset);
1587
1567 // Returns the heap object's size in bytes 1588 // Returns the heap object's size in bytes
1568 inline int Size(); 1589 inline int Size();
1569 1590
1570 // Indicates what type of values this heap object may contain. 1591 // Indicates what type of values this heap object may contain.
1571 inline HeapObjectContents ContentType(); 1592 inline HeapObjectContents ContentType();
1572 1593
1573 // Given a heap object's map pointer, returns the heap size in bytes 1594 // 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. 1595 // Useful when the map pointer field is used for other purposes.
1575 // GC internal. 1596 // GC internal.
1576 inline int SizeFromMap(Map* map); 1597 inline int SizeFromMap(Map* map);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1616 1637
1617 inline AllocationAlignment RequiredAlignment(); 1638 inline AllocationAlignment RequiredAlignment();
1618 1639
1619 // Layout description. 1640 // Layout description.
1620 // First field in a heap object is map. 1641 // First field in a heap object is map.
1621 static const int kMapOffset = Object::kHeaderSize; 1642 static const int kMapOffset = Object::kHeaderSize;
1622 static const int kHeaderSize = kMapOffset + kPointerSize; 1643 static const int kHeaderSize = kMapOffset + kPointerSize;
1623 1644
1624 STATIC_ASSERT(kMapOffset == Internals::kHeapObjectMapOffset); 1645 STATIC_ASSERT(kMapOffset == Internals::kHeapObjectMapOffset);
1625 1646
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: 1647 private:
1636 DISALLOW_IMPLICIT_CONSTRUCTORS(HeapObject); 1648 DISALLOW_IMPLICIT_CONSTRUCTORS(HeapObject);
1637 }; 1649 };
1638 1650
1639 1651
1640 // This is the base class for object's body descriptors.
1641 class BodyDescriptorBase {
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
1658
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>
1685 class FlexibleBodyDescriptorBase : public BodyDescriptorBase {
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
1711
1712 // The HeapNumber class describes heap allocated numbers that cannot be 1652 // The HeapNumber class describes heap allocated numbers that cannot be
1713 // represented in a Smi (small integer) 1653 // represented in a Smi (small integer)
1714 class HeapNumber: public HeapObject { 1654 class HeapNumber: public HeapObject {
1715 public: 1655 public:
1716 // [value]: number value. 1656 // [value]: number value.
1717 inline double value() const; 1657 inline double value() const;
1718 inline void set_value(double value); 1658 inline void set_value(double value);
1719 1659
1720 DECLARE_CAST(HeapNumber) 1660 DECLARE_CAST(HeapNumber)
1721 1661
(...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after
2681 // Swap two elements in a pair of arrays. If this array and the 2621 // 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 2622 // numbers array are the same object, the elements are only swapped
2683 // once. 2623 // once.
2684 void SwapPairs(FixedArray* numbers, int i, int j); 2624 void SwapPairs(FixedArray* numbers, int i, int j);
2685 2625
2686 // Sort prefix of this array and the numbers array as pairs wrt. the 2626 // 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 2627 // numbers. If the numbers array and the this array are the same
2688 // object, the prefix of this array is sorted. 2628 // object, the prefix of this array is sorted.
2689 void SortPairs(FixedArray* numbers, uint32_t len); 2629 void SortPairs(FixedArray* numbers, uint32_t len);
2690 2630
2691 class BodyDescriptor : public FlexibleBodyDescriptorBase<kHeaderSize> { 2631 typedef FlexibleBodyDescriptor<kHeaderSize> BodyDescriptor;
2692 public:
2693 static inline int SizeOf(Map* map, HeapObject* object);
2694 };
2695 2632
2696 protected: 2633 protected:
2697 // Set operation on FixedArray without using write barriers. Can 2634 // Set operation on FixedArray without using write barriers. Can
2698 // only be used for storing old space objects or smis. 2635 // only be used for storing old space objects or smis.
2699 static inline void NoWriteBarrierSet(FixedArray* array, 2636 static inline void NoWriteBarrierSet(FixedArray* array,
2700 int index, 2637 int index,
2701 Object* value); 2638 Object* value);
2702 2639
2703 // Set operation on FixedArray without incremental write barrier. Can 2640 // Set operation on FixedArray without incremental write barrier. Can
2704 // only be used if the object is guaranteed to be white (whiteness witness 2641 // 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
4416 inline int parameter_count() const; 4353 inline int parameter_count() const;
4417 inline void set_parameter_count(int number_of_parameters); 4354 inline void set_parameter_count(int number_of_parameters);
4418 4355
4419 // Accessors for the constant pool. 4356 // Accessors for the constant pool.
4420 DECL_ACCESSORS(constant_pool, FixedArray) 4357 DECL_ACCESSORS(constant_pool, FixedArray)
4421 4358
4422 DECLARE_CAST(BytecodeArray) 4359 DECLARE_CAST(BytecodeArray)
4423 4360
4424 // Dispatched behavior. 4361 // Dispatched behavior.
4425 inline int BytecodeArraySize(); 4362 inline int BytecodeArraySize();
4426 inline void BytecodeArrayIterateBody(ObjectVisitor* v);
4427 4363
4428 DECLARE_PRINTER(BytecodeArray) 4364 DECLARE_PRINTER(BytecodeArray)
4429 DECLARE_VERIFIER(BytecodeArray) 4365 DECLARE_VERIFIER(BytecodeArray)
4430 4366
4431 void Disassemble(std::ostream& os); 4367 void Disassemble(std::ostream& os);
4432 4368
4433 // Layout description. 4369 // Layout description.
4434 static const int kFrameSizeOffset = FixedArrayBase::kHeaderSize; 4370 static const int kFrameSizeOffset = FixedArrayBase::kHeaderSize;
4435 static const int kParameterSizeOffset = kFrameSizeOffset + kIntSize; 4371 static const int kParameterSizeOffset = kFrameSizeOffset + kIntSize;
4436 static const int kConstantPoolOffset = kParameterSizeOffset + kIntSize; 4372 static const int kConstantPoolOffset = kParameterSizeOffset + kIntSize;
4437 static const int kHeaderSize = kConstantPoolOffset + kPointerSize; 4373 static const int kHeaderSize = kConstantPoolOffset + kPointerSize;
4438 4374
4439 static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); 4375 static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize);
4440 4376
4441 // Maximal memory consumption for a single BytecodeArray. 4377 // Maximal memory consumption for a single BytecodeArray.
4442 static const int kMaxSize = 512 * MB; 4378 static const int kMaxSize = 512 * MB;
4443 // Maximal length of a single BytecodeArray. 4379 // Maximal length of a single BytecodeArray.
4444 static const int kMaxLength = kMaxSize - kHeaderSize; 4380 static const int kMaxLength = kMaxSize - kHeaderSize;
4445 4381
4382 class BodyDescriptor;
4383
4446 private: 4384 private:
4447 DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArray); 4385 DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArray);
4448 }; 4386 };
4449 4387
4450 4388
4451 // FreeSpace are fixed-size free memory blocks used by the heap and GC. 4389 // 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 4390 // 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. 4391 // 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) 4392 // The next pointer is the raw address of the next FreeSpace object (or NULL)
4455 // in the free list. 4393 // in the free list.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
4501 public: 4439 public:
4502 // [base_pointer]: Either points to the FixedTypedArrayBase itself or nullptr. 4440 // [base_pointer]: Either points to the FixedTypedArrayBase itself or nullptr.
4503 DECL_ACCESSORS(base_pointer, Object) 4441 DECL_ACCESSORS(base_pointer, Object)
4504 4442
4505 // [external_pointer]: Contains the offset between base_pointer and the start 4443 // [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 4444 // of the data. If the base_pointer is a nullptr, the external_pointer
4507 // therefore points to the actual backing store. 4445 // therefore points to the actual backing store.
4508 DECL_ACCESSORS(external_pointer, void) 4446 DECL_ACCESSORS(external_pointer, void)
4509 4447
4510 // Dispatched behavior. 4448 // Dispatched behavior.
4511 inline void FixedTypedArrayBaseIterateBody(ObjectVisitor* v);
4512
4513 template <typename StaticVisitor>
4514 inline void FixedTypedArrayBaseIterateBody();
4515
4516 DECLARE_CAST(FixedTypedArrayBase) 4449 DECLARE_CAST(FixedTypedArrayBase)
4517 4450
4518 static const int kBasePointerOffset = FixedArrayBase::kHeaderSize; 4451 static const int kBasePointerOffset = FixedArrayBase::kHeaderSize;
4519 static const int kExternalPointerOffset = kBasePointerOffset + kPointerSize; 4452 static const int kExternalPointerOffset = kBasePointerOffset + kPointerSize;
4520 static const int kHeaderSize = 4453 static const int kHeaderSize =
4521 DOUBLE_POINTER_ALIGN(kExternalPointerOffset + kPointerSize); 4454 DOUBLE_POINTER_ALIGN(kExternalPointerOffset + kPointerSize);
4522 4455
4523 static const int kDataOffset = kHeaderSize; 4456 static const int kDataOffset = kHeaderSize;
4524 4457
4458 class BodyDescriptor;
4459
4525 inline int size(); 4460 inline int size();
4526 4461
4527 static inline int TypedArraySize(InstanceType type, int length); 4462 static inline int TypedArraySize(InstanceType type, int length);
4528 inline int TypedArraySize(InstanceType type); 4463 inline int TypedArraySize(InstanceType type);
4529 4464
4530 // Use with care: returns raw pointer into heap. 4465 // Use with care: returns raw pointer into heap.
4531 inline void* DataPtr(); 4466 inline void* DataPtr();
4532 4467
4533 inline int DataSize(); 4468 inline int DataSize();
4534 4469
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
5185 inline int ExecutableSize(); 5120 inline int ExecutableSize();
5186 5121
5187 // Locating source position. 5122 // Locating source position.
5188 int SourcePosition(Address pc); 5123 int SourcePosition(Address pc);
5189 int SourceStatementPosition(Address pc); 5124 int SourceStatementPosition(Address pc);
5190 5125
5191 DECLARE_CAST(Code) 5126 DECLARE_CAST(Code)
5192 5127
5193 // Dispatched behavior. 5128 // Dispatched behavior.
5194 inline int CodeSize(); 5129 inline int CodeSize();
5195 inline void CodeIterateBody(ObjectVisitor* v);
5196
5197 template<typename StaticVisitor>
5198 inline void CodeIterateBody(Heap* heap);
5199 5130
5200 DECLARE_PRINTER(Code) 5131 DECLARE_PRINTER(Code)
5201 DECLARE_VERIFIER(Code) 5132 DECLARE_VERIFIER(Code)
5202 5133
5203 void ClearInlineCaches(); 5134 void ClearInlineCaches();
5204 void ClearInlineCaches(Kind kind); 5135 void ClearInlineCaches(Kind kind);
5205 5136
5206 BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset); 5137 BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset);
5207 uint32_t TranslateAstIdToPcOffset(BailoutId ast_id); 5138 uint32_t TranslateAstIdToPcOffset(BailoutId ast_id);
5208 5139
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
5287 static const int kPrologueOffset = kKindSpecificFlags2Offset + kIntSize; 5218 static const int kPrologueOffset = kKindSpecificFlags2Offset + kIntSize;
5288 static const int kConstantPoolOffset = kPrologueOffset + kIntSize; 5219 static const int kConstantPoolOffset = kPrologueOffset + kIntSize;
5289 static const int kHeaderPaddingStart = 5220 static const int kHeaderPaddingStart =
5290 kConstantPoolOffset + kConstantPoolSize; 5221 kConstantPoolOffset + kConstantPoolSize;
5291 5222
5292 // Add padding to align the instruction start following right after 5223 // Add padding to align the instruction start following right after
5293 // the Code object header. 5224 // the Code object header.
5294 static const int kHeaderSize = 5225 static const int kHeaderSize =
5295 (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask; 5226 (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask;
5296 5227
5228 class BodyDescriptor;
5229
5297 // Byte offsets within kKindSpecificFlags1Offset. 5230 // Byte offsets within kKindSpecificFlags1Offset.
5298 static const int kFullCodeFlags = kKindSpecificFlags1Offset; 5231 static const int kFullCodeFlags = kKindSpecificFlags1Offset;
5299 class FullCodeFlagsHasDeoptimizationSupportField: 5232 class FullCodeFlagsHasDeoptimizationSupportField:
5300 public BitField<bool, 0, 1> {}; // NOLINT 5233 public BitField<bool, 0, 1> {}; // NOLINT
5301 class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {}; 5234 class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {};
5302 class FullCodeFlagsHasRelocInfoForSerialization 5235 class FullCodeFlagsHasRelocInfoForSerialization
5303 : public BitField<bool, 2, 1> {}; 5236 : public BitField<bool, 2, 1> {};
5304 // Bit 3 in this bitfield is unused. 5237 // Bit 3 in this bitfield is unused.
5305 class ProfilerTicksField : public BitField<int, 4, 28> {}; 5238 class ProfilerTicksField : public BitField<int, 4, 28> {};
5306 5239
(...skipping 3890 matching lines...) Expand 10 before | Expand all | Expand 10 after
9197 // which the pointer cache has to be refreshed. 9130 // which the pointer cache has to be refreshed.
9198 inline void update_data_cache(); 9131 inline void update_data_cache();
9199 9132
9200 inline const uint8_t* GetChars(); 9133 inline const uint8_t* GetChars();
9201 9134
9202 // Dispatched behavior. 9135 // Dispatched behavior.
9203 inline uint16_t ExternalOneByteStringGet(int index); 9136 inline uint16_t ExternalOneByteStringGet(int index);
9204 9137
9205 DECLARE_CAST(ExternalOneByteString) 9138 DECLARE_CAST(ExternalOneByteString)
9206 9139
9207 // Garbage collection support. 9140 class BodyDescriptor;
9208 inline void ExternalOneByteStringIterateBody(ObjectVisitor* v);
9209
9210 template <typename StaticVisitor>
9211 inline void ExternalOneByteStringIterateBody();
9212 9141
9213 private: 9142 private:
9214 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalOneByteString); 9143 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalOneByteString);
9215 }; 9144 };
9216 9145
9217 9146
9218 // The ExternalTwoByteString class is an external string backed by a UTF-16 9147 // The ExternalTwoByteString class is an external string backed by a UTF-16
9219 // encoded string. 9148 // encoded string.
9220 class ExternalTwoByteString: public ExternalString { 9149 class ExternalTwoByteString: public ExternalString {
9221 public: 9150 public:
(...skipping 14 matching lines...) Expand all
9236 inline const uint16_t* GetChars(); 9165 inline const uint16_t* GetChars();
9237 9166
9238 // Dispatched behavior. 9167 // Dispatched behavior.
9239 inline uint16_t ExternalTwoByteStringGet(int index); 9168 inline uint16_t ExternalTwoByteStringGet(int index);
9240 9169
9241 // For regexp code. 9170 // For regexp code.
9242 inline const uint16_t* ExternalTwoByteStringGetData(unsigned start); 9171 inline const uint16_t* ExternalTwoByteStringGetData(unsigned start);
9243 9172
9244 DECLARE_CAST(ExternalTwoByteString) 9173 DECLARE_CAST(ExternalTwoByteString)
9245 9174
9246 // Garbage collection support. 9175 class BodyDescriptor;
9247 inline void ExternalTwoByteStringIterateBody(ObjectVisitor* v);
9248
9249 template<typename StaticVisitor>
9250 inline void ExternalTwoByteStringIterateBody();
9251 9176
9252 private: 9177 private:
9253 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); 9178 DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString);
9254 }; 9179 };
9255 9180
9256 9181
9257 // Utility superclass for stack-allocated objects that must be updated 9182 // Utility superclass for stack-allocated objects that must be updated
9258 // on gc. It provides two ways for the gc to update instances, either 9183 // on gc. It provides two ways for the gc to update instances, either
9259 // iterating or updating after gc. 9184 // iterating or updating after gc.
9260 class Relocatable BASE_EMBEDDED { 9185 class Relocatable BASE_EMBEDDED {
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after
9879 static void Initialize(Handle<JSWeakCollection> collection, Isolate* isolate); 9804 static void Initialize(Handle<JSWeakCollection> collection, Isolate* isolate);
9880 static void Set(Handle<JSWeakCollection> collection, Handle<Object> key, 9805 static void Set(Handle<JSWeakCollection> collection, Handle<Object> key,
9881 Handle<Object> value, int32_t hash); 9806 Handle<Object> value, int32_t hash);
9882 static bool Delete(Handle<JSWeakCollection> collection, Handle<Object> key, 9807 static bool Delete(Handle<JSWeakCollection> collection, Handle<Object> key,
9883 int32_t hash); 9808 int32_t hash);
9884 9809
9885 static const int kTableOffset = JSObject::kHeaderSize; 9810 static const int kTableOffset = JSObject::kHeaderSize;
9886 static const int kNextOffset = kTableOffset + kPointerSize; 9811 static const int kNextOffset = kTableOffset + kPointerSize;
9887 static const int kSize = kNextOffset + kPointerSize; 9812 static const int kSize = kNextOffset + kPointerSize;
9888 9813
9814 class BodyDescriptor;
9815
9889 private: 9816 private:
9890 DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection); 9817 DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection);
9891 }; 9818 };
9892 9819
9893 9820
9894 // The JSWeakMap describes EcmaScript Harmony weak maps 9821 // The JSWeakMap describes EcmaScript Harmony weak maps
9895 class JSWeakMap: public JSWeakCollection { 9822 class JSWeakMap: public JSWeakCollection {
9896 public: 9823 public:
9897 DECLARE_CAST(JSWeakMap) 9824 DECLARE_CAST(JSWeakMap)
9898 9825
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
9957 static bool SetupAllocatingData(Handle<JSArrayBuffer> array_buffer, 9884 static bool SetupAllocatingData(Handle<JSArrayBuffer> array_buffer,
9958 Isolate* isolate, size_t allocated_length, 9885 Isolate* isolate, size_t allocated_length,
9959 bool initialize = true, 9886 bool initialize = true,
9960 SharedFlag shared = SharedFlag::kNotShared); 9887 SharedFlag shared = SharedFlag::kNotShared);
9961 9888
9962 // Dispatched behavior. 9889 // Dispatched behavior.
9963 DECLARE_PRINTER(JSArrayBuffer) 9890 DECLARE_PRINTER(JSArrayBuffer)
9964 DECLARE_VERIFIER(JSArrayBuffer) 9891 DECLARE_VERIFIER(JSArrayBuffer)
9965 9892
9966 static const int kByteLengthOffset = JSObject::kHeaderSize; 9893 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; 9894 static const int kBackingStoreOffset = kByteLengthOffset + kPointerSize;
9973 static const int kBitFieldSlot = kBackingStoreOffset + kPointerSize; 9895 static const int kBitFieldSlot = kBackingStoreOffset + kPointerSize;
9974 #if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT 9896 #if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT
9975 static const int kBitFieldOffset = kBitFieldSlot; 9897 static const int kBitFieldOffset = kBitFieldSlot;
9976 #else 9898 #else
9977 static const int kBitFieldOffset = kBitFieldSlot + kIntSize; 9899 static const int kBitFieldOffset = kBitFieldSlot + kIntSize;
9978 #endif 9900 #endif
9979 static const int kSize = kBitFieldSlot + kPointerSize; 9901 static const int kSize = kBitFieldSlot + kPointerSize;
9980 9902
9981 static const int kSizeWithInternalFields = 9903 static const int kSizeWithInternalFields =
9982 kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize; 9904 kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize;
9983 9905
9984 template <typename StaticVisitor> 9906 // Iterates all fields in the object including internal ones except
9985 static inline void JSArrayBufferIterateBody(Heap* heap, HeapObject* obj); 9907 // kBackingStoreOffset and kBitFieldSlot.
9986 9908 class BodyDescriptor;
9987 static inline void JSArrayBufferIterateBody(HeapObject* obj,
9988 ObjectVisitor* v);
9989 9909
9990 class IsExternal : public BitField<bool, 1, 1> {}; 9910 class IsExternal : public BitField<bool, 1, 1> {};
9991 class IsNeuterable : public BitField<bool, 2, 1> {}; 9911 class IsNeuterable : public BitField<bool, 2, 1> {};
9992 class WasNeutered : public BitField<bool, 3, 1> {}; 9912 class WasNeutered : public BitField<bool, 3, 1> {};
9993 class IsShared : public BitField<bool, 4, 1> {}; 9913 class IsShared : public BitField<bool, 4, 1> {};
9994 9914
9995 private: 9915 private:
9996 DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer); 9916 DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer);
9997 }; 9917 };
9998 9918
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
10084 // Foreign describes objects pointing from JavaScript to C structures. 10004 // Foreign describes objects pointing from JavaScript to C structures.
10085 class Foreign: public HeapObject { 10005 class Foreign: public HeapObject {
10086 public: 10006 public:
10087 // [address]: field containing the address. 10007 // [address]: field containing the address.
10088 inline Address foreign_address(); 10008 inline Address foreign_address();
10089 inline void set_foreign_address(Address value); 10009 inline void set_foreign_address(Address value);
10090 10010
10091 DECLARE_CAST(Foreign) 10011 DECLARE_CAST(Foreign)
10092 10012
10093 // Dispatched behavior. 10013 // 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) 10014 DECLARE_PRINTER(Foreign)
10101 DECLARE_VERIFIER(Foreign) 10015 DECLARE_VERIFIER(Foreign)
10102 10016
10103 // Layout description. 10017 // Layout description.
10104 10018
10105 static const int kForeignAddressOffset = HeapObject::kHeaderSize; 10019 static const int kForeignAddressOffset = HeapObject::kHeaderSize;
10106 static const int kSize = kForeignAddressOffset + kPointerSize; 10020 static const int kSize = kForeignAddressOffset + kPointerSize;
10107 10021
10108 STATIC_ASSERT(kForeignAddressOffset == Internals::kForeignAddressOffset); 10022 STATIC_ASSERT(kForeignAddressOffset == Internals::kForeignAddressOffset);
10109 10023
10024 class BodyDescriptor;
10025
10110 private: 10026 private:
10111 DISALLOW_IMPLICIT_CONSTRUCTORS(Foreign); 10027 DISALLOW_IMPLICIT_CONSTRUCTORS(Foreign);
10112 }; 10028 };
10113 10029
10114 10030
10115 // The JSArray describes JavaScript Arrays 10031 // The JSArray describes JavaScript Arrays
10116 // Such an array can be in one of two modes: 10032 // Such an array can be in one of two modes:
10117 // - fast, backing storage is a FixedArray and length <= elements.length(); 10033 // - 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. 10034 // 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. 10035 // - slow, backing storage is a HashTable with numbers as keys.
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
10763 // Visits a handle that has an embedder-assigned class ID. 10679 // Visits a handle that has an embedder-assigned class ID.
10764 virtual void VisitEmbedderReference(Object** p, uint16_t class_id) {} 10680 virtual void VisitEmbedderReference(Object** p, uint16_t class_id) {}
10765 10681
10766 // Intended for serialization/deserialization checking: insert, or 10682 // Intended for serialization/deserialization checking: insert, or
10767 // check for the presence of, a tag at this position in the stream. 10683 // check for the presence of, a tag at this position in the stream.
10768 // Also used for marking up GC roots in heap snapshots. 10684 // Also used for marking up GC roots in heap snapshots.
10769 virtual void Synchronize(VisitorSynchronization::SyncTag tag) {} 10685 virtual void Synchronize(VisitorSynchronization::SyncTag tag) {}
10770 }; 10686 };
10771 10687
10772 10688
10773 typedef FlexibleBodyDescriptor<HeapObject::kHeaderSize> StructBodyDescriptor;
10774
10775
10776 // BooleanBit is a helper class for setting and getting a bit in an integer. 10689 // BooleanBit is a helper class for setting and getting a bit in an integer.
10777 class BooleanBit : public AllStatic { 10690 class BooleanBit : public AllStatic {
10778 public: 10691 public:
10779 static inline bool get(int value, int bit_position) { 10692 static inline bool get(int value, int bit_position) {
10780 return (value & (1 << bit_position)) != 0; 10693 return (value & (1 << bit_position)) != 0;
10781 } 10694 }
10782 10695
10783 static inline int set(int value, int bit_position, bool v) { 10696 static inline int set(int value, int bit_position, bool v) {
10784 if (v) { 10697 if (v) {
10785 value |= (1 << bit_position); 10698 value |= (1 << bit_position);
10786 } else { 10699 } else {
10787 value &= ~(1 << bit_position); 10700 value &= ~(1 << bit_position);
10788 } 10701 }
10789 return value; 10702 return value;
10790 } 10703 }
10791 }; 10704 };
10792 10705
10793 10706
10794 } // NOLINT, false-positive due to second-order macros. 10707 } // NOLINT, false-positive due to second-order macros.
10795 } // NOLINT, false-positive due to second-order macros. 10708 } // NOLINT, false-positive due to second-order macros.
10796 10709
10797 #endif // V8_OBJECTS_H_ 10710 #endif // V8_OBJECTS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698