| Index: src/objects.h
|
| diff --git a/src/objects.h b/src/objects.h
|
| index 8fa251efabf32a719028052e9107095dc1779df3..c8b7716445f8dc2a28586fde87592013bbd41faf 100644
|
| --- a/src/objects.h
|
| +++ b/src/objects.h
|
| @@ -1106,6 +1106,51 @@ class HeapObject: public Object {
|
| };
|
|
|
|
|
| +#define SLOT_ADDR(obj, offset) \
|
| + reinterpret_cast<Object**>((obj)->address() + offset)
|
| +
|
| +// This class describes a body of an object of a fixed size
|
| +// in which all pointer fields are located in the [start_offset, end_offset)
|
| +// interval.
|
| +template<int start_offset, int end_offset, int size>
|
| +class FixedBodyDescriptor {
|
| + public:
|
| + static const int kStartOffset = start_offset;
|
| + static const int kEndOffset = end_offset;
|
| + static const int kSize = size;
|
| +
|
| + static inline void IterateBody(HeapObject* obj, ObjectVisitor* v);
|
| +
|
| + template<typename StaticVisitor>
|
| + static inline void IterateBody(HeapObject* obj) {
|
| + StaticVisitor::VisitPointers(SLOT_ADDR(obj, start_offset),
|
| + SLOT_ADDR(obj, end_offset));
|
| + }
|
| +};
|
| +
|
| +
|
| +// This class describes a body of an object of a variable size
|
| +// in which all pointer fields are located in the [start_offset, object_size)
|
| +// interval.
|
| +template<int start_offset>
|
| +class FlexibleBodyDescriptor {
|
| + public:
|
| + static const int kStartOffset = start_offset;
|
| +
|
| + static inline void IterateBody(HeapObject* obj,
|
| + int object_size,
|
| + ObjectVisitor* v);
|
| +
|
| + template<typename StaticVisitor>
|
| + static inline void IterateBody(HeapObject* obj, int object_size) {
|
| + StaticVisitor::VisitPointers(SLOT_ADDR(obj, start_offset),
|
| + SLOT_ADDR(obj, object_size));
|
| + }
|
| +};
|
| +
|
| +#undef SLOT_ADDR
|
| +
|
| +
|
| // The HeapNumber class describes heap allocated numbers that cannot be
|
| // represented in a Smi (small integer)
|
| class HeapNumber: public HeapObject {
|
| @@ -1522,7 +1567,6 @@ class JSObject: public HeapObject {
|
|
|
|
|
| // Dispatched behavior.
|
| - void JSObjectIterateBody(int object_size, ObjectVisitor* v);
|
| void JSObjectShortPrint(StringStream* accumulator);
|
| #ifdef DEBUG
|
| void JSObjectPrint();
|
| @@ -1578,6 +1622,11 @@ class JSObject: public HeapObject {
|
|
|
| STATIC_CHECK(kHeaderSize == Internals::kJSObjectHeaderSize);
|
|
|
| + class BodyDescriptor : public FlexibleBodyDescriptor<kPropertiesOffset> {
|
| + public:
|
| + static inline int SizeOf(Map* map, HeapObject* object);
|
| + };
|
| +
|
| private:
|
| Object* GetElementWithCallback(Object* receiver,
|
| Object* structure,
|
| @@ -1692,8 +1741,6 @@ class FixedArray: public HeapObject {
|
| static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize;
|
|
|
| // Dispatched behavior.
|
| - int FixedArraySize() { return SizeFor(length()); }
|
| - void FixedArrayIterateBody(ObjectVisitor* v);
|
| #ifdef DEBUG
|
| void FixedArrayPrint();
|
| void FixedArrayVerify();
|
| @@ -1711,6 +1758,13 @@ class FixedArray: public HeapObject {
|
| // object, the prefix of this array is sorted.
|
| void SortPairs(FixedArray* numbers, uint32_t len);
|
|
|
| + class BodyDescriptor : public FlexibleBodyDescriptor<kHeaderSize> {
|
| + public:
|
| + static inline int SizeOf(Map* map, HeapObject* object) {
|
| + return SizeFor(reinterpret_cast<FixedArray*>(object)->length());
|
| + }
|
| + };
|
| +
|
| protected:
|
| // Set operation on FixedArray without using write barriers. Can
|
| // only be used for storing old space objects or smis.
|
| @@ -2426,7 +2480,9 @@ class ByteArray: public HeapObject {
|
| static inline ByteArray* cast(Object* obj);
|
|
|
| // Dispatched behavior.
|
| - int ByteArraySize() { return SizeFor(length()); }
|
| + inline int ByteArraySize() {
|
| + return SizeFor(this->length());
|
| + }
|
| #ifdef DEBUG
|
| void ByteArrayPrint();
|
| void ByteArrayVerify();
|
| @@ -2847,7 +2903,10 @@ class Code: public HeapObject {
|
|
|
| // Dispatched behavior.
|
| int CodeSize() { return SizeFor(body_size()); }
|
| - void CodeIterateBody(ObjectVisitor* v);
|
| + inline void CodeIterateBody(ObjectVisitor* v);
|
| +
|
| + template<typename StaticVisitor>
|
| + inline void CodeIterateBody();
|
| #ifdef DEBUG
|
| void CodePrint();
|
| void CodeVerify();
|
| @@ -2893,7 +2952,6 @@ class Code: public HeapObject {
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(Code);
|
| };
|
|
|
| -typedef void (*Scavenger)(Map* map, HeapObject** slot, HeapObject* object);
|
|
|
| // All heap objects have a Map that describes their structure.
|
| // A Map contains information about:
|
| @@ -3089,18 +3147,13 @@ class Map: public HeapObject {
|
| void ClearNonLiveTransitions(Object* real_prototype);
|
|
|
| // Dispatched behavior.
|
| - void MapIterateBody(ObjectVisitor* v);
|
| #ifdef DEBUG
|
| void MapPrint();
|
| void MapVerify();
|
| #endif
|
|
|
| - inline Scavenger scavenger();
|
| - inline void set_scavenger(Scavenger callback);
|
| -
|
| - inline void Scavenge(HeapObject** slot, HeapObject* obj) {
|
| - scavenger()(this, slot, obj);
|
| - }
|
| + inline int visitor_id();
|
| + inline void set_visitor_id(int visitor_id);
|
|
|
| static const int kMaxPreAllocatedPropertyFields = 255;
|
|
|
| @@ -3160,6 +3213,10 @@ class Map: public HeapObject {
|
| static const int kCodeCacheEntryNameOffset = 0;
|
| static const int kCodeCacheEntryCodeOffset = 1;
|
|
|
| + typedef FixedBodyDescriptor<kPointerFieldsBeginOffset,
|
| + kPointerFieldsEndOffset,
|
| + kSize> BodyDescriptor;
|
| +
|
| private:
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(Map);
|
| };
|
| @@ -3414,7 +3471,6 @@ class SharedFunctionInfo: public HeapObject {
|
| int CalculateInObjectProperties();
|
|
|
| // Dispatched behavior.
|
| - void SharedFunctionInfoIterateBody(ObjectVisitor* v);
|
| // Set max_length to -1 for unlimited length.
|
| void SourceCodePrint(StringStream* accumulator, int max_length);
|
| #ifdef DEBUG
|
| @@ -3503,6 +3559,10 @@ class SharedFunctionInfo: public HeapObject {
|
| #endif
|
| static const int kAlignedSize = POINTER_SIZE_ALIGN(kSize);
|
|
|
| + typedef FixedBodyDescriptor<kNameOffset,
|
| + kThisPropertyAssignmentsOffset + kPointerSize,
|
| + kSize> BodyDescriptor;
|
| +
|
| private:
|
| // Bit positions in start_position_and_type.
|
| // The source code start position is in the 30 most significant bits of
|
| @@ -4551,11 +4611,6 @@ class ConsString: public String {
|
| // Casting.
|
| static inline ConsString* cast(Object* obj);
|
|
|
| - // Garbage collection support. This method is called during garbage
|
| - // collection to iterate through the heap pointers in the body of
|
| - // the ConsString.
|
| - void ConsStringIterateBody(ObjectVisitor* v);
|
| -
|
| // Layout description.
|
| static const int kFirstOffset = POINTER_SIZE_ALIGN(String::kSize);
|
| static const int kSecondOffset = kFirstOffset + kPointerSize;
|
| @@ -4572,6 +4627,9 @@ class ConsString: public String {
|
| // Minimum length for a cons string.
|
| static const int kMinLength = 13;
|
|
|
| + typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize>
|
| + BodyDescriptor;
|
| +
|
| private:
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString);
|
| };
|
| @@ -4621,7 +4679,10 @@ class ExternalAsciiString: public ExternalString {
|
| static inline ExternalAsciiString* cast(Object* obj);
|
|
|
| // Garbage collection support.
|
| - void ExternalAsciiStringIterateBody(ObjectVisitor* v);
|
| + inline void ExternalAsciiStringIterateBody(ObjectVisitor* v);
|
| +
|
| + template<typename StaticVisitor>
|
| + inline void ExternalAsciiStringIterateBody();
|
|
|
| // Support for StringInputBuffer.
|
| const unibrow::byte* ExternalAsciiStringReadBlock(unsigned* remaining,
|
| @@ -4658,7 +4719,11 @@ class ExternalTwoByteString: public ExternalString {
|
| static inline ExternalTwoByteString* cast(Object* obj);
|
|
|
| // Garbage collection support.
|
| - void ExternalTwoByteStringIterateBody(ObjectVisitor* v);
|
| + inline void ExternalTwoByteStringIterateBody(ObjectVisitor* v);
|
| +
|
| + template<typename StaticVisitor>
|
| + inline void ExternalTwoByteStringIterateBody();
|
| +
|
|
|
| // Support for StringInputBuffer.
|
| void ExternalTwoByteStringReadBlockIntoBuffer(ReadBlockBuffer* buffer,
|
| @@ -4769,7 +4834,6 @@ class Oddball: public HeapObject {
|
| static inline Oddball* cast(Object* obj);
|
|
|
| // Dispatched behavior.
|
| - void OddballIterateBody(ObjectVisitor* v);
|
| #ifdef DEBUG
|
| void OddballVerify();
|
| #endif
|
| @@ -4782,6 +4846,10 @@ class Oddball: public HeapObject {
|
| static const int kToNumberOffset = kToStringOffset + kPointerSize;
|
| static const int kSize = kToNumberOffset + kPointerSize;
|
|
|
| + typedef FixedBodyDescriptor<kToStringOffset,
|
| + kToNumberOffset + kPointerSize,
|
| + kSize> BodyDescriptor;
|
| +
|
| private:
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(Oddball);
|
| };
|
| @@ -4795,8 +4863,6 @@ class JSGlobalPropertyCell: public HeapObject {
|
| // Casting.
|
| static inline JSGlobalPropertyCell* cast(Object* obj);
|
|
|
| - // Dispatched behavior.
|
| - void JSGlobalPropertyCellIterateBody(ObjectVisitor* v);
|
| #ifdef DEBUG
|
| void JSGlobalPropertyCellVerify();
|
| void JSGlobalPropertyCellPrint();
|
| @@ -4806,6 +4872,10 @@ class JSGlobalPropertyCell: public HeapObject {
|
| static const int kValueOffset = HeapObject::kHeaderSize;
|
| static const int kSize = kValueOffset + kPointerSize;
|
|
|
| + typedef FixedBodyDescriptor<kValueOffset,
|
| + kValueOffset + kPointerSize,
|
| + kSize> BodyDescriptor;
|
| +
|
| private:
|
| DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalPropertyCell);
|
| };
|
| @@ -4826,6 +4896,10 @@ class Proxy: public HeapObject {
|
|
|
| // Dispatched behavior.
|
| inline void ProxyIterateBody(ObjectVisitor* v);
|
| +
|
| + template<typename StaticVisitor>
|
| + inline void ProxyIterateBody();
|
| +
|
| #ifdef DEBUG
|
| void ProxyPrint();
|
| void ProxyVerify();
|
| @@ -5343,6 +5417,15 @@ class ObjectVisitor BASE_EMBEDDED {
|
| };
|
|
|
|
|
| +class StructBodyDescriptor : public
|
| + FlexibleBodyDescriptor<HeapObject::kHeaderSize> {
|
| + public:
|
| + static inline int SizeOf(Map* map, HeapObject* object) {
|
| + return map->instance_size();
|
| + }
|
| +};
|
| +
|
| +
|
| // BooleanBit is a helper class for setting and getting a bit in an
|
| // integer or Smi.
|
| class BooleanBit : public AllStatic {
|
|
|