Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 4e20959a7a8c4b7bb6dae90feaba0e8e346865e0..61288d9de44514e8df5754c6728832663972a1cc 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -33,6 +33,7 @@ |
#include "debug.h" |
#include "execution.h" |
#include "objects-inl.h" |
+#include "objects-visiting.h" |
#include "macro-assembler.h" |
#include "scanner.h" |
#include "scopeinfo.h" |
@@ -1042,7 +1043,7 @@ int HeapObject::SlowSizeFromMap(Map* map) { |
switch (instance_type) { |
case FIXED_ARRAY_TYPE: |
- return reinterpret_cast<FixedArray*>(this)->FixedArraySize(); |
+ return FixedArray::BodyDescriptor::SizeOf(map, this); |
case BYTE_ARRAY_TYPE: |
return reinterpret_cast<ByteArray*>(this)->ByteArraySize(); |
case CODE_TYPE: |
@@ -1073,7 +1074,7 @@ void HeapObject::IterateBody(InstanceType type, int object_size, |
case kSeqStringTag: |
break; |
case kConsStringTag: |
- reinterpret_cast<ConsString*>(this)->ConsStringIterateBody(v); |
+ ConsString::BodyDescriptor::IterateBody(this, v); |
break; |
case kExternalStringTag: |
if ((type & kStringEncodingMask) == kAsciiStringTag) { |
@@ -1090,7 +1091,7 @@ void HeapObject::IterateBody(InstanceType type, int object_size, |
switch (type) { |
case FIXED_ARRAY_TYPE: |
- reinterpret_cast<FixedArray*>(this)->FixedArrayIterateBody(v); |
+ FixedArray::BodyDescriptor::IterateBody(this, object_size, v); |
break; |
case JS_OBJECT_TYPE: |
case JS_CONTEXT_EXTENSION_OBJECT_TYPE: |
@@ -1101,23 +1102,22 @@ void HeapObject::IterateBody(InstanceType type, int object_size, |
case JS_GLOBAL_PROXY_TYPE: |
case JS_GLOBAL_OBJECT_TYPE: |
case JS_BUILTINS_OBJECT_TYPE: |
- reinterpret_cast<JSObject*>(this)->JSObjectIterateBody(object_size, v); |
+ JSObject::BodyDescriptor::IterateBody(this, object_size, v); |
break; |
case ODDBALL_TYPE: |
- reinterpret_cast<Oddball*>(this)->OddballIterateBody(v); |
+ Oddball::BodyDescriptor::IterateBody(this, v); |
break; |
case PROXY_TYPE: |
reinterpret_cast<Proxy*>(this)->ProxyIterateBody(v); |
break; |
case MAP_TYPE: |
- reinterpret_cast<Map*>(this)->MapIterateBody(v); |
+ Map::BodyDescriptor::IterateBody(this, v); |
break; |
case CODE_TYPE: |
reinterpret_cast<Code*>(this)->CodeIterateBody(v); |
break; |
case JS_GLOBAL_PROPERTY_CELL_TYPE: |
- reinterpret_cast<JSGlobalPropertyCell*>(this) |
- ->JSGlobalPropertyCellIterateBody(v); |
+ JSGlobalPropertyCell::BodyDescriptor::IterateBody(this, v); |
break; |
case HEAP_NUMBER_TYPE: |
case FILLER_TYPE: |
@@ -1131,16 +1131,15 @@ void HeapObject::IterateBody(InstanceType type, int object_size, |
case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: |
case EXTERNAL_FLOAT_ARRAY_TYPE: |
break; |
- case SHARED_FUNCTION_INFO_TYPE: { |
- SharedFunctionInfo* shared = reinterpret_cast<SharedFunctionInfo*>(this); |
- shared->SharedFunctionInfoIterateBody(v); |
+ case SHARED_FUNCTION_INFO_TYPE: |
+ SharedFunctionInfo::BodyDescriptor::IterateBody(this, v); |
break; |
- } |
+ |
#define MAKE_STRUCT_CASE(NAME, Name, name) \ |
case NAME##_TYPE: |
STRUCT_LIST(MAKE_STRUCT_CASE) |
#undef MAKE_STRUCT_CASE |
- IterateStructBody(object_size, v); |
+ StructBodyDescriptor::IterateBody(this, object_size, v); |
break; |
default: |
PrintF("Unknown type: %d\n", type); |
@@ -1209,12 +1208,6 @@ String* JSObject::constructor_name() { |
} |
-void JSObject::JSObjectIterateBody(int object_size, ObjectVisitor* v) { |
- // Iterate over all fields in the body. Assumes all are Object*. |
- IteratePointers(v, kPropertiesOffset, object_size); |
-} |
- |
- |
Object* JSObject::AddFastPropertyUsingMap(Map* new_map, |
String* name, |
Object* value) { |
@@ -2190,8 +2183,7 @@ Object* JSObject::NormalizeProperties(PropertyNormalizationMode mode, |
int new_instance_size = map()->instance_size() - instance_size_delta; |
new_map->set_inobject_properties(0); |
new_map->set_instance_size(new_instance_size); |
- new_map->set_scavenger(Heap::GetScavenger(new_map->instance_type(), |
- new_map->instance_size())); |
+ new_map->set_visitor_id(StaticVisitorBase::GetVisitorId(new_map)); |
Heap::CreateFillerObjectAt(this->address() + new_instance_size, |
instance_size_delta); |
} |
@@ -3407,11 +3399,6 @@ void CodeCacheHashTable::RemoveByIndex(int index) { |
} |
-void FixedArray::FixedArrayIterateBody(ObjectVisitor* v) { |
- IteratePointers(v, kHeaderSize, kHeaderSize + length() * kPointerSize); |
-} |
- |
- |
static bool HasKey(FixedArray* array, Object* key) { |
int len0 = array->length(); |
for (int i = 0; i < len0; i++) { |
@@ -4501,16 +4488,6 @@ void ConsString::ConsStringReadBlockIntoBuffer(ReadBlockBuffer* rbb, |
} |
-void ConsString::ConsStringIterateBody(ObjectVisitor* v) { |
- IteratePointers(v, kFirstOffset, kSecondOffset + kPointerSize); |
-} |
- |
- |
-void JSGlobalPropertyCell::JSGlobalPropertyCellIterateBody(ObjectVisitor* v) { |
- IteratePointers(v, kValueOffset, kValueOffset + kPointerSize); |
-} |
- |
- |
uint16_t ConsString::ConsStringGet(int index) { |
ASSERT(index >= 0 && index < this->length()); |
@@ -4614,24 +4591,6 @@ void String::WriteToFlat(String* src, |
} |
-#define FIELD_ADDR(p, offset) \ |
- (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag) |
- |
-void ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) { |
- typedef v8::String::ExternalAsciiStringResource Resource; |
- v->VisitExternalAsciiString( |
- reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); |
-} |
- |
- |
-void ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) { |
- typedef v8::String::ExternalStringResource Resource; |
- v->VisitExternalTwoByteString( |
- reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); |
-} |
- |
-#undef FIELD_ADDR |
- |
template <typename IteratorA, typename IteratorB> |
static inline bool CompareStringContents(IteratorA* ia, IteratorB* ib) { |
// General slow case check. We know that the ia and ib iterators |
@@ -5035,12 +4994,6 @@ void Map::ClearNonLiveTransitions(Object* real_prototype) { |
} |
-void Map::MapIterateBody(ObjectVisitor* v) { |
- // Assumes all Object* members are contiguously allocated! |
- IteratePointers(v, kPointerFieldsBeginOffset, kPointerFieldsEndOffset); |
-} |
- |
- |
Object* JSFunction::SetInstancePrototype(Object* value) { |
ASSERT(value->IsJSObject()); |
@@ -5104,12 +5057,6 @@ Context* JSFunction::GlobalContextFromLiterals(FixedArray* literals) { |
} |
-void Oddball::OddballIterateBody(ObjectVisitor* v) { |
- // Assumes all Object* members are contiguously allocated! |
- IteratePointers(v, kToStringOffset, kToNumberOffset + kPointerSize); |
-} |
- |
- |
Object* Oddball::Initialize(const char* to_string, Object* to_number) { |
Object* symbol = Heap::LookupAsciiSymbol(to_string); |
if (symbol->IsFailure()) return symbol; |
@@ -5282,13 +5229,6 @@ void SharedFunctionInfo::SourceCodePrint(StringStream* accumulator, |
} |
-void SharedFunctionInfo::SharedFunctionInfoIterateBody(ObjectVisitor* v) { |
- IteratePointers(v, |
- kNameOffset, |
- kThisPropertyAssignmentsOffset + kPointerSize); |
-} |
- |
- |
void ObjectVisitor::VisitCodeTarget(RelocInfo* rinfo) { |
ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); |
Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
@@ -5310,28 +5250,6 @@ void ObjectVisitor::VisitDebugTarget(RelocInfo* rinfo) { |
} |
-void Code::CodeIterateBody(ObjectVisitor* v) { |
- int mode_mask = RelocInfo::kCodeTargetMask | |
- RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | |
- RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) | |
- RelocInfo::ModeMask(RelocInfo::JS_RETURN) | |
- RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT) | |
- RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY); |
- |
- // Use the relocation info pointer before it is visited by |
- // the heap compaction in the next statement. |
- RelocIterator it(this, mode_mask); |
- |
- IteratePointers(v, |
- kRelocationInfoOffset, |
- kRelocationInfoOffset + kPointerSize); |
- |
- for (; !it.done(); it.next()) { |
- it.rinfo()->Visit(v); |
- } |
-} |
- |
- |
void Code::Relocate(intptr_t delta) { |
for (RelocIterator it(this, RelocInfo::kApplyMask); !it.done(); it.next()) { |
it.rinfo()->apply(delta); |