Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 995ed36f0228b9982dd08f50fc9ef0dd54406b9d..63ef8a50d645db325c107c80f7b938e6064bd691 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -1449,6 +1449,54 @@ void JSObject::PrintElementsTransition( |
} |
+void Map::PrintGeneralization(FILE* file, |
+ int modify_index, |
+ int split, |
+ int descriptors, |
+ Representation old_representation, |
+ Representation new_representation) { |
+ PrintF(file, "[generalizing "); |
+ constructor_name()->PrintOn(file); |
+ PrintF(file, "] "); |
+ String::cast(instance_descriptors()->GetKey(modify_index))->PrintOn(file); |
+ PrintF(file, ":%s->%s (+%i maps) [", |
+ old_representation.Mnemonic(), |
+ new_representation.Mnemonic(), |
+ descriptors - split); |
+ JavaScriptFrame::PrintTop(GetIsolate(), file, false, true); |
+ PrintF(file, "]\n"); |
+} |
+ |
+ |
+void JSObject::PrintInstanceMigration(FILE* file, |
+ Map* original_map, |
+ Map* new_map) { |
+ PrintF(file, "[migrating "); |
+ map()->constructor_name()->PrintOn(file); |
+ PrintF(file, "] "); |
+ DescriptorArray* o = original_map->instance_descriptors(); |
+ DescriptorArray* n = new_map->instance_descriptors(); |
+ for (int i = 0; i < original_map->NumberOfOwnDescriptors(); i++) { |
+ Representation o_r = o->GetDetails(i).representation(); |
+ Representation n_r = n->GetDetails(i).representation(); |
+ if (!o_r.Equals(n_r)) { |
+ String::cast(o->GetKey(i))->PrintOn(file); |
+ PrintF(file, ":%s->%s ", o_r.Mnemonic(), n_r.Mnemonic()); |
+ } else if (o->GetDetails(i).type() == CONSTANT && |
+ n->GetDetails(i).type() == FIELD) { |
+ Name* name = o->GetKey(i); |
+ if (name->IsString()) { |
+ String::cast(name)->PrintOn(file); |
+ } else { |
+ PrintF(file, "???"); |
+ } |
+ PrintF(file, " "); |
+ } |
+ } |
+ PrintF(file, "\n"); |
+} |
+ |
+ |
void HeapObject::HeapObjectShortPrint(StringStream* accumulator) { |
Heap* heap = GetHeap(); |
if (!heap->Contains(this)) { |
@@ -1783,14 +1831,14 @@ String* JSReceiver::class_name() { |
} |
-String* JSReceiver::constructor_name() { |
- if (map()->constructor()->IsJSFunction()) { |
- JSFunction* constructor = JSFunction::cast(map()->constructor()); |
+String* Map::constructor_name() { |
+ if (constructor()->IsJSFunction()) { |
+ JSFunction* constructor = JSFunction::cast(this->constructor()); |
String* name = String::cast(constructor->shared()->name()); |
if (name->length() > 0) return name; |
String* inferred_name = constructor->shared()->inferred_name(); |
if (inferred_name->length() > 0) return inferred_name; |
- Object* proto = GetPrototype(); |
+ Object* proto = prototype(); |
if (proto->IsJSObject()) return JSObject::cast(proto)->constructor_name(); |
} |
// TODO(rossberg): what about proxies? |
@@ -1799,6 +1847,11 @@ String* JSReceiver::constructor_name() { |
} |
+String* JSReceiver::constructor_name() { |
+ return map()->constructor_name(); |
+} |
+ |
+ |
MaybeObject* JSObject::AddFastPropertyUsingMap(Map* new_map, |
Name* name, |
Object* value, |
@@ -2626,12 +2679,6 @@ MaybeObject* Map::GeneralizeRepresentation(int modify_index, |
if (old_representation.IsNone() && |
!new_representation.IsNone() && |
!new_representation.IsDouble()) { |
- if (FLAG_trace_generalization) { |
- PrintF("initializing representation %i: %p -> %s\n", |
- modify_index, |
- static_cast<void*>(this), |
- new_representation.Mnemonic()); |
- } |
old_descriptors->SetRepresentation(modify_index, new_representation); |
return old_map; |
} |
@@ -2661,11 +2708,9 @@ MaybeObject* Map::GeneralizeRepresentation(int modify_index, |
if (FLAG_trace_generalization && |
!(modify_index == 0 && new_representation.IsNone())) { |
PropertyDetails old_details = old_descriptors->GetDetails(modify_index); |
- PrintF("migrating to existing map %p(%s) -> %p(%s)\n", |
- static_cast<void*>(this), |
- old_details.representation().Mnemonic(), |
- static_cast<void*>(updated), |
- updated_representation.Mnemonic()); |
+ PrintGeneralization(stdout, modify_index, descriptors, descriptors, |
+ old_details.representation(), |
+ updated_representation); |
} |
return updated; |
} |
@@ -2698,13 +2743,8 @@ MaybeObject* Map::GeneralizeRepresentation(int modify_index, |
if (FLAG_trace_generalization && |
!(modify_index == 0 && new_representation.IsNone())) { |
- PrintF("migrating to new map %i: %p(%s) -> %p(%s) (%i steps)\n", |
- modify_index, |
- static_cast<void*>(this), |
- old_representation.Mnemonic(), |
- static_cast<void*>(new_descriptors), |
- updated_representation.Mnemonic(), |
- descriptors - descriptor); |
+ PrintGeneralization(stdout, modify_index, descriptor, descriptors, |
+ old_representation, updated_representation); |
} |
Map* new_map = split_map; |
@@ -3726,11 +3766,6 @@ void JSObject::AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map) { |
void JSObject::MigrateInstance(Handle<JSObject> object) { |
- if (FLAG_trace_migration) { |
- PrintF("migrating instance %p (%p)\n", |
- static_cast<void*>(*object), |
- static_cast<void*>(object->map())); |
- } |
CALL_HEAP_FUNCTION_VOID( |
object->GetIsolate(), |
object->MigrateInstance()); |
@@ -3738,11 +3773,6 @@ void JSObject::MigrateInstance(Handle<JSObject> object) { |
Handle<Object> JSObject::TryMigrateInstance(Handle<JSObject> object) { |
- if (FLAG_trace_migration) { |
- PrintF("migrating instance (no new maps) %p (%p)\n", |
- static_cast<void*>(*object), |
- static_cast<void*>(object->map())); |
- } |
CALL_HEAP_FUNCTION( |
object->GetIsolate(), |
object->MigrateInstance(), |