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

Unified Diff: src/objects.cc

Issue 8357004: Add flag to tracing element kind transitions (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: fix nits Created 9 years, 2 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/frames.cc ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index ee16ec42864a8f1b1ee042ea32c672b1959d8c1f..784fd23614fa73e5291d6cdd40910307c5f06922 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -713,6 +713,29 @@ Object* Object::GetPrototype() {
}
+void Object::MiniPrint() {
+ if (IsSmi()) {
+ PrintF("%d", Smi::cast(this)->value());
+ } else if (IsString() || IsSymbol()) {
+ String::cast(this)->MiniPrint();
+ } else if (IsNumber()) {
+ PrintF("%g", Number());
+ } else if (IsFailure()) {
+ PrintF("<failure>");
+ } else if (IsUndefined()) {
+ PrintF("<undefined>");
+ } else if (IsNull()) {
+ PrintF("<null>");
+ } else if (IsTrue()) {
+ PrintF("<true>");
+ } else if (IsFalse()) {
+ PrintF("<false>");
+ } else {
+ PrintF("%p", reinterpret_cast<void*>(this));
+ }
+}
+
+
void Object::ShortPrint(FILE* out) {
HeapStringAllocator allocator;
StringStream accumulator(&allocator);
@@ -946,6 +969,16 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) {
}
+void String::MiniPrint() {
+ // not uncommon to have empty strings
+ if (length() > 0) {
+ SmartArrayPointer<char> s =
+ ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
+ PrintF("%s", *s);
+ }
+}
+
+
void String::StringShortPrint(StringStream* accumulator) {
int len = length();
if (len > kMaxShortPrintLength) {
@@ -1087,6 +1120,25 @@ void JSObject::JSObjectShortPrint(StringStream* accumulator) {
}
+void JSObject::PrintElementsTransition(
+ FILE* file, ElementsKind from_kind, FixedArrayBase* from_elements,
+ ElementsKind to_kind, FixedArrayBase* to_elements) {
+ PrintF("elements transition [");
Jakob Kummerow 2011/10/19 16:02:28 It doesn't make a difference for the current usage
danno 2011/10/20 08:51:17 Done.
+ PrintElementsKind(file, from_kind);
+ PrintF(" -> ");
+ PrintElementsKind(file, to_kind);
+ PrintF("] in ");
+ JavaScriptFrame::PrintTop(false, true);
+ PrintF(" for ");
+ ShortPrint(file);
+ PrintF(" from ");
+ from_elements->ShortPrint(file);
+ PrintF(" to ");
+ to_elements->ShortPrint(file);
+ PrintF("\n");
+}
+
+
void HeapObject::HeapObjectShortPrint(StringStream* accumulator) {
Heap* heap = GetHeap();
if (!heap->Contains(this)) {
@@ -1115,6 +1167,10 @@ void HeapObject::HeapObjectShortPrint(StringStream* accumulator) {
case FIXED_ARRAY_TYPE:
accumulator->Add("<FixedArray[%u]>", FixedArray::cast(this)->length());
break;
+ case FIXED_DOUBLE_ARRAY_TYPE:
+ accumulator->Add("<FixedDoubleArray[%u]>",
+ FixedDoubleArray::cast(this)->length());
+ break;
case BYTE_ARRAY_TYPE:
accumulator->Add("<ByteArray[%u]>", ByteArray::cast(this)->length());
break;
@@ -7937,13 +7993,15 @@ MaybeObject* JSObject::SetFastElementsCapacityAndLength(
new_map = Map::cast(object);
}
+ FixedArrayBase* old_elements_raw = elements();
ElementsKind elements_kind = GetElementsKind();
switch (elements_kind) {
case FAST_SMI_ONLY_ELEMENTS:
case FAST_ELEMENTS: {
AssertNoAllocation no_gc;
WriteBarrierMode mode(new_elements->GetWriteBarrierMode(no_gc));
- CopyFastElementsToFast(FixedArray::cast(elements()), new_elements, mode);
+ CopyFastElementsToFast(FixedArray::cast(old_elements_raw),
+ new_elements, mode);
set_map(new_map);
set_elements(new_elements);
break;
@@ -7951,7 +8009,7 @@ MaybeObject* JSObject::SetFastElementsCapacityAndLength(
case DICTIONARY_ELEMENTS: {
AssertNoAllocation no_gc;
WriteBarrierMode mode = new_elements->GetWriteBarrierMode(no_gc);
- CopySlowElementsToFast(NumberDictionary::cast(elements()),
+ CopySlowElementsToFast(NumberDictionary::cast(old_elements_raw),
new_elements,
mode);
set_map(new_map);
@@ -7963,7 +8021,7 @@ MaybeObject* JSObject::SetFastElementsCapacityAndLength(
WriteBarrierMode mode = new_elements->GetWriteBarrierMode(no_gc);
// The object's map and the parameter map are unchanged, the unaliased
// arguments are copied to the new backing store.
- FixedArray* parameter_map = FixedArray::cast(elements());
+ FixedArray* parameter_map = FixedArray::cast(old_elements_raw);
FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
if (arguments->IsDictionary()) {
CopySlowElementsToFast(NumberDictionary::cast(arguments),
@@ -7976,7 +8034,7 @@ MaybeObject* JSObject::SetFastElementsCapacityAndLength(
break;
}
case FAST_DOUBLE_ELEMENTS: {
- FixedDoubleArray* old_elements = FixedDoubleArray::cast(elements());
+ FixedDoubleArray* old_elements = FixedDoubleArray::cast(old_elements_raw);
uint32_t old_length = static_cast<uint32_t>(old_elements->length());
// Fill out the new array with this content and array holes.
for (uint32_t i = 0; i < old_length; i++) {
@@ -8014,6 +8072,11 @@ MaybeObject* JSObject::SetFastElementsCapacityAndLength(
break;
}
+ if (FLAG_trace_element_transitions) {
+ PrintElementsTransition(stdout, elements_kind, old_elements_raw,
+ FAST_ELEMENTS, new_elements);
+ }
+
// Update the length if necessary.
if (IsJSArray()) {
JSArray::cast(this)->set_length(Smi::FromInt(length));
@@ -8043,19 +8106,21 @@ MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength(
}
Map* new_map = Map::cast(obj);
+ FixedArrayBase* old_elements = elements();
+ ElementsKind elements_kind(GetElementsKind());
Jakob Kummerow 2011/10/19 16:02:28 nit: for consistency with line 8156: ElementsKind
AssertNoAllocation no_gc;
- switch (GetElementsKind()) {
+ switch (elements_kind) {
case FAST_SMI_ONLY_ELEMENTS:
case FAST_ELEMENTS: {
- elems->Initialize(FixedArray::cast(elements()));
+ elems->Initialize(FixedArray::cast(old_elements));
break;
}
case FAST_DOUBLE_ELEMENTS: {
- elems->Initialize(FixedDoubleArray::cast(elements()));
+ elems->Initialize(FixedDoubleArray::cast(old_elements));
break;
}
case DICTIONARY_ELEMENTS: {
- elems->Initialize(NumberDictionary::cast(elements()));
+ elems->Initialize(NumberDictionary::cast(old_elements));
break;
}
default:
@@ -8063,6 +8128,11 @@ MaybeObject* JSObject::SetFastDoubleElementsCapacityAndLength(
break;
}
+ if (FLAG_trace_element_transitions) {
+ PrintElementsTransition(stdout, elements_kind, old_elements,
+ FAST_DOUBLE_ELEMENTS, elems);
+ }
+
ASSERT(new_map->has_fast_double_elements());
set_map(new_map);
ASSERT(elems->IsFixedDoubleArray());
@@ -8082,13 +8152,14 @@ MaybeObject* JSObject::SetSlowElements(Object* len) {
uint32_t new_length = static_cast<uint32_t>(len->Number());
- switch (GetElementsKind()) {
+ FixedArrayBase* old_elements = elements();
+ ElementsKind elements_kind = GetElementsKind();
+ switch (elements_kind) {
case FAST_SMI_ONLY_ELEMENTS:
case FAST_ELEMENTS:
case FAST_DOUBLE_ELEMENTS: {
// Make sure we never try to shrink dense arrays into sparse arrays.
- ASSERT(static_cast<uint32_t>(
- FixedArrayBase::cast(elements())->length()) <= new_length);
+ ASSERT(static_cast<uint32_t>(old_elements->length()) <= new_length);
MaybeObject* result = NormalizeElements();
if (result->IsFailure()) return result;
@@ -8120,6 +8191,12 @@ MaybeObject* JSObject::SetSlowElements(Object* len) {
UNREACHABLE();
break;
}
+
+ if (FLAG_trace_element_transitions) {
+ PrintElementsTransition(stdout, elements_kind, old_elements,
+ DICTIONARY_ELEMENTS, elements());
+ }
+
return this;
}
« src/frames.cc ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698