Index: src/heap/slot-set.h |
diff --git a/src/heap/slot-set.h b/src/heap/slot-set.h |
index 1ed2b39b391cbf5c1b542e98f9d91926f6ce86d3..2fac50f9c61f4c33b7aa5874277aaef48cfca5ed 100644 |
--- a/src/heap/slot-set.h |
+++ b/src/heap/slot-set.h |
@@ -233,7 +233,30 @@ enum SlotType { |
// typed slots contain V8 internal pointers that are not directly exposed to JS. |
class TypedSlotSet { |
public: |
- typedef uint32_t TypedSlot; |
+ struct TypedSlot { |
+ TypedSlot() : type_and_offset_(0), host_offset_(0) {} |
+ |
+ TypedSlot(SlotType type, uint32_t host_offset, uint32_t offset) |
+ : type_and_offset_(TypeField::encode(type) | |
+ OffsetField::encode(offset)), |
+ host_offset_(host_offset) {} |
+ |
+ bool operator==(const TypedSlot other) { |
+ return type_and_offset_ == other.type_and_offset_ && |
+ host_offset_ == other.host_offset_; |
+ } |
+ |
+ bool operator!=(const TypedSlot other) { return !(*this == other); } |
+ |
+ SlotType type() { return TypeField::decode(type_and_offset_); } |
+ |
+ uint32_t offset() { return OffsetField::decode(type_and_offset_); } |
+ |
+ uint32_t host_offset() { return host_offset_; } |
+ |
+ uint32_t type_and_offset_; |
+ uint32_t host_offset_; |
+ }; |
static const int kMaxOffset = 1 << 29; |
explicit TypedSlotSet(Address page_start) : page_start_(page_start) { |
@@ -250,8 +273,8 @@ class TypedSlotSet { |
} |
// The slot offset specifies a slot at address page_start_ + offset. |
- void Insert(SlotType type, int offset) { |
- TypedSlot slot = ToTypedSlot(type, offset); |
+ void Insert(SlotType type, uint32_t host_offset, uint32_t offset) { |
+ TypedSlot slot(type, host_offset, offset); |
if (!chunk_->AddSlot(slot)) { |
chunk_ = new Chunk(chunk_, NextCapacity(chunk_->capacity)); |
bool added = chunk_->AddSlot(slot); |
@@ -272,7 +295,7 @@ class TypedSlotSet { |
template <typename Callback> |
int Iterate(Callback callback) { |
STATIC_ASSERT(NUMBER_OF_SLOT_TYPES < 8); |
- const TypedSlot kRemovedSlot = TypeField::encode(NUMBER_OF_SLOT_TYPES); |
+ const TypedSlot kRemovedSlot(NUMBER_OF_SLOT_TYPES, 0, 0); |
Chunk* chunk = chunk_; |
int new_count = 0; |
while (chunk != nullptr) { |
@@ -281,9 +304,10 @@ class TypedSlotSet { |
for (int i = 0; i < count; i++) { |
TypedSlot slot = buffer[i]; |
if (slot != kRemovedSlot) { |
- SlotType type = TypeField::decode(slot); |
- Address addr = page_start_ + OffsetField::decode(slot); |
- if (callback(type, addr) == KEEP_SLOT) { |
+ SlotType type = slot.type(); |
+ Address addr = page_start_ + slot.offset(); |
+ Address host_addr = page_start_ + slot.host_offset(); |
+ if (callback(type, host_addr, addr) == KEEP_SLOT) { |
new_count++; |
} else { |
buffer[i] = kRemovedSlot; |
@@ -303,10 +327,6 @@ class TypedSlotSet { |
return Min(kMaxBufferSize, capacity * 2); |
} |
- static TypedSlot ToTypedSlot(SlotType type, int offset) { |
- return TypeField::encode(type) | OffsetField::encode(offset); |
- } |
- |
class OffsetField : public BitField<int, 0, 29> {}; |
class TypeField : public BitField<SlotType, 29, 3> {}; |