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

Side by Side Diff: src/objects-printer.cc

Issue 760213005: Turn on DCHECKs and other debugging code if dcheck_always_on is 1 (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updaets Created 6 years 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 unified diff | Download patch
« no previous file with comments | « src/objects-inl.h ('k') | src/transitions.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/disasm.h" 7 #include "src/disasm.h"
8 #include "src/disassembler.h" 8 #include "src/disassembler.h"
9 #include "src/heap/objects-visiting.h" 9 #include "src/heap/objects-visiting.h"
10 #include "src/jsregexp.h" 10 #include "src/jsregexp.h"
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 os << " " << (i - 2) << ":" << Brief(p->get(i)); 339 os << " " << (i - 2) << ":" << Brief(p->get(i));
340 } 340 }
341 os << "\n context: " << Brief(p->get(0)) 341 os << "\n context: " << Brief(p->get(0))
342 << "\n arguments: " << Brief(p->get(1)) << "\n"; 342 << "\n arguments: " << Brief(p->get(1)) << "\n";
343 break; 343 break;
344 } 344 }
345 } 345 }
346 } 346 }
347 347
348 348
349 void JSObject::PrintTransitions(std::ostream& os) { // NOLINT
350 if (!map()->HasTransitionArray()) return;
351 map()->transitions()->PrintTransitions(os, false);
352 }
353
354
355 void JSObject::JSObjectPrint(std::ostream& os) { // NOLINT 349 void JSObject::JSObjectPrint(std::ostream& os) { // NOLINT
356 HeapObject::PrintHeader(os, "JSObject"); 350 HeapObject::PrintHeader(os, "JSObject");
357 // Don't call GetElementsKind, its validation code can cause the printer to 351 // Don't call GetElementsKind, its validation code can cause the printer to
358 // fail when debugging. 352 // fail when debugging.
359 PrototypeIterator iter(GetIsolate(), this); 353 PrototypeIterator iter(GetIsolate(), this);
360 os << " - map = " << reinterpret_cast<void*>(map()) << " [" 354 os << " - map = " << reinterpret_cast<void*>(map()) << " ["
361 << ElementsKindToString(this->map()->elements_kind()) 355 << ElementsKindToString(this->map()->elements_kind())
362 << "]\n - prototype = " << reinterpret_cast<void*>(iter.GetCurrent()) 356 << "]\n - prototype = " << reinterpret_cast<void*>(iter.GetCurrent())
363 << "\n {\n"; 357 << "\n {\n";
364 PrintProperties(os); 358 PrintProperties(os);
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 if (IsString()) { 579 if (IsString()) {
586 String::cast(this)->StringPrint(os); 580 String::cast(this)->StringPrint(os);
587 } else if (IsSymbol()) { 581 } else if (IsSymbol()) {
588 Symbol::cast(this)->name()->Print(os); 582 Symbol::cast(this)->name()->Print(os);
589 } else { 583 } else {
590 os << Brief(this); 584 os << Brief(this);
591 } 585 }
592 } 586 }
593 587
594 588
595 // This method is only meant to be called from gdb for debugging purposes.
596 // Since the string can also be in two-byte encoding, non-Latin1 characters
597 // will be ignored in the output.
598 char* String::ToAsciiArray() {
599 // Static so that subsequent calls frees previously allocated space.
600 // This also means that previous results will be overwritten.
601 static char* buffer = NULL;
602 if (buffer != NULL) delete[] buffer;
603 buffer = new char[length()+1];
604 WriteToFlat(this, reinterpret_cast<uint8_t*>(buffer), 0, length());
605 buffer[length()] = 0;
606 return buffer;
607 }
608
609
610 static const char* const weekdays[] = { 589 static const char* const weekdays[] = {
611 "???", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 590 "???", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
612 }; 591 };
613 592
614 593
615 void JSDate::JSDatePrint(std::ostream& os) { // NOLINT 594 void JSDate::JSDatePrint(std::ostream& os) { // NOLINT
616 HeapObject::PrintHeader(os, "JSDate"); 595 HeapObject::PrintHeader(os, "JSDate");
617 os << " - map = " << reinterpret_cast<void*>(map()) << "\n"; 596 os << " - map = " << reinterpret_cast<void*>(map()) << "\n";
618 os << " - value = "; 597 os << " - value = ";
619 value()->Print(os); 598 value()->Print(os);
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
1060 void BreakPointInfo::BreakPointInfoPrint(std::ostream& os) { // NOLINT 1039 void BreakPointInfo::BreakPointInfoPrint(std::ostream& os) { // NOLINT
1061 HeapObject::PrintHeader(os, "BreakPointInfo"); 1040 HeapObject::PrintHeader(os, "BreakPointInfo");
1062 os << "\n - code_position: " << code_position()->value(); 1041 os << "\n - code_position: " << code_position()->value();
1063 os << "\n - source_position: " << source_position()->value(); 1042 os << "\n - source_position: " << source_position()->value();
1064 os << "\n - statement_position: " << statement_position()->value(); 1043 os << "\n - statement_position: " << statement_position()->value();
1065 os << "\n - break_point_objects: " << Brief(break_point_objects()); 1044 os << "\n - break_point_objects: " << Brief(break_point_objects());
1066 os << "\n"; 1045 os << "\n";
1067 } 1046 }
1068 1047
1069 1048
1070 void DescriptorArray::Print() {
1071 OFStream os(stdout);
1072 this->PrintDescriptors(os);
1073 os << std::flush;
1074 }
1075
1076
1077 void DescriptorArray::PrintDescriptors(std::ostream& os) { // NOLINT
1078 HandleScope scope(GetIsolate());
1079 os << "Descriptor array " << number_of_descriptors() << "\n";
1080 for (int i = 0; i < number_of_descriptors(); i++) {
1081 Descriptor desc;
1082 Get(i, &desc);
1083 os << " " << i << ": " << desc << "\n";
1084 }
1085 os << "\n";
1086 }
1087
1088
1089 static void PrintBitMask(std::ostream& os, uint32_t value) { // NOLINT 1049 static void PrintBitMask(std::ostream& os, uint32_t value) { // NOLINT
1090 for (int i = 0; i < 32; i++) { 1050 for (int i = 0; i < 32; i++) {
1091 if ((i & 7) == 0) os << " "; 1051 if ((i & 7) == 0) os << " ";
1092 os << (((value & 1) == 0) ? "_" : "x"); 1052 os << (((value & 1) == 0) ? "_" : "x");
1093 value >>= 1; 1053 value >>= 1;
1094 } 1054 }
1095 } 1055 }
1096 1056
1097 1057
1098 void LayoutDescriptor::Print() { 1058 void LayoutDescriptor::Print() {
(...skipping 17 matching lines...) Expand all
1116 int len = length(); 1076 int len = length();
1117 for (int i = 0; i < len; i++) { 1077 for (int i = 0; i < len; i++) {
1118 if (i > 0) os << " |"; 1078 if (i > 0) os << " |";
1119 PrintBitMask(os, get_scalar(i)); 1079 PrintBitMask(os, get_scalar(i));
1120 } 1080 }
1121 } 1081 }
1122 os << "\n"; 1082 os << "\n";
1123 } 1083 }
1124 1084
1125 1085
1086 #endif // OBJECT_PRINT
1087
1088
1089 #if TRACE_MAPS
1090
1091
1092 void Name::NameShortPrint() {
1093 if (this->IsString()) {
1094 PrintF("%s", String::cast(this)->ToCString().get());
1095 } else {
1096 DCHECK(this->IsSymbol());
1097 Symbol* s = Symbol::cast(this);
1098 if (s->name()->IsUndefined()) {
1099 PrintF("#<%s>", s->PrivateSymbolToName());
1100 } else {
1101 PrintF("<%s>", String::cast(s->name())->ToCString().get());
1102 }
1103 }
1104 }
1105
1106
1107 int Name::NameShortPrint(Vector<char> str) {
1108 if (this->IsString()) {
1109 return SNPrintF(str, "%s", String::cast(this)->ToCString().get());
1110 } else {
1111 DCHECK(this->IsSymbol());
1112 Symbol* s = Symbol::cast(this);
1113 if (s->name()->IsUndefined()) {
1114 return SNPrintF(str, "#<%s>", s->PrivateSymbolToName());
1115 } else {
1116 return SNPrintF(str, "<%s>", String::cast(s->name())->ToCString().get());
1117 }
1118 }
1119 }
1120
1121
1122 #endif // TRACE_MAPS
1123
1124
1125 #ifdef DEBUG
1126 // This method is only meant to be called from gdb for debugging purposes.
1127 // Since the string can also be in two-byte encoding, non-Latin1 characters
1128 // will be ignored in the output.
1129 char* String::ToAsciiArray() {
1130 // Static so that subsequent calls frees previously allocated space.
1131 // This also means that previous results will be overwritten.
1132 static char* buffer = NULL;
1133 if (buffer != NULL) delete[] buffer;
1134 buffer = new char[length() + 1];
1135 WriteToFlat(this, reinterpret_cast<uint8_t*>(buffer), 0, length());
1136 buffer[length()] = 0;
1137 return buffer;
1138 }
1139
1140
1141 void DescriptorArray::Print() {
1142 OFStream os(stdout);
1143 this->PrintDescriptors(os);
1144 os << std::flush;
1145 }
1146
1147
1148 void DescriptorArray::PrintDescriptors(std::ostream& os) { // NOLINT
1149 HandleScope scope(GetIsolate());
1150 os << "Descriptor array " << number_of_descriptors() << "\n";
1151 for (int i = 0; i < number_of_descriptors(); i++) {
1152 Descriptor desc;
1153 Get(i, &desc);
1154 os << " " << i << ": " << desc << "\n";
1155 }
1156 os << "\n";
1157 }
1158
1159
1126 void TransitionArray::Print() { 1160 void TransitionArray::Print() {
1127 OFStream os(stdout); 1161 OFStream os(stdout);
1128 this->PrintTransitions(os); 1162 this->PrintTransitions(os);
1129 os << std::flush; 1163 os << std::flush;
1130 } 1164 }
1131 1165
1132 1166
1133 void TransitionArray::PrintTransitions(std::ostream& os, 1167 void TransitionArray::PrintTransitions(std::ostream& os,
1134 bool print_header) { // NOLINT 1168 bool print_header) { // NOLINT
1135 if (print_header) { 1169 if (print_header) {
1136 os << "Transition array " << number_of_transitions() << "\n"; 1170 os << "Transition array " << number_of_transitions() << "\n";
1137 } 1171 }
1138 for (int i = 0; i < number_of_transitions(); i++) { 1172 for (int i = 0; i < number_of_transitions(); i++) {
1139 Name* key = GetKey(i); 1173 Name* key = GetKey(i);
1140 os << " "; 1174 os << " ";
1175 #ifdef OBJECT_PRINT
1141 key->NamePrint(os); 1176 key->NamePrint(os);
1177 #else
1178 key->ShortPrint(os);
1179 #endif
1142 os << ": "; 1180 os << ": ";
1143 if (key == GetHeap()->frozen_symbol()) { 1181 if (key == GetHeap()->frozen_symbol()) {
1144 os << " (transition to frozen)"; 1182 os << " (transition to frozen)";
1145 } else if (key == GetHeap()->elements_transition_symbol()) { 1183 } else if (key == GetHeap()->elements_transition_symbol()) {
1146 os << " (transition to " 1184 os << " (transition to "
1147 << ElementsKindToString(GetTarget(i)->elements_kind()) << ")"; 1185 << ElementsKindToString(GetTarget(i)->elements_kind()) << ")";
1148 } else if (key == GetHeap()->observed_symbol()) { 1186 } else if (key == GetHeap()->observed_symbol()) {
1149 os << " (transition to Object.observe)"; 1187 os << " (transition to Object.observe)";
1150 } else { 1188 } else {
1151 PropertyDetails details = GetTargetDetails(i); 1189 PropertyDetails details = GetTargetDetails(i);
1152 switch (details.type()) { 1190 switch (details.type()) {
1153 case FIELD: { 1191 case FIELD: {
1154 os << " (transition to field)"; 1192 os << " (transition to field)";
1155 break; 1193 break;
1156 } 1194 }
1157 case CONSTANT: 1195 case CONSTANT:
1158 os << " (transition to constant " << Brief(GetTargetValue(i)) << ")"; 1196 os << " (transition to constant " << Brief(GetTargetValue(i)) << ")";
1159 break; 1197 break;
1160 case CALLBACKS: 1198 case CALLBACKS:
1161 os << " (transition to callback " << Brief(GetTargetValue(i)) << ")"; 1199 os << " (transition to callback " << Brief(GetTargetValue(i)) << ")";
1162 break; 1200 break;
1163 } 1201 }
1164 os << ", attrs: " << details.attributes(); 1202 os << ", attrs: " << details.attributes();
1165 } 1203 }
1166 os << " -> " << Brief(GetTarget(i)) << "\n"; 1204 os << " -> " << Brief(GetTarget(i)) << "\n";
1167 } 1205 }
1168 } 1206 }
1169 1207
1170 1208
1171 #endif // OBJECT_PRINT 1209 void JSObject::PrintTransitions(std::ostream& os) { // NOLINT
1172 1210 if (!map()->HasTransitionArray()) return;
1173 1211 map()->transitions()->PrintTransitions(os, false);
1174 #if TRACE_MAPS
1175
1176
1177 void Name::NameShortPrint() {
1178 if (this->IsString()) {
1179 PrintF("%s", String::cast(this)->ToCString().get());
1180 } else {
1181 DCHECK(this->IsSymbol());
1182 Symbol* s = Symbol::cast(this);
1183 if (s->name()->IsUndefined()) {
1184 PrintF("#<%s>", s->PrivateSymbolToName());
1185 } else {
1186 PrintF("<%s>", String::cast(s->name())->ToCString().get());
1187 }
1188 }
1189 } 1212 }
1190 1213 #endif // DEBUG
1191
1192 int Name::NameShortPrint(Vector<char> str) {
1193 if (this->IsString()) {
1194 return SNPrintF(str, "%s", String::cast(this)->ToCString().get());
1195 } else {
1196 DCHECK(this->IsSymbol());
1197 Symbol* s = Symbol::cast(this);
1198 if (s->name()->IsUndefined()) {
1199 return SNPrintF(str, "#<%s>", s->PrivateSymbolToName());
1200 } else {
1201 return SNPrintF(str, "<%s>", String::cast(s->name())->ToCString().get());
1202 }
1203 }
1204 }
1205
1206
1207 #endif // TRACE_MAPS
1208 } } // namespace v8::internal 1214 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects-inl.h ('k') | src/transitions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698