Index: src/objects-printer.cc |
diff --git a/src/objects-printer.cc b/src/objects-printer.cc |
index efc97a4766ef009a8f62d0333a3c4fb3a86f8bee..576625bf82d109f0e1b8d79e1da5912430a67c2f 100644 |
--- a/src/objects-printer.cc |
+++ b/src/objects-printer.cc |
@@ -95,9 +95,11 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT |
case JS_CONTEXT_EXTENSION_OBJECT_TYPE: |
case JS_ARRAY_TYPE: |
case JS_GENERATOR_OBJECT_TYPE: |
- case JS_REGEXP_TYPE: |
JSObject::cast(this)->JSObjectPrint(os); |
break; |
+ case JS_REGEXP_TYPE: |
+ JSRegExp::cast(this)->JSRegExpPrint(os); |
+ break; |
case ODDBALL_TYPE: |
Oddball::cast(this)->to_string()->Print(os); |
break; |
@@ -269,7 +271,7 @@ void JSObject::PrintProperties(std::ostream& os) { // NOLINT |
if (HasFastProperties()) { |
DescriptorArray* descs = map()->instance_descriptors(); |
for (int i = 0; i < map()->NumberOfOwnDescriptors(); i++) { |
- os << " "; |
+ os << "\n "; |
descs->GetKey(i)->NamePrint(os); |
os << ": "; |
switch (descs->GetType(i)) { |
@@ -280,20 +282,19 @@ void JSObject::PrintProperties(std::ostream& os) { // NOLINT |
} else { |
os << Brief(RawFastPropertyAt(index)); |
} |
- os << " (data field at offset " << index.property_index() << ")\n"; |
+ os << " (data field at offset " << index.property_index() << ")"; |
break; |
} |
case ACCESSOR: { |
FieldIndex index = FieldIndex::ForDescriptor(map(), i); |
- os << " (accessor field at offset " << index.property_index() |
- << ")\n"; |
+ os << " (accessor field at offset " << index.property_index() << ")"; |
break; |
} |
case DATA_CONSTANT: |
- os << Brief(descs->GetConstant(i)) << " (data constant)\n"; |
+ os << Brief(descs->GetConstant(i)) << " (data constant)"; |
break; |
case ACCESSOR_CONSTANT: |
- os << Brief(descs->GetCallbacksObject(i)) << " (accessor constant)\n"; |
+ os << Brief(descs->GetCallbacksObject(i)) << " (accessor constant)"; |
break; |
} |
} |
@@ -309,7 +310,7 @@ template <class T> |
static void DoPrintElements(std::ostream& os, Object* object) { // NOLINT |
T* p = T::cast(object); |
for (int i = 0; i < p->length(); i++) { |
- os << " " << i << ": " << p->get_scalar(i) << "\n"; |
+ os << "\n " << i << ": " << p->get_scalar(i); |
} |
} |
@@ -325,7 +326,7 @@ void JSObject::PrintElements(std::ostream& os) { // NOLINT |
// Print in array notation for non-sparse arrays. |
FixedArray* p = FixedArray::cast(elements()); |
for (int i = 0; i < p->length(); i++) { |
- os << " " << i << ": " << Brief(p->get(i)) << "\n"; |
+ os << "\n " << i << ": " << Brief(p->get(i)); |
} |
break; |
} |
@@ -335,13 +336,12 @@ void JSObject::PrintElements(std::ostream& os) { // NOLINT |
if (elements()->length() > 0) { |
FixedDoubleArray* p = FixedDoubleArray::cast(elements()); |
for (int i = 0; i < p->length(); i++) { |
- os << " " << i << ": "; |
+ os << "\n " << i << ": "; |
if (p->is_the_hole(i)) { |
os << "<the hole>"; |
} else { |
os << p->get_scalar(i); |
} |
- os << "\n"; |
} |
} |
break; |
@@ -372,12 +372,12 @@ void JSObject::PrintElements(std::ostream& os) { // NOLINT |
case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: { |
FixedArray* p = FixedArray::cast(elements()); |
- os << " parameter map:"; |
+ os << "\n parameter map:"; |
for (int i = 2; i < p->length(); i++) { |
os << " " << (i - 2) << ":" << Brief(p->get(i)); |
} |
os << "\n context: " << Brief(p->get(0)) |
- << "\n arguments: " << Brief(p->get(1)) << "\n"; |
+ << "\n arguments: " << Brief(p->get(1)); |
break; |
} |
} |
@@ -396,12 +396,13 @@ static void JSObjectPrintHeader(std::ostream& os, JSObject* obj, |
} |
-static void JSObjectPrintBody(std::ostream& os, JSObject* obj) { // NOLINT |
- os << "\n {\n"; |
+static void JSObjectPrintBody(std::ostream& os, JSObject* obj, // NOLINT |
+ bool print_elements = true) { |
+ os << "\n {"; |
obj->PrintProperties(os); |
obj->PrintTransitions(os); |
- obj->PrintElements(os); |
- os << " }\n"; |
+ if (print_elements) obj->PrintElements(os); |
+ os << "\n }\n"; |
} |
@@ -411,16 +412,18 @@ void JSObject::JSObjectPrint(std::ostream& os) { // NOLINT |
} |
+void JSRegExp::JSRegExpPrint(std::ostream& os) { // NOLINT |
+ JSObjectPrintHeader(os, this, "JSRegExp"); |
+ os << "\n - data = " << Brief(data()); |
+ JSObjectPrintBody(os, this); |
+} |
+ |
+ |
void JSModule::JSModulePrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSModule"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n" |
- << " - context = "; |
- context()->Print(os); |
- os << " - scope_info = " << Brief(scope_info()) |
- << ElementsKindToString(this->map()->elements_kind()) << " {\n"; |
- PrintProperties(os); |
- PrintElements(os); |
- os << " }\n"; |
+ JSObjectPrintHeader(os, this, "JSModule"); |
+ os << "\n - context = " << Brief(context()); |
+ os << " - scope_info = " << Brief(scope_info()); |
+ JSObjectPrintBody(os, this); |
} |
@@ -481,9 +484,11 @@ void Map::MapPrint(std::ostream& os) { // NOLINT |
if (FLAG_unbox_double_fields) { |
os << "\n - layout descriptor: " << Brief(layout_descriptor()); |
} |
- if (TransitionArray::NumberOfTransitions(raw_transitions()) > 0) { |
- os << "\n - transitions: "; |
- TransitionArray::PrintTransitions(os, raw_transitions()); |
+ int nof_transitions = TransitionArray::NumberOfTransitions(raw_transitions()); |
+ if (nof_transitions > 0) { |
+ os << "\n - transitions #" << nof_transitions << ": " |
+ << Brief(raw_transitions()); |
+ TransitionArray::PrintTransitions(os, raw_transitions(), false); |
} |
os << "\n - prototype: " << Brief(prototype()); |
os << "\n - constructor: " << Brief(GetConstructor()); |
@@ -704,17 +709,15 @@ static const char* const weekdays[] = { |
void JSDate::JSDatePrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSDate"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - value = "; |
- value()->Print(os); |
+ JSObjectPrintHeader(os, this, "JSDate"); |
+ os << "\n - value = " << Brief(value()); |
if (!year()->IsSmi()) { |
- os << " - time = NaN\n"; |
+ os << "\n - time = NaN\n"; |
} else { |
// TODO(svenpanne) Add some basic formatting to our streams. |
ScopedVector<char> buf(100); |
SNPrintF( |
- buf, " - time = %s %04d/%02d/%02d %02d:%02d:%02d\n", |
+ buf, "\n - time = %s %04d/%02d/%02d %02d:%02d:%02d\n", |
weekdays[weekday()->IsSmi() ? Smi::cast(weekday())->value() + 1 : 0], |
year()->IsSmi() ? Smi::cast(year())->value() : -1, |
month()->IsSmi() ? Smi::cast(month())->value() : -1, |
@@ -724,6 +727,7 @@ void JSDate::JSDatePrint(std::ostream& os) { // NOLINT |
sec()->IsSmi() ? Smi::cast(sec())->value() : -1); |
os << buf.start(); |
} |
+ JSObjectPrintBody(os, this); |
} |
@@ -752,18 +756,16 @@ void JSFunctionProxy::JSFunctionProxyPrint(std::ostream& os) { // NOLINT |
void JSSet::JSSetPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSSet"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
+ JSObjectPrintHeader(os, this, "JSSet"); |
os << " - table = " << Brief(table()); |
- os << "\n"; |
+ JSObjectPrintBody(os, this); |
} |
void JSMap::JSMapPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSMap"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
+ JSObjectPrintHeader(os, this, "JSMap"); |
os << " - table = " << Brief(table()); |
- os << "\n"; |
+ JSObjectPrintBody(os, this); |
} |
@@ -771,8 +773,7 @@ template <class Derived, class TableType> |
void |
OrderedHashTableIterator<Derived, TableType>::OrderedHashTableIteratorPrint( |
std::ostream& os) { // NOLINT |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - table = " << Brief(table()); |
+ os << "\n - table = " << Brief(table()); |
os << "\n - index = " << Brief(index()); |
os << "\n - kind = " << Brief(kind()); |
os << "\n"; |
@@ -790,80 +791,72 @@ template void OrderedHashTableIterator< |
void JSSetIterator::JSSetIteratorPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSSetIterator"); |
+ JSObjectPrintHeader(os, this, "JSSetIterator"); |
OrderedHashTableIteratorPrint(os); |
} |
void JSMapIterator::JSMapIteratorPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSMapIterator"); |
+ JSObjectPrintHeader(os, this, "JSMapIterator"); |
OrderedHashTableIteratorPrint(os); |
} |
void JSIteratorResult::JSIteratorResultPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSIteratorResult"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - done = " << Brief(done()) << "\n"; |
- os << " - value = " << Brief(value()) << "\n"; |
+ JSObjectPrintHeader(os, this, "JSIteratorResult"); |
+ os << "\n - done = " << Brief(done()); |
+ os << "\n - value = " << Brief(value()); |
os << "\n"; |
} |
void JSWeakMap::JSWeakMapPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSWeakMap"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - table = " << Brief(table()); |
- os << "\n"; |
+ JSObjectPrintHeader(os, this, "JSWeakMap"); |
+ os << "\n - table = " << Brief(table()); |
+ JSObjectPrintBody(os, this); |
} |
void JSWeakSet::JSWeakSetPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSWeakSet"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - table = " << Brief(table()); |
- os << "\n"; |
+ JSObjectPrintHeader(os, this, "JSWeakSet"); |
+ os << "\n - table = " << Brief(table()); |
+ JSObjectPrintBody(os, this); |
} |
void JSArrayBuffer::JSArrayBufferPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSArrayBuffer"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - backing_store = " << backing_store() << "\n"; |
- os << " - byte_length = " << Brief(byte_length()); |
+ JSObjectPrintHeader(os, this, "JSArrayBuffer"); |
+ os << "\n - backing_store = " << backing_store(); |
+ os << "\n - byte_length = " << Brief(byte_length()); |
if (was_neutered()) os << " - neutered\n"; |
- os << "\n"; |
+ JSObjectPrintBody(os, this, !was_neutered()); |
} |
void JSTypedArray::JSTypedArrayPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSTypedArray"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - buffer = " << Brief(buffer()); |
+ JSObjectPrintHeader(os, this, "JSTypedArray"); |
+ os << "\n - buffer = " << Brief(buffer()); |
os << "\n - byte_offset = " << Brief(byte_offset()); |
os << "\n - byte_length = " << Brief(byte_length()); |
os << "\n - length = " << Brief(length()); |
if (WasNeutered()) os << " - neutered\n"; |
- os << "\n"; |
- if (!WasNeutered()) PrintElements(os); |
+ JSObjectPrintBody(os, this, !WasNeutered()); |
} |
void JSDataView::JSDataViewPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "JSDataView"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - buffer =" << Brief(buffer()); |
+ JSObjectPrintHeader(os, this, "JSDataView"); |
+ os << "\n - buffer =" << Brief(buffer()); |
os << "\n - byte_offset = " << Brief(byte_offset()); |
os << "\n - byte_length = " << Brief(byte_length()); |
if (WasNeutered()) os << " - neutered\n"; |
- os << "\n"; |
+ JSObjectPrintBody(os, this, !WasNeutered()); |
} |
void JSFunction::JSFunctionPrint(std::ostream& os) { // NOLINT |
- HeapObject::PrintHeader(os, "Function"); |
- os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; |
- os << " - initial_map = "; |
+ JSObjectPrintHeader(os, this, "Function"); |
+ os << "\n - initial_map = "; |
if (has_initial_map()) os << Brief(initial_map()); |
os << "\n - shared_info = " << Brief(shared()); |
os << "\n - name = " << Brief(shared()->name()); |
@@ -874,10 +867,7 @@ void JSFunction::JSFunctionPrint(std::ostream& os) { // NOLINT |
os << "\n - literals = " << Brief(literals()); |
} |
os << "\n - code = " << Brief(code()); |
- os << "\n"; |
- PrintProperties(os); |
- PrintElements(os); |
- os << "\n"; |
+ JSObjectPrintBody(os, this); |
} |
@@ -935,11 +925,16 @@ void JSGlobalObject::JSGlobalObjectPrint(std::ostream& os) { // NOLINT |
void Cell::CellPrint(std::ostream& os) { // NOLINT |
HeapObject::PrintHeader(os, "Cell"); |
+ os << " - value: " << Brief(value()); |
+ os << "\n"; |
} |
void PropertyCell::PropertyCellPrint(std::ostream& os) { // NOLINT |
HeapObject::PrintHeader(os, "PropertyCell"); |
+ os << " - value: " << Brief(value()); |
+ os << "\n - details: " << property_details(); |
+ os << "\n"; |
} |
@@ -950,6 +945,7 @@ void WeakCell::WeakCellPrint(std::ostream& os) { // NOLINT |
} else { |
os << "\n - value: " << Brief(value()); |
} |
+ os << "\n"; |
} |
@@ -965,6 +961,7 @@ void Code::CodePrint(std::ostream& os) { // NOLINT |
void Foreign::ForeignPrint(std::ostream& os) { // NOLINT |
os << "foreign address : " << foreign_address(); |
+ os << "\n"; |
} |
@@ -1261,11 +1258,11 @@ void DescriptorArray::Print() { |
void DescriptorArray::PrintDescriptors(std::ostream& os) { // NOLINT |
HandleScope scope(GetIsolate()); |
- os << "Descriptor array " << number_of_descriptors() << "\n"; |
+ os << "Descriptor array #" << number_of_descriptors(); |
for (int i = 0; i < number_of_descriptors(); i++) { |
Descriptor desc; |
Get(i, &desc); |
- os << " " << i << ": " << desc << "\n"; |
+ os << "\n " << i << ": " << desc; |
} |
os << "\n"; |
} |
@@ -1274,7 +1271,7 @@ void DescriptorArray::PrintDescriptors(std::ostream& os) { // NOLINT |
void TransitionArray::Print() { |
OFStream os(stdout); |
TransitionArray::PrintTransitions(os, this); |
- os << std::flush; |
+ os << "\n" << std::flush; |
} |
@@ -1282,12 +1279,12 @@ void TransitionArray::PrintTransitions(std::ostream& os, Object* transitions, |
bool print_header) { // NOLINT |
int num_transitions = NumberOfTransitions(transitions); |
if (print_header) { |
- os << "Transition array " << num_transitions << "\n"; |
+ os << "Transition array #" << num_transitions << ":"; |
} |
for (int i = 0; i < num_transitions; i++) { |
Name* key = GetKey(transitions, i); |
Map* target = GetTarget(transitions, i); |
- os << " "; |
+ os << "\n "; |
#ifdef OBJECT_PRINT |
key->NamePrint(os); |
#else |
@@ -1296,19 +1293,19 @@ void TransitionArray::PrintTransitions(std::ostream& os, Object* transitions, |
os << ": "; |
Heap* heap = key->GetHeap(); |
if (key == heap->nonextensible_symbol()) { |
- os << " (transition to non-extensible)"; |
+ os << "(transition to non-extensible)"; |
} else if (key == heap->sealed_symbol()) { |
- os << " (transition to sealed)"; |
+ os << "(transition to sealed)"; |
} else if (key == heap->frozen_symbol()) { |
- os << " (transition to frozen)"; |
+ os << "(transition to frozen)"; |
} else if (key == heap->elements_transition_symbol()) { |
- os << " (transition to " << ElementsKindToString(target->elements_kind()) |
+ os << "(transition to " << ElementsKindToString(target->elements_kind()) |
<< ")"; |
} else if (key == heap->observed_symbol()) { |
os << " (transition to Object.observe)"; |
} else { |
PropertyDetails details = GetTargetDetails(key, target); |
- os << " (transition to "; |
+ os << "(transition to "; |
if (details.location() == kDescriptor) { |
os << "immutable "; |
} |
@@ -1320,13 +1317,17 @@ void TransitionArray::PrintTransitions(std::ostream& os, Object* transitions, |
} |
os << "), attrs: " << details.attributes(); |
} |
- os << " -> " << Brief(target) << "\n"; |
+ os << " -> " << Brief(target); |
} |
} |
void JSObject::PrintTransitions(std::ostream& os) { // NOLINT |
- TransitionArray::PrintTransitions(os, map()->raw_transitions()); |
+ Object* transitions = map()->raw_transitions(); |
+ int num_transitions = TransitionArray::NumberOfTransitions(transitions); |
+ if (num_transitions == 0) return; |
+ os << "\n - transitions"; |
+ TransitionArray::PrintTransitions(os, transitions, false); |
} |
#endif // defined(DEBUG) || defined(OBJECT_PRINT) |
} // namespace internal |