| OLD | NEW |
| 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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 os << "\n context: " << Brief(p->get(0)) | 340 os << "\n context: " << Brief(p->get(0)) |
| 341 << "\n arguments: " << Brief(p->get(1)) << "\n"; | 341 << "\n arguments: " << Brief(p->get(1)) << "\n"; |
| 342 break; | 342 break; |
| 343 } | 343 } |
| 344 } | 344 } |
| 345 } | 345 } |
| 346 | 346 |
| 347 | 347 |
| 348 void JSObject::PrintTransitions(std::ostream& os) { // NOLINT | 348 void JSObject::PrintTransitions(std::ostream& os) { // NOLINT |
| 349 if (!map()->HasTransitionArray()) return; | 349 if (!map()->HasTransitionArray()) return; |
| 350 TransitionArray* transitions = map()->transitions(); | 350 map()->transitions()->PrintTransitions(os, false); |
| 351 for (int i = 0; i < transitions->number_of_transitions(); i++) { | |
| 352 Name* key = transitions->GetKey(i); | |
| 353 os << " "; | |
| 354 key->NamePrint(os); | |
| 355 os << ": "; | |
| 356 if (key == GetHeap()->frozen_symbol()) { | |
| 357 os << " (transition to frozen)\n"; | |
| 358 } else if (key == GetHeap()->elements_transition_symbol()) { | |
| 359 os << " (transition to " | |
| 360 << ElementsKindToString(transitions->GetTarget(i)->elements_kind()) | |
| 361 << ")\n"; | |
| 362 } else if (key == GetHeap()->observed_symbol()) { | |
| 363 os << " (transition to Object.observe)\n"; | |
| 364 } else { | |
| 365 switch (transitions->GetTargetDetails(i).type()) { | |
| 366 case FIELD: { | |
| 367 os << " (transition to field)\n"; | |
| 368 break; | |
| 369 } | |
| 370 case CONSTANT: | |
| 371 os << " (transition to constant)\n"; | |
| 372 break; | |
| 373 case CALLBACKS: | |
| 374 os << " (transition to callback)\n"; | |
| 375 break; | |
| 376 // Values below are never in the target descriptor array. | |
| 377 case NORMAL: | |
| 378 UNREACHABLE(); | |
| 379 break; | |
| 380 } | |
| 381 } | |
| 382 } | |
| 383 } | 351 } |
| 384 | 352 |
| 385 | 353 |
| 386 void JSObject::JSObjectPrint(std::ostream& os) { // NOLINT | 354 void JSObject::JSObjectPrint(std::ostream& os) { // NOLINT |
| 387 HeapObject::PrintHeader(os, "JSObject"); | 355 HeapObject::PrintHeader(os, "JSObject"); |
| 388 // Don't call GetElementsKind, its validation code can cause the printer to | 356 // Don't call GetElementsKind, its validation code can cause the printer to |
| 389 // fail when debugging. | 357 // fail when debugging. |
| 390 PrototypeIterator iter(GetIsolate(), this); | 358 PrototypeIterator iter(GetIsolate(), this); |
| 391 os << " - map = " << reinterpret_cast<void*>(map()) << " [" | 359 os << " - map = " << reinterpret_cast<void*>(map()) << " [" |
| 392 << ElementsKindToString(this->map()->elements_kind()) | 360 << ElementsKindToString(this->map()->elements_kind()) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 | 403 |
| 436 void Map::MapPrint(std::ostream& os) { // NOLINT | 404 void Map::MapPrint(std::ostream& os) { // NOLINT |
| 437 HeapObject::PrintHeader(os, "Map"); | 405 HeapObject::PrintHeader(os, "Map"); |
| 438 os << " - type: " << TypeToString(instance_type()) << "\n"; | 406 os << " - type: " << TypeToString(instance_type()) << "\n"; |
| 439 os << " - instance size: " << instance_size() << "\n"; | 407 os << " - instance size: " << instance_size() << "\n"; |
| 440 os << " - inobject properties: " << inobject_properties() << "\n"; | 408 os << " - inobject properties: " << inobject_properties() << "\n"; |
| 441 os << " - elements kind: " << ElementsKindToString(elements_kind()); | 409 os << " - elements kind: " << ElementsKindToString(elements_kind()); |
| 442 os << "\n - pre-allocated property fields: " | 410 os << "\n - pre-allocated property fields: " |
| 443 << pre_allocated_property_fields() << "\n"; | 411 << pre_allocated_property_fields() << "\n"; |
| 444 os << " - unused property fields: " << unused_property_fields() << "\n"; | 412 os << " - unused property fields: " << unused_property_fields() << "\n"; |
| 413 if (is_dictionary_map()) os << " - dictionary_map\n"; |
| 414 if (is_prototype_map()) os << " - prototype_map\n"; |
| 445 if (is_hidden_prototype()) os << " - hidden_prototype\n"; | 415 if (is_hidden_prototype()) os << " - hidden_prototype\n"; |
| 446 if (has_named_interceptor()) os << " - named_interceptor\n"; | 416 if (has_named_interceptor()) os << " - named_interceptor\n"; |
| 447 if (has_indexed_interceptor()) os << " - indexed_interceptor\n"; | 417 if (has_indexed_interceptor()) os << " - indexed_interceptor\n"; |
| 448 if (is_undetectable()) os << " - undetectable\n"; | 418 if (is_undetectable()) os << " - undetectable\n"; |
| 449 if (has_instance_call_handler()) os << " - instance_call_handler\n"; | 419 if (has_instance_call_handler()) os << " - instance_call_handler\n"; |
| 450 if (is_access_check_needed()) os << " - access_check_needed\n"; | 420 if (is_access_check_needed()) os << " - access_check_needed\n"; |
| 451 if (is_frozen()) { | 421 if (is_frozen()) { |
| 452 os << " - frozen\n"; | 422 os << " - frozen\n"; |
| 453 } else if (!is_extensible()) { | 423 } else if (!is_extensible()) { |
| 454 os << " - sealed\n"; | 424 os << " - sealed\n"; |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 } | 568 } |
| 599 if (len != length()) { | 569 if (len != length()) { |
| 600 os << truncated_epilogue; | 570 os << truncated_epilogue; |
| 601 } | 571 } |
| 602 | 572 |
| 603 if (!StringShape(this).IsInternalized()) os << "\""; | 573 if (!StringShape(this).IsInternalized()) os << "\""; |
| 604 } | 574 } |
| 605 | 575 |
| 606 | 576 |
| 607 void Name::NamePrint(std::ostream& os) { // NOLINT | 577 void Name::NamePrint(std::ostream& os) { // NOLINT |
| 608 if (IsString()) | 578 if (IsString()) { |
| 609 String::cast(this)->StringPrint(os); | 579 String::cast(this)->StringPrint(os); |
| 610 else | 580 } else if (IsSymbol()) { |
| 581 Symbol::cast(this)->name()->Print(os); |
| 582 } else { |
| 611 os << Brief(this); | 583 os << Brief(this); |
| 584 } |
| 612 } | 585 } |
| 613 | 586 |
| 614 | 587 |
| 615 // This method is only meant to be called from gdb for debugging purposes. | 588 // This method is only meant to be called from gdb for debugging purposes. |
| 616 // Since the string can also be in two-byte encoding, non-Latin1 characters | 589 // Since the string can also be in two-byte encoding, non-Latin1 characters |
| 617 // will be ignored in the output. | 590 // will be ignored in the output. |
| 618 char* String::ToAsciiArray() { | 591 char* String::ToAsciiArray() { |
| 619 // Static so that subsequent calls frees previously allocated space. | 592 // Static so that subsequent calls frees previously allocated space. |
| 620 // This also means that previous results will be overwritten. | 593 // This also means that previous results will be overwritten. |
| 621 static char* buffer = NULL; | 594 static char* buffer = NULL; |
| (...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1075 void BreakPointInfo::BreakPointInfoPrint(std::ostream& os) { // NOLINT | 1048 void BreakPointInfo::BreakPointInfoPrint(std::ostream& os) { // NOLINT |
| 1076 HeapObject::PrintHeader(os, "BreakPointInfo"); | 1049 HeapObject::PrintHeader(os, "BreakPointInfo"); |
| 1077 os << "\n - code_position: " << code_position()->value(); | 1050 os << "\n - code_position: " << code_position()->value(); |
| 1078 os << "\n - source_position: " << source_position()->value(); | 1051 os << "\n - source_position: " << source_position()->value(); |
| 1079 os << "\n - statement_position: " << statement_position()->value(); | 1052 os << "\n - statement_position: " << statement_position()->value(); |
| 1080 os << "\n - break_point_objects: " << Brief(break_point_objects()); | 1053 os << "\n - break_point_objects: " << Brief(break_point_objects()); |
| 1081 os << "\n"; | 1054 os << "\n"; |
| 1082 } | 1055 } |
| 1083 | 1056 |
| 1084 | 1057 |
| 1058 void DescriptorArray::Print() { |
| 1059 OFStream os(stdout); |
| 1060 this->PrintDescriptors(os); |
| 1061 os << std::flush; |
| 1062 } |
| 1063 |
| 1064 |
| 1085 void DescriptorArray::PrintDescriptors(std::ostream& os) { // NOLINT | 1065 void DescriptorArray::PrintDescriptors(std::ostream& os) { // NOLINT |
| 1086 os << "Descriptor array " << number_of_descriptors() << "\n"; | 1066 os << "Descriptor array " << number_of_descriptors() << "\n"; |
| 1087 for (int i = 0; i < number_of_descriptors(); i++) { | 1067 for (int i = 0; i < number_of_descriptors(); i++) { |
| 1088 Descriptor desc; | 1068 Descriptor desc; |
| 1089 Get(i, &desc); | 1069 Get(i, &desc); |
| 1090 os << " " << i << ": " << desc; | 1070 os << " " << i << ": " << desc << "\n"; |
| 1091 } | 1071 } |
| 1092 os << "\n"; | 1072 os << "\n"; |
| 1093 } | 1073 } |
| 1094 | 1074 |
| 1095 | 1075 |
| 1096 void TransitionArray::PrintTransitions(std::ostream& os) { // NOLINT | 1076 void TransitionArray::Print() { |
| 1097 os << "Transition array %d\n", number_of_transitions(); | 1077 OFStream os(stdout); |
| 1098 for (int i = 0; i < number_of_transitions(); i++) { | 1078 this->PrintTransitions(os); |
| 1099 os << " " << i << ": "; | 1079 os << std::flush; |
| 1100 GetKey(i)->NamePrint(os); | |
| 1101 os << ": "; | |
| 1102 switch (GetTargetDetails(i).type()) { | |
| 1103 case FIELD: { | |
| 1104 os << " (transition to field)\n"; | |
| 1105 break; | |
| 1106 } | |
| 1107 case CONSTANT: | |
| 1108 os << " (transition to constant)\n"; | |
| 1109 break; | |
| 1110 case CALLBACKS: | |
| 1111 os << " (transition to callback)\n"; | |
| 1112 break; | |
| 1113 // Values below are never in the target descriptor array. | |
| 1114 case NORMAL: | |
| 1115 UNREACHABLE(); | |
| 1116 break; | |
| 1117 } | |
| 1118 } | |
| 1119 os << "\n"; | |
| 1120 } | 1080 } |
| 1121 | 1081 |
| 1122 | 1082 |
| 1083 void TransitionArray::PrintTransitions(std::ostream& os, |
| 1084 bool print_header) { // NOLINT |
| 1085 if (print_header) { |
| 1086 os << "Transition array " << number_of_transitions() << "\n"; |
| 1087 } |
| 1088 for (int i = 0; i < number_of_transitions(); i++) { |
| 1089 Name* key = GetKey(i); |
| 1090 os << " "; |
| 1091 key->NamePrint(os); |
| 1092 os << ": "; |
| 1093 if (key == GetHeap()->frozen_symbol()) { |
| 1094 os << " (transition to frozen)"; |
| 1095 } else if (key == GetHeap()->elements_transition_symbol()) { |
| 1096 os << " (transition to " |
| 1097 << ElementsKindToString(GetTarget(i)->elements_kind()) << ")"; |
| 1098 } else if (key == GetHeap()->observed_symbol()) { |
| 1099 os << " (transition to Object.observe)"; |
| 1100 } else { |
| 1101 PropertyDetails details = GetTargetDetails(i); |
| 1102 switch (details.type()) { |
| 1103 case FIELD: { |
| 1104 os << " (transition to field)"; |
| 1105 break; |
| 1106 } |
| 1107 case CONSTANT: |
| 1108 os << " (transition to constant " << Brief(GetTargetValue(i)) << ")"; |
| 1109 break; |
| 1110 case CALLBACKS: |
| 1111 os << " (transition to callback " << Brief(GetTargetValue(i)) << ")"; |
| 1112 break; |
| 1113 // Values below are never in the target descriptor array. |
| 1114 case NORMAL: |
| 1115 UNREACHABLE(); |
| 1116 break; |
| 1117 } |
| 1118 os << ", attrs: " << details.attributes(); |
| 1119 } |
| 1120 os << " -> " << Brief(GetTarget(i)) << "\n"; |
| 1121 } |
| 1122 } |
| 1123 |
| 1124 |
| 1123 #endif // OBJECT_PRINT | 1125 #endif // OBJECT_PRINT |
| 1124 | 1126 |
| 1125 | 1127 |
| 1126 } } // namespace v8::internal | 1128 } } // namespace v8::internal |
| OLD | NEW |