| 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);
|
|
|