Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(591)

Unified Diff: src/objects-inl.h

Issue 10692130: Swap bitfield3 and backpointer. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: u Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/objects.h ('K') | « src/objects.cc ('k') | src/profile-generator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects-inl.h
diff --git a/src/objects-inl.h b/src/objects-inl.h
index c39167ef7050b9ab812cc73abd7fe67f581ffe3a..69b4dffb24caaab105c477cee9f00115f8e3d201 100644
--- a/src/objects-inl.h
+++ b/src/objects-inl.h
@@ -1896,14 +1896,17 @@ bool DescriptorArray::HasTransitionArray() {
}
-int DescriptorArray::bit_field3_storage() {
- Object* storage = READ_FIELD(this, kBitField3StorageOffset);
- return Smi::cast(storage)->value();
+Object* DescriptorArray::back_pointer_storage() {
+ return READ_FIELD(this, kBackPointerStorageOffset);
}
-void DescriptorArray::set_bit_field3_storage(int value) {
- ASSERT(length() > kBitField3StorageIndex);
- WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value));
+
+void DescriptorArray::set_back_pointer_storage(Object* value,
+ WriteBarrierMode mode) {
+ ASSERT(length() > kBackPointerStorageIndex);
+ Heap* heap = GetHeap();
+ WRITE_FIELD(this, kBackPointerStorageOffset, value);
+ CONDITIONAL_WRITE_BARRIER(heap, this, kBackPointerStorageOffset, value, mode);
}
@@ -3402,8 +3405,9 @@ void Map::set_prototype(Object* value, WriteBarrierMode mode) {
DescriptorArray* Map::instance_descriptors() {
- Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
- if (object->IsSmi()) {
+ Object* object = READ_FIELD(this, kInstanceDescriptorsOrBackPointerOffset);
+ if (!object->IsDescriptorArray()) {
+ ASSERT(object->IsMap() || object->IsUndefined());
return GetHeap()->empty_descriptor_array();
} else {
return DescriptorArray::cast(object);
@@ -3411,85 +3415,64 @@ DescriptorArray* Map::instance_descriptors() {
}
-void Map::init_instance_descriptors() {
- WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, Smi::FromInt(0));
-}
-
-
-void Map::clear_instance_descriptors() {
- Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
- if (!object->IsSmi()) {
- WRITE_FIELD(
- this,
- kInstanceDescriptorsOrBitField3Offset,
- Smi::FromInt(DescriptorArray::cast(object)->bit_field3_storage()));
- }
-}
-
-
void Map::set_instance_descriptors(DescriptorArray* value,
WriteBarrierMode mode) {
- Object* object = READ_FIELD(this,
- kInstanceDescriptorsOrBitField3Offset);
+ ASSERT(!value->IsFailure());
Jakob Kummerow 2012/07/10 12:26:25 Can this happen?
Toon Verwaest 2012/07/10 13:28:28 Removed. On 2012/07/10 12:26:25, Jakob wrote:
+ Object* object = READ_FIELD(this, kInstanceDescriptorsOrBackPointerOffset);
Jakob Kummerow 2012/07/10 12:26:25 Looks like you can move this into the "else" block
Toon Verwaest 2012/07/10 13:28:28 Done.
Heap* heap = GetHeap();
if (value == heap->empty_descriptor_array()) {
- clear_instance_descriptors();
+ ClearDescriptorArray(heap, mode);
return;
} else {
- if (object->IsSmi()) {
- value->set_bit_field3_storage(Smi::cast(object)->value());
+ if (object->IsDescriptorArray()) {
+ value->set_back_pointer_storage(
+ DescriptorArray::cast(object)->back_pointer_storage());
} else {
- value->set_bit_field3_storage(
- DescriptorArray::cast(object)->bit_field3_storage());
+ ASSERT(object->IsMap() || object->IsUndefined());
+ value->set_back_pointer_storage(object);
}
}
ASSERT(!is_shared());
- WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value);
+ WRITE_FIELD(this, kInstanceDescriptorsOrBackPointerOffset, value);
CONDITIONAL_WRITE_BARRIER(
- heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode);
+ heap, this, kInstanceDescriptorsOrBackPointerOffset, value, mode);
}
int Map::bit_field3() {
Jakob Kummerow 2012/07/10 12:26:25 SMI_ACCESSORS(Map, bit_field3, kBitField3Offset) s
Toon Verwaest 2012/07/10 13:28:28 Done.
- Object* object = READ_FIELD(this,
- kInstanceDescriptorsOrBitField3Offset);
- if (object->IsSmi()) {
- return Smi::cast(object)->value();
- } else {
- return DescriptorArray::cast(object)->bit_field3_storage();
- }
+ return Smi::cast(READ_FIELD(this, kBitField3Offset))->value();
}
-void Map::ClearDescriptorArray() {
- int bitfield3 = bit_field3();
+void Map::ClearDescriptorArray(Heap* heap, WriteBarrierMode mode) {
+ Object* back_pointer = GetBackPointer();
#ifdef DEBUG
- Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
- if (!object->IsSmi()) {
+ Object* object = READ_FIELD(this, kInstanceDescriptorsOrBackPointerOffset);
+ if (object->IsDescriptorArray()) {
ZapTransitions();
+ } else {
+ ASSERT(object->IsMap() || object->IsUndefined());
}
#endif
- WRITE_FIELD(this,
- kInstanceDescriptorsOrBitField3Offset,
- Smi::FromInt(bitfield3));
+ WRITE_FIELD(this, kInstanceDescriptorsOrBackPointerOffset, back_pointer);
+ CONDITIONAL_WRITE_BARRIER(
+ heap, this, kInstanceDescriptorsOrBackPointerOffset, back_pointer, mode);
}
void Map::set_bit_field3(int value) {
- ASSERT(Smi::IsValid(value));
- Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
- if (object->IsSmi()) {
- WRITE_FIELD(this,
- kInstanceDescriptorsOrBitField3Offset,
- Smi::FromInt(value));
- } else {
- DescriptorArray::cast(object)->set_bit_field3_storage(value);
- }
+ WRITE_FIELD(this, kBitField3Offset, Smi::FromInt(value));
}
Object* Map::GetBackPointer() {
- return READ_FIELD(this, kBackPointerOffset);
+ Object* object = READ_FIELD(this, kInstanceDescriptorsOrBackPointerOffset);
+ if (object->IsDescriptorArray()) {
+ return DescriptorArray::cast(object)->back_pointer_storage();
+ } else {
+ ASSERT(object->IsMap() || object->IsUndefined());
+ return object;
+ }
}
@@ -3514,8 +3497,8 @@ MaybeObject* Map::AddTransition(String* key, Object* value) {
}
-// If the map does not have a descriptor array, install a new empty
-// descriptor array that has room for a transition array.
+// If the map is using the empty descriptor array, install a new empty
+// descriptor array that will contain an element transition.
Jakob Kummerow 2012/07/10 12:26:25 nit: s/element/elements/
Toon Verwaest 2012/07/10 13:28:28 Done.
static MaybeObject* AllowTransitions(Map* map) {
if (map->instance_descriptors()->MayContainTransitions()) return map;
DescriptorArray* descriptors;
@@ -3584,13 +3567,13 @@ TransitionArray* Map::transitions() {
}
-void Map::ClearTransitions() {
+void Map::ClearTransitions(Heap* heap, WriteBarrierMode mode) {
#ifdef DEBUG
ZapTransitions();
#endif
DescriptorArray* descriptors = instance_descriptors();
if (descriptors->number_of_descriptors() == 0) {
- ClearDescriptorArray();
+ ClearDescriptorArray(heap, mode);
} else {
descriptors->ClearTransitions();
}
@@ -3613,17 +3596,23 @@ MaybeObject* Map::set_transitions(TransitionArray* transitions_array) {
void Map::init_back_pointer(Object* undefined) {
ASSERT(undefined->IsUndefined());
- WRITE_FIELD(this, kBackPointerOffset, undefined);
+ WRITE_FIELD(this, kInstanceDescriptorsOrBackPointerOffset, undefined);
}
void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
- Heap* heap = GetHeap();
ASSERT(instance_type() >= FIRST_JS_RECEIVER_TYPE);
ASSERT((value->IsUndefined() && GetBackPointer()->IsMap()) ||
(value->IsMap() && GetBackPointer()->IsUndefined()));
- WRITE_FIELD(this, kBackPointerOffset, value);
- CONDITIONAL_WRITE_BARRIER(heap, this, kBackPointerOffset, value, mode);
+ Object* object = READ_FIELD(this, kInstanceDescriptorsOrBackPointerOffset);
+ if (object->IsMap()) {
+ ASSERT(!value->IsFailure());
Jakob Kummerow 2012/07/10 12:26:25 Can this happen?
Toon Verwaest 2012/07/10 13:28:28 Removed. On 2012/07/10 12:26:25, Jakob wrote:
+ WRITE_FIELD(this, kInstanceDescriptorsOrBackPointerOffset, value);
+ CONDITIONAL_WRITE_BARRIER(
+ GetHeap(), this, kInstanceDescriptorsOrBackPointerOffset, value, mode);
+ } else {
Jakob Kummerow 2012/07/10 12:26:25 What if (object->IsUndefined()) ?
Toon Verwaest 2012/07/10 13:28:28 Then we just overwrite it, since it's the default
+ DescriptorArray::cast(object)->set_back_pointer_storage(value);
+ }
}
« src/objects.h ('K') | « src/objects.cc ('k') | src/profile-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698