From ece887dabf78b8bb40cf840cacfac4f1cdf57c78 Mon Sep 17 00:00:00 2001 From: "vitalyr@chromium.org" Date: Mon, 6 Sep 2010 12:50:11 +0000 Subject: [PATCH] Turn visitor_id into a byte field and free back one word in Map. Review URL: http://codereview.chromium.org/3364007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5414 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/objects-inl.h | 11 ++++++++++- src/objects-visiting.h | 3 +++ src/objects.cc | 3 --- src/objects.h | 8 +++----- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/objects-inl.h b/src/objects-inl.h index 2a54062..bac224f 100644 --- a/src/objects-inl.h +++ b/src/objects-inl.h @@ -2109,7 +2109,16 @@ void ExternalFloatArray::set(int index, float value) { } -INT_ACCESSORS(Map, visitor_id, kScavengerCallbackOffset) +int Map::visitor_id() { + return READ_BYTE_FIELD(this, kVisitorIdOffset); +} + + +void Map::set_visitor_id(int id) { + ASSERT(0 <= id && id < 256); + WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast(id)); +} + int Map::instance_size() { return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2; diff --git a/src/objects-visiting.h b/src/objects-visiting.h index 95dc66c..a6d6b12 100644 --- a/src/objects-visiting.h +++ b/src/objects-visiting.h @@ -106,6 +106,9 @@ class StaticVisitorBase : public AllStatic { kMinObjectSizeInWords = 2 }; + // Visitor ID should fit in one byte. + STATIC_ASSERT(kVisitorIdCount <= 256); + // Determine which specialized visitor should be used for given instance type // and instance type. static VisitorId GetVisitorId(int instance_type, int instance_size); diff --git a/src/objects.cc b/src/objects.cc index 9b43d24..6a46c26 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -2126,9 +2126,6 @@ Object* NormalizedMapCache::Get(JSObject* obj, PropertyNormalizationMode mode) { // The cached map should match newly created normalized map bit-by-bit. Object* fresh = fast->CopyNormalized(mode); if (!fresh->IsFailure()) { - // Copy the unused byte so that the assertion below works. - Map::cast(fresh)->address()[Map::kUnusedOffset] = - Map::cast(result)->address()[Map::kUnusedOffset]; ASSERT(memcmp(Map::cast(fresh)->address(), Map::cast(result)->address(), Map::kSize) == 0); diff --git a/src/objects.h b/src/objects.h index 11d65ef..ca668b4 100644 --- a/src/objects.h +++ b/src/objects.h @@ -3245,8 +3245,7 @@ class Map: public HeapObject { static const int kInstanceDescriptorsOffset = kConstructorOffset + kPointerSize; static const int kCodeCacheOffset = kInstanceDescriptorsOffset + kPointerSize; - static const int kScavengerCallbackOffset = kCodeCacheOffset + kPointerSize; - static const int kPadStart = kScavengerCallbackOffset + kPointerSize; + static const int kPadStart = kCodeCacheOffset + kPointerSize; static const int kSize = MAP_POINTER_ALIGN(kPadStart); // Layout of pointer fields. Heap iteration code relies on them @@ -3263,9 +3262,8 @@ class Map: public HeapObject { static const int kPreAllocatedPropertyFieldsByte = 2; static const int kPreAllocatedPropertyFieldsOffset = kInstanceSizesOffset + kPreAllocatedPropertyFieldsByte; - // The byte at position 3 is not in use at the moment. - static const int kUnusedByte = 3; - static const int kUnusedOffset = kInstanceSizesOffset + kUnusedByte; + static const int kVisitorIdByte = 3; + static const int kVisitorIdOffset = kInstanceSizesOffset + kVisitorIdByte; // Byte offsets within kInstanceAttributesOffset attributes. static const int kInstanceTypeOffset = kInstanceAttributesOffset + 0; -- 2.7.4