1 // Copyright 2012 the V8 project authors. All rights reserved. 2 // Redistribution and use in source and binary forms, with or without 3 // modification, are permitted provided that the following conditions are 4 // met: 5 // 6 // * Redistributions of source code must retain the above copyright 7 // notice, this list of conditions and the following disclaimer. 8 // * Redistributions in binary form must reproduce the above 9 // copyright notice, this list of conditions and the following 10 // disclaimer in the documentation and/or other materials provided 11 // with the distribution. 12 // * Neither the name of Google Inc. nor the names of its 13 // contributors may be used to endorse or promote products derived 14 // from this software without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 #include "v8.h" 29 30 #include "disassembler.h" 31 #include "disasm.h" 32 #include "jsregexp.h" 33 #include "objects-visiting.h" 34 35 namespace v8 { 36 namespace internal { 37 38 #ifdef OBJECT_PRINT 39 40 void MaybeObject::Print() { 41 Print(stdout); 42 } 43 44 45 void MaybeObject::Print(FILE* out) { 46 Object* this_as_object; 47 if (ToObject(&this_as_object)) { 48 if (this_as_object->IsSmi()) { 49 Smi::cast(this_as_object)->SmiPrint(out); 50 } else { 51 HeapObject::cast(this_as_object)->HeapObjectPrint(out); 52 } 53 } else { 54 Failure::cast(this)->FailurePrint(out); 55 } 56 Flush(out); 57 } 58 59 60 void MaybeObject::PrintLn() { 61 PrintLn(stdout); 62 } 63 64 65 void MaybeObject::PrintLn(FILE* out) { 66 Print(out); 67 PrintF(out, "\n"); 68 } 69 70 71 void HeapObject::PrintHeader(FILE* out, const char* id) { 72 PrintF(out, "%p: [%s]\n", reinterpret_cast<void*>(this), id); 73 } 74 75 76 void HeapObject::HeapObjectPrint(FILE* out) { 77 InstanceType instance_type = map()->instance_type(); 78 79 HandleScope scope(GetIsolate()); 80 if (instance_type < FIRST_NONSTRING_TYPE) { 81 String::cast(this)->StringPrint(out); 82 return; 83 } 84 85 switch (instance_type) { 86 case SYMBOL_TYPE: 87 Symbol::cast(this)->SymbolPrint(out); 88 break; 89 case MAP_TYPE: 90 Map::cast(this)->MapPrint(out); 91 break; 92 case HEAP_NUMBER_TYPE: 93 HeapNumber::cast(this)->HeapNumberPrint(out); 94 break; 95 case FIXED_DOUBLE_ARRAY_TYPE: 96 FixedDoubleArray::cast(this)->FixedDoubleArrayPrint(out); 97 break; 98 case CONSTANT_POOL_ARRAY_TYPE: 99 ConstantPoolArray::cast(this)->ConstantPoolArrayPrint(out); 100 break; 101 case FIXED_ARRAY_TYPE: 102 FixedArray::cast(this)->FixedArrayPrint(out); 103 break; 104 case BYTE_ARRAY_TYPE: 105 ByteArray::cast(this)->ByteArrayPrint(out); 106 break; 107 case FREE_SPACE_TYPE: 108 FreeSpace::cast(this)->FreeSpacePrint(out); 109 break; 110 case EXTERNAL_PIXEL_ARRAY_TYPE: 111 ExternalPixelArray::cast(this)->ExternalPixelArrayPrint(out); 112 break; 113 case EXTERNAL_BYTE_ARRAY_TYPE: 114 ExternalByteArray::cast(this)->ExternalByteArrayPrint(out); 115 break; 116 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: 117 ExternalUnsignedByteArray::cast(this) 118 ->ExternalUnsignedByteArrayPrint(out); 119 break; 120 case EXTERNAL_SHORT_ARRAY_TYPE: 121 ExternalShortArray::cast(this)->ExternalShortArrayPrint(out); 122 break; 123 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: 124 ExternalUnsignedShortArray::cast(this) 125 ->ExternalUnsignedShortArrayPrint(out); 126 break; 127 case EXTERNAL_INT_ARRAY_TYPE: 128 ExternalIntArray::cast(this)->ExternalIntArrayPrint(out); 129 break; 130 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: 131 ExternalUnsignedIntArray::cast(this)->ExternalUnsignedIntArrayPrint(out); 132 break; 133 case EXTERNAL_FLOAT_ARRAY_TYPE: 134 ExternalFloatArray::cast(this)->ExternalFloatArrayPrint(out); 135 break; 136 case EXTERNAL_DOUBLE_ARRAY_TYPE: 137 ExternalDoubleArray::cast(this)->ExternalDoubleArrayPrint(out); 138 break; 139 case FILLER_TYPE: 140 PrintF(out, "filler"); 141 break; 142 case JS_OBJECT_TYPE: // fall through 143 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: 144 case JS_ARRAY_TYPE: 145 case JS_GENERATOR_OBJECT_TYPE: 146 case JS_REGEXP_TYPE: 147 JSObject::cast(this)->JSObjectPrint(out); 148 break; 149 case ODDBALL_TYPE: 150 Oddball::cast(this)->to_string()->Print(out); 151 break; 152 case JS_MODULE_TYPE: 153 JSModule::cast(this)->JSModulePrint(out); 154 break; 155 case JS_FUNCTION_TYPE: 156 JSFunction::cast(this)->JSFunctionPrint(out); 157 break; 158 case JS_GLOBAL_PROXY_TYPE: 159 JSGlobalProxy::cast(this)->JSGlobalProxyPrint(out); 160 break; 161 case JS_GLOBAL_OBJECT_TYPE: 162 JSGlobalObject::cast(this)->JSGlobalObjectPrint(out); 163 break; 164 case JS_BUILTINS_OBJECT_TYPE: 165 JSBuiltinsObject::cast(this)->JSBuiltinsObjectPrint(out); 166 break; 167 case JS_VALUE_TYPE: 168 PrintF(out, "Value wrapper around:"); 169 JSValue::cast(this)->value()->Print(out); 170 break; 171 case JS_DATE_TYPE: 172 JSDate::cast(this)->JSDatePrint(out); 173 break; 174 case CODE_TYPE: 175 Code::cast(this)->CodePrint(out); 176 break; 177 case JS_PROXY_TYPE: 178 JSProxy::cast(this)->JSProxyPrint(out); 179 break; 180 case JS_FUNCTION_PROXY_TYPE: 181 JSFunctionProxy::cast(this)->JSFunctionProxyPrint(out); 182 break; 183 case JS_SET_TYPE: 184 JSSet::cast(this)->JSSetPrint(out); 185 break; 186 case JS_MAP_TYPE: 187 JSMap::cast(this)->JSMapPrint(out); 188 break; 189 case JS_WEAK_MAP_TYPE: 190 JSWeakMap::cast(this)->JSWeakMapPrint(out); 191 break; 192 case JS_WEAK_SET_TYPE: 193 JSWeakSet::cast(this)->JSWeakSetPrint(out); 194 break; 195 case FOREIGN_TYPE: 196 Foreign::cast(this)->ForeignPrint(out); 197 break; 198 case SHARED_FUNCTION_INFO_TYPE: 199 SharedFunctionInfo::cast(this)->SharedFunctionInfoPrint(out); 200 break; 201 case JS_MESSAGE_OBJECT_TYPE: 202 JSMessageObject::cast(this)->JSMessageObjectPrint(out); 203 break; 204 case CELL_TYPE: 205 Cell::cast(this)->CellPrint(out); 206 break; 207 case PROPERTY_CELL_TYPE: 208 PropertyCell::cast(this)->PropertyCellPrint(out); 209 break; 210 case JS_ARRAY_BUFFER_TYPE: 211 JSArrayBuffer::cast(this)->JSArrayBufferPrint(out); 212 break; 213 case JS_TYPED_ARRAY_TYPE: 214 JSTypedArray::cast(this)->JSTypedArrayPrint(out); 215 break; 216 case JS_DATA_VIEW_TYPE: 217 JSDataView::cast(this)->JSDataViewPrint(out); 218 break; 219 #define MAKE_STRUCT_CASE(NAME, Name, name) \ 220 case NAME##_TYPE: \ 221 Name::cast(this)->Name##Print(out); \ 222 break; 223 STRUCT_LIST(MAKE_STRUCT_CASE) 224 #undef MAKE_STRUCT_CASE 225 226 default: 227 PrintF(out, "UNKNOWN TYPE %d", map()->instance_type()); 228 UNREACHABLE(); 229 break; 230 } 231 } 232 233 234 void ByteArray::ByteArrayPrint(FILE* out) { 235 PrintF(out, "byte array, data starts at %p", GetDataStartAddress()); 236 } 237 238 239 void FreeSpace::FreeSpacePrint(FILE* out) { 240 PrintF(out, "free space, size %d", Size()); 241 } 242 243 244 void ExternalPixelArray::ExternalPixelArrayPrint(FILE* out) { 245 PrintF(out, "external pixel array"); 246 } 247 248 249 void ExternalByteArray::ExternalByteArrayPrint(FILE* out) { 250 PrintF(out, "external byte array"); 251 } 252 253 254 void ExternalUnsignedByteArray::ExternalUnsignedByteArrayPrint(FILE* out) { 255 PrintF(out, "external unsigned byte array"); 256 } 257 258 259 void ExternalShortArray::ExternalShortArrayPrint(FILE* out) { 260 PrintF(out, "external short array"); 261 } 262 263 264 void ExternalUnsignedShortArray::ExternalUnsignedShortArrayPrint(FILE* out) { 265 PrintF(out, "external unsigned short array"); 266 } 267 268 269 void ExternalIntArray::ExternalIntArrayPrint(FILE* out) { 270 PrintF(out, "external int array"); 271 } 272 273 274 void ExternalUnsignedIntArray::ExternalUnsignedIntArrayPrint(FILE* out) { 275 PrintF(out, "external unsigned int array"); 276 } 277 278 279 void ExternalFloatArray::ExternalFloatArrayPrint(FILE* out) { 280 PrintF(out, "external float array"); 281 } 282 283 284 void ExternalDoubleArray::ExternalDoubleArrayPrint(FILE* out) { 285 PrintF(out, "external double array"); 286 } 287 288 289 void JSObject::PrintProperties(FILE* out) { 290 if (HasFastProperties()) { 291 DescriptorArray* descs = map()->instance_descriptors(); 292 for (int i = 0; i < map()->NumberOfOwnDescriptors(); i++) { 293 PrintF(out, " "); 294 descs->GetKey(i)->NamePrint(out); 295 PrintF(out, ": "); 296 switch (descs->GetType(i)) { 297 case FIELD: { 298 int index = descs->GetFieldIndex(i); 299 RawFastPropertyAt(index)->ShortPrint(out); 300 PrintF(out, " (field at offset %d)\n", index); 301 break; 302 } 303 case CONSTANT: 304 descs->GetConstant(i)->ShortPrint(out); 305 PrintF(out, " (constant)\n"); 306 break; 307 case CALLBACKS: 308 descs->GetCallbacksObject(i)->ShortPrint(out); 309 PrintF(out, " (callback)\n"); 310 break; 311 case NORMAL: // only in slow mode 312 case HANDLER: // only in lookup results, not in descriptors 313 case INTERCEPTOR: // only in lookup results, not in descriptors 314 // There are no transitions in the descriptor array. 315 case TRANSITION: 316 case NONEXISTENT: 317 UNREACHABLE(); 318 break; 319 } 320 } 321 } else { 322 property_dictionary()->Print(out); 323 } 324 } 325 326 327 void JSObject::PrintElements(FILE* out) { 328 // Don't call GetElementsKind, its validation code can cause the printer to 329 // fail when debugging. 330 switch (map()->elements_kind()) { 331 case FAST_HOLEY_SMI_ELEMENTS: 332 case FAST_SMI_ELEMENTS: 333 case FAST_HOLEY_ELEMENTS: 334 case FAST_ELEMENTS: { 335 // Print in array notation for non-sparse arrays. 336 FixedArray* p = FixedArray::cast(elements()); 337 for (int i = 0; i < p->length(); i++) { 338 PrintF(out, " %d: ", i); 339 p->get(i)->ShortPrint(out); 340 PrintF(out, "\n"); 341 } 342 break; 343 } 344 case FAST_HOLEY_DOUBLE_ELEMENTS: 345 case FAST_DOUBLE_ELEMENTS: { 346 // Print in array notation for non-sparse arrays. 347 if (elements()->length() > 0) { 348 FixedDoubleArray* p = FixedDoubleArray::cast(elements()); 349 for (int i = 0; i < p->length(); i++) { 350 if (p->is_the_hole(i)) { 351 PrintF(out, " %d: <the hole>", i); 352 } else { 353 PrintF(out, " %d: %g", i, p->get_scalar(i)); 354 } 355 PrintF(out, "\n"); 356 } 357 } 358 break; 359 } 360 case EXTERNAL_PIXEL_ELEMENTS: { 361 ExternalPixelArray* p = ExternalPixelArray::cast(elements()); 362 for (int i = 0; i < p->length(); i++) { 363 PrintF(out, " %d: %d\n", i, p->get_scalar(i)); 364 } 365 break; 366 } 367 case EXTERNAL_BYTE_ELEMENTS: { 368 ExternalByteArray* p = ExternalByteArray::cast(elements()); 369 for (int i = 0; i < p->length(); i++) { 370 PrintF(out, " %d: %d\n", i, static_cast<int>(p->get_scalar(i))); 371 } 372 break; 373 } 374 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: { 375 ExternalUnsignedByteArray* p = 376 ExternalUnsignedByteArray::cast(elements()); 377 for (int i = 0; i < p->length(); i++) { 378 PrintF(out, " %d: %d\n", i, static_cast<int>(p->get_scalar(i))); 379 } 380 break; 381 } 382 case EXTERNAL_SHORT_ELEMENTS: { 383 ExternalShortArray* p = ExternalShortArray::cast(elements()); 384 for (int i = 0; i < p->length(); i++) { 385 PrintF(out, " %d: %d\n", i, static_cast<int>(p->get_scalar(i))); 386 } 387 break; 388 } 389 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: { 390 ExternalUnsignedShortArray* p = 391 ExternalUnsignedShortArray::cast(elements()); 392 for (int i = 0; i < p->length(); i++) { 393 PrintF(out, " %d: %d\n", i, static_cast<int>(p->get_scalar(i))); 394 } 395 break; 396 } 397 case EXTERNAL_INT_ELEMENTS: { 398 ExternalIntArray* p = ExternalIntArray::cast(elements()); 399 for (int i = 0; i < p->length(); i++) { 400 PrintF(out, " %d: %d\n", i, static_cast<int>(p->get_scalar(i))); 401 } 402 break; 403 } 404 case EXTERNAL_UNSIGNED_INT_ELEMENTS: { 405 ExternalUnsignedIntArray* p = 406 ExternalUnsignedIntArray::cast(elements()); 407 for (int i = 0; i < p->length(); i++) { 408 PrintF(out, " %d: %d\n", i, static_cast<int>(p->get_scalar(i))); 409 } 410 break; 411 } 412 case EXTERNAL_FLOAT_ELEMENTS: { 413 ExternalFloatArray* p = ExternalFloatArray::cast(elements()); 414 for (int i = 0; i < p->length(); i++) { 415 PrintF(out, " %d: %f\n", i, p->get_scalar(i)); 416 } 417 break; 418 } 419 case EXTERNAL_DOUBLE_ELEMENTS: { 420 ExternalDoubleArray* p = ExternalDoubleArray::cast(elements()); 421 for (int i = 0; i < p->length(); i++) { 422 PrintF(out, " %d: %f\n", i, p->get_scalar(i)); 423 } 424 break; 425 } 426 case DICTIONARY_ELEMENTS: 427 elements()->Print(out); 428 break; 429 case NON_STRICT_ARGUMENTS_ELEMENTS: { 430 FixedArray* p = FixedArray::cast(elements()); 431 PrintF(out, " parameter map:"); 432 for (int i = 2; i < p->length(); i++) { 433 PrintF(out, " %d:", i - 2); 434 p->get(i)->ShortPrint(out); 435 } 436 PrintF(out, "\n context: "); 437 p->get(0)->ShortPrint(out); 438 PrintF(out, "\n arguments: "); 439 p->get(1)->ShortPrint(out); 440 PrintF(out, "\n"); 441 break; 442 } 443 } 444 } 445 446 447 void JSObject::PrintTransitions(FILE* out) { 448 if (!map()->HasTransitionArray()) return; 449 TransitionArray* transitions = map()->transitions(); 450 for (int i = 0; i < transitions->number_of_transitions(); i++) { 451 PrintF(out, " "); 452 transitions->GetKey(i)->NamePrint(out); 453 PrintF(out, ": "); 454 switch (transitions->GetTargetDetails(i).type()) { 455 case FIELD: { 456 PrintF(out, " (transition to field)\n"); 457 break; 458 } 459 case CONSTANT: 460 PrintF(out, " (transition to constant)\n"); 461 break; 462 case CALLBACKS: 463 PrintF(out, " (transition to callback)\n"); 464 break; 465 // Values below are never in the target descriptor array. 466 case NORMAL: 467 case HANDLER: 468 case INTERCEPTOR: 469 case TRANSITION: 470 case NONEXISTENT: 471 UNREACHABLE(); 472 break; 473 } 474 } 475 } 476 477 478 void JSObject::JSObjectPrint(FILE* out) { 479 PrintF(out, "%p: [JSObject]\n", reinterpret_cast<void*>(this)); 480 PrintF(out, " - map = %p [", reinterpret_cast<void*>(map())); 481 // Don't call GetElementsKind, its validation code can cause the printer to 482 // fail when debugging. 483 PrintElementsKind(out, this->map()->elements_kind()); 484 PrintF(out, 485 "]\n - prototype = %p\n", 486 reinterpret_cast<void*>(GetPrototype())); 487 PrintF(out, " {\n"); 488 PrintProperties(out); 489 PrintTransitions(out); 490 PrintElements(out); 491 PrintF(out, " }\n"); 492 } 493 494 495 void JSModule::JSModulePrint(FILE* out) { 496 HeapObject::PrintHeader(out, "JSModule"); 497 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 498 PrintF(out, " - context = "); 499 context()->Print(out); 500 PrintF(out, " - scope_info = "); 501 scope_info()->ShortPrint(out); 502 PrintElementsKind(out, this->map()->elements_kind()); 503 PrintF(out, " {\n"); 504 PrintProperties(out); 505 PrintElements(out); 506 PrintF(out, " }\n"); 507 } 508 509 510 static const char* TypeToString(InstanceType type) { 511 switch (type) { 512 #define TYPE_TO_STRING(TYPE) case TYPE: return #TYPE; 513 INSTANCE_TYPE_LIST(TYPE_TO_STRING) 514 #undef TYPE_TO_STRING 515 } 516 UNREACHABLE(); 517 return "UNKNOWN"; // Keep the compiler happy. 518 } 519 520 521 void Symbol::SymbolPrint(FILE* out) { 522 HeapObject::PrintHeader(out, "Symbol"); 523 PrintF(out, " - hash: %d\n", Hash()); 524 PrintF(out, " - name: "); 525 name()->ShortPrint(); 526 PrintF(out, " - private: %d\n", is_private()); 527 PrintF(out, "\n"); 528 } 529 530 531 void Map::MapPrint(FILE* out) { 532 HeapObject::PrintHeader(out, "Map"); 533 PrintF(out, " - type: %s\n", TypeToString(instance_type())); 534 PrintF(out, " - instance size: %d\n", instance_size()); 535 PrintF(out, " - inobject properties: %d\n", inobject_properties()); 536 PrintF(out, " - elements kind: "); 537 PrintElementsKind(out, elements_kind()); 538 PrintF(out, "\n - pre-allocated property fields: %d\n", 539 pre_allocated_property_fields()); 540 PrintF(out, " - unused property fields: %d\n", unused_property_fields()); 541 if (is_hidden_prototype()) { 542 PrintF(out, " - hidden_prototype\n"); 543 } 544 if (has_named_interceptor()) { 545 PrintF(out, " - named_interceptor\n"); 546 } 547 if (has_indexed_interceptor()) { 548 PrintF(out, " - indexed_interceptor\n"); 549 } 550 if (is_undetectable()) { 551 PrintF(out, " - undetectable\n"); 552 } 553 if (has_instance_call_handler()) { 554 PrintF(out, " - instance_call_handler\n"); 555 } 556 if (is_access_check_needed()) { 557 PrintF(out, " - access_check_needed\n"); 558 } 559 if (is_frozen()) { 560 PrintF(out, " - frozen\n"); 561 } else if (!is_extensible()) { 562 PrintF(out, " - sealed\n"); 563 } 564 PrintF(out, " - back pointer: "); 565 GetBackPointer()->ShortPrint(out); 566 PrintF(out, "\n - instance descriptors %s#%i: ", 567 owns_descriptors() ? "(own) " : "", 568 NumberOfOwnDescriptors()); 569 instance_descriptors()->ShortPrint(out); 570 if (HasTransitionArray()) { 571 PrintF(out, "\n - transitions: "); 572 transitions()->ShortPrint(out); 573 } 574 PrintF(out, "\n - prototype: "); 575 prototype()->ShortPrint(out); 576 PrintF(out, "\n - constructor: "); 577 constructor()->ShortPrint(out); 578 PrintF(out, "\n - code cache: "); 579 code_cache()->ShortPrint(out); 580 PrintF(out, "\n - dependent code: "); 581 dependent_code()->ShortPrint(out); 582 PrintF(out, "\n"); 583 } 584 585 586 void CodeCache::CodeCachePrint(FILE* out) { 587 HeapObject::PrintHeader(out, "CodeCache"); 588 PrintF(out, "\n - default_cache: "); 589 default_cache()->ShortPrint(out); 590 PrintF(out, "\n - normal_type_cache: "); 591 normal_type_cache()->ShortPrint(out); 592 } 593 594 595 void PolymorphicCodeCache::PolymorphicCodeCachePrint(FILE* out) { 596 HeapObject::PrintHeader(out, "PolymorphicCodeCache"); 597 PrintF(out, "\n - cache: "); 598 cache()->ShortPrint(out); 599 } 600 601 602 void TypeFeedbackInfo::TypeFeedbackInfoPrint(FILE* out) { 603 HeapObject::PrintHeader(out, "TypeFeedbackInfo"); 604 PrintF(out, " - ic_total_count: %d, ic_with_type_info_count: %d\n", 605 ic_total_count(), ic_with_type_info_count()); 606 PrintF(out, " - type_feedback_cells: "); 607 type_feedback_cells()->FixedArrayPrint(out); 608 } 609 610 611 void AliasedArgumentsEntry::AliasedArgumentsEntryPrint(FILE* out) { 612 HeapObject::PrintHeader(out, "AliasedArgumentsEntry"); 613 PrintF(out, "\n - aliased_context_slot: %d", aliased_context_slot()); 614 } 615 616 617 void FixedArray::FixedArrayPrint(FILE* out) { 618 HeapObject::PrintHeader(out, "FixedArray"); 619 PrintF(out, " - length: %d", length()); 620 for (int i = 0; i < length(); i++) { 621 PrintF(out, "\n [%d]: ", i); 622 get(i)->ShortPrint(out); 623 } 624 PrintF(out, "\n"); 625 } 626 627 628 void FixedDoubleArray::FixedDoubleArrayPrint(FILE* out) { 629 HeapObject::PrintHeader(out, "FixedDoubleArray"); 630 PrintF(out, " - length: %d", length()); 631 for (int i = 0; i < length(); i++) { 632 if (is_the_hole(i)) { 633 PrintF(out, "\n [%d]: <the hole>", i); 634 } else { 635 PrintF(out, "\n [%d]: %g", i, get_scalar(i)); 636 } 637 } 638 PrintF(out, "\n"); 639 } 640 641 642 void ConstantPoolArray::ConstantPoolArrayPrint(FILE* out) { 643 HeapObject::PrintHeader(out, "ConstantPoolArray"); 644 PrintF(out, " - length: %d", length()); 645 for (int i = 0; i < length(); i++) { 646 if (i < first_ptr_index()) { 647 PrintF(out, "\n [%d]: double: %g", i, get_int64_entry_as_double(i)); 648 } else if (i < first_int32_index()) { 649 PrintF(out, "\n [%d]: pointer: %p", i, 650 reinterpret_cast<void*>(get_ptr_entry(i))); 651 } else { 652 PrintF(out, "\n [%d]: int32: %d", i, get_int32_entry(i)); 653 } 654 } 655 PrintF(out, "\n"); 656 } 657 658 659 void JSValue::JSValuePrint(FILE* out) { 660 HeapObject::PrintHeader(out, "ValueObject"); 661 value()->Print(out); 662 } 663 664 665 void JSMessageObject::JSMessageObjectPrint(FILE* out) { 666 HeapObject::PrintHeader(out, "JSMessageObject"); 667 PrintF(out, " - type: "); 668 type()->ShortPrint(out); 669 PrintF(out, "\n - arguments: "); 670 arguments()->ShortPrint(out); 671 PrintF(out, "\n - start_position: %d", start_position()); 672 PrintF(out, "\n - end_position: %d", end_position()); 673 PrintF(out, "\n - script: "); 674 script()->ShortPrint(out); 675 PrintF(out, "\n - stack_trace: "); 676 stack_trace()->ShortPrint(out); 677 PrintF(out, "\n - stack_frames: "); 678 stack_frames()->ShortPrint(out); 679 PrintF(out, "\n"); 680 } 681 682 683 void String::StringPrint(FILE* out) { 684 if (StringShape(this).IsInternalized()) { 685 PrintF(out, "#"); 686 } else if (StringShape(this).IsCons()) { 687 PrintF(out, "c\""); 688 } else { 689 PrintF(out, "\""); 690 } 691 692 const char truncated_epilogue[] = "...<truncated>"; 693 int len = length(); 694 if (!FLAG_use_verbose_printer) { 695 if (len > 100) { 696 len = 100 - sizeof(truncated_epilogue); 697 } 698 } 699 for (int i = 0; i < len; i++) { 700 PrintF(out, "%c", Get(i)); 701 } 702 if (len != length()) { 703 PrintF(out, "%s", truncated_epilogue); 704 } 705 706 if (!StringShape(this).IsInternalized()) PrintF(out, "\""); 707 } 708 709 710 void Name::NamePrint(FILE* out) { 711 if (IsString()) 712 String::cast(this)->StringPrint(out); 713 else 714 ShortPrint(); 715 } 716 717 718 // This method is only meant to be called from gdb for debugging purposes. 719 // Since the string can also be in two-byte encoding, non-ASCII characters 720 // will be ignored in the output. 721 char* String::ToAsciiArray() { 722 // Static so that subsequent calls frees previously allocated space. 723 // This also means that previous results will be overwritten. 724 static char* buffer = NULL; 725 if (buffer != NULL) free(buffer); 726 buffer = new char[length()+1]; 727 WriteToFlat(this, reinterpret_cast<uint8_t*>(buffer), 0, length()); 728 buffer[length()] = 0; 729 return buffer; 730 } 731 732 733 static const char* const weekdays[] = { 734 "???", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 735 }; 736 737 738 void JSDate::JSDatePrint(FILE* out) { 739 HeapObject::PrintHeader(out, "JSDate"); 740 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 741 PrintF(out, " - value = "); 742 value()->Print(out); 743 if (!year()->IsSmi()) { 744 PrintF(out, " - time = NaN\n"); 745 } else { 746 PrintF(out, " - time = %s %04d/%02d/%02d %02d:%02d:%02d\n", 747 weekdays[weekday()->IsSmi() ? Smi::cast(weekday())->value() + 1 : 0], 748 year()->IsSmi() ? Smi::cast(year())->value() : -1, 749 month()->IsSmi() ? Smi::cast(month())->value() : -1, 750 day()->IsSmi() ? Smi::cast(day())->value() : -1, 751 hour()->IsSmi() ? Smi::cast(hour())->value() : -1, 752 min()->IsSmi() ? Smi::cast(min())->value() : -1, 753 sec()->IsSmi() ? Smi::cast(sec())->value() : -1); 754 } 755 } 756 757 758 void JSProxy::JSProxyPrint(FILE* out) { 759 HeapObject::PrintHeader(out, "JSProxy"); 760 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 761 PrintF(out, " - handler = "); 762 handler()->Print(out); 763 PrintF(out, " - hash = "); 764 hash()->Print(out); 765 PrintF(out, "\n"); 766 } 767 768 769 void JSFunctionProxy::JSFunctionProxyPrint(FILE* out) { 770 HeapObject::PrintHeader(out, "JSFunctionProxy"); 771 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 772 PrintF(out, " - handler = "); 773 handler()->Print(out); 774 PrintF(out, " - call_trap = "); 775 call_trap()->Print(out); 776 PrintF(out, " - construct_trap = "); 777 construct_trap()->Print(out); 778 PrintF(out, "\n"); 779 } 780 781 782 void JSSet::JSSetPrint(FILE* out) { 783 HeapObject::PrintHeader(out, "JSSet"); 784 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 785 PrintF(out, " - table = "); 786 table()->ShortPrint(out); 787 PrintF(out, "\n"); 788 } 789 790 791 void JSMap::JSMapPrint(FILE* out) { 792 HeapObject::PrintHeader(out, "JSMap"); 793 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 794 PrintF(out, " - table = "); 795 table()->ShortPrint(out); 796 PrintF(out, "\n"); 797 } 798 799 800 void JSWeakMap::JSWeakMapPrint(FILE* out) { 801 HeapObject::PrintHeader(out, "JSWeakMap"); 802 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 803 PrintF(out, " - table = "); 804 table()->ShortPrint(out); 805 PrintF(out, "\n"); 806 } 807 808 809 void JSWeakSet::JSWeakSetPrint(FILE* out) { 810 HeapObject::PrintHeader(out, "JSWeakSet"); 811 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 812 PrintF(out, " - table = "); 813 table()->ShortPrint(out); 814 PrintF(out, "\n"); 815 } 816 817 818 void JSArrayBuffer::JSArrayBufferPrint(FILE* out) { 819 HeapObject::PrintHeader(out, "JSArrayBuffer"); 820 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 821 PrintF(out, " - backing_store = %p\n", backing_store()); 822 PrintF(out, " - byte_length = "); 823 byte_length()->ShortPrint(out); 824 PrintF(out, "\n"); 825 } 826 827 828 void JSTypedArray::JSTypedArrayPrint(FILE* out) { 829 HeapObject::PrintHeader(out, "JSTypedArray"); 830 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 831 PrintF(out, " - buffer ="); 832 buffer()->ShortPrint(out); 833 PrintF(out, "\n - byte_offset = "); 834 byte_offset()->ShortPrint(out); 835 PrintF(out, "\n - byte_length = "); 836 byte_length()->ShortPrint(out); 837 PrintF(out, "\n - length = "); 838 length()->ShortPrint(out); 839 PrintF(out, "\n"); 840 PrintElements(out); 841 } 842 843 844 void JSDataView::JSDataViewPrint(FILE* out) { 845 HeapObject::PrintHeader(out, "JSDataView"); 846 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 847 PrintF(out, " - buffer ="); 848 buffer()->ShortPrint(out); 849 PrintF(out, "\n - byte_offset = "); 850 byte_offset()->ShortPrint(out); 851 PrintF(out, "\n - byte_length = "); 852 byte_length()->ShortPrint(out); 853 PrintF(out, "\n"); 854 } 855 856 857 void JSFunction::JSFunctionPrint(FILE* out) { 858 HeapObject::PrintHeader(out, "Function"); 859 PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map())); 860 PrintF(out, " - initial_map = "); 861 if (has_initial_map()) { 862 initial_map()->ShortPrint(out); 863 } 864 PrintF(out, "\n - shared_info = "); 865 shared()->ShortPrint(out); 866 PrintF(out, "\n - name = "); 867 shared()->name()->Print(out); 868 PrintF(out, "\n - context = "); 869 context()->ShortPrint(out); 870 if (shared()->bound()) { 871 PrintF(out, "\n - bindings = "); 872 function_bindings()->ShortPrint(out); 873 } else { 874 PrintF(out, "\n - literals = "); 875 literals()->ShortPrint(out); 876 } 877 PrintF(out, "\n - code = "); 878 code()->ShortPrint(out); 879 PrintF(out, "\n"); 880 881 PrintProperties(out); 882 PrintElements(out); 883 884 PrintF(out, "\n"); 885 } 886 887 888 void SharedFunctionInfo::SharedFunctionInfoPrint(FILE* out) { 889 HeapObject::PrintHeader(out, "SharedFunctionInfo"); 890 PrintF(out, " - name: "); 891 name()->ShortPrint(out); 892 PrintF(out, "\n - expected_nof_properties: %d", expected_nof_properties()); 893 PrintF(out, "\n - instance class name = "); 894 instance_class_name()->Print(out); 895 PrintF(out, "\n - code = "); 896 code()->ShortPrint(out); 897 if (HasSourceCode()) { 898 PrintF(out, "\n - source code = "); 899 String* source = String::cast(Script::cast(script())->source()); 900 int start = start_position(); 901 int length = end_position() - start; 902 SmartArrayPointer<char> source_string = 903 source->ToCString(DISALLOW_NULLS, 904 FAST_STRING_TRAVERSAL, 905 start, length, NULL); 906 PrintF(out, "%s", *source_string); 907 } 908 // Script files are often large, hard to read. 909 // PrintF(out, "\n - script ="); 910 // script()->Print(out); 911 PrintF(out, "\n - function token position = %d", function_token_position()); 912 PrintF(out, "\n - start position = %d", start_position()); 913 PrintF(out, "\n - end position = %d", end_position()); 914 PrintF(out, "\n - is expression = %d", is_expression()); 915 PrintF(out, "\n - debug info = "); 916 debug_info()->ShortPrint(out); 917 PrintF(out, "\n - length = %d", length()); 918 PrintF(out, "\n - optimized_code_map = "); 919 optimized_code_map()->ShortPrint(out); 920 PrintF(out, "\n"); 921 } 922 923 924 void JSGlobalProxy::JSGlobalProxyPrint(FILE* out) { 925 PrintF(out, "global_proxy "); 926 JSObjectPrint(out); 927 PrintF(out, "native context : "); 928 native_context()->ShortPrint(out); 929 PrintF(out, "\n"); 930 } 931 932 933 void JSGlobalObject::JSGlobalObjectPrint(FILE* out) { 934 PrintF(out, "global "); 935 JSObjectPrint(out); 936 PrintF(out, "native context : "); 937 native_context()->ShortPrint(out); 938 PrintF(out, "\n"); 939 } 940 941 942 void JSBuiltinsObject::JSBuiltinsObjectPrint(FILE* out) { 943 PrintF(out, "builtins "); 944 JSObjectPrint(out); 945 } 946 947 948 void Cell::CellPrint(FILE* out) { 949 HeapObject::PrintHeader(out, "Cell"); 950 } 951 952 953 void PropertyCell::PropertyCellPrint(FILE* out) { 954 HeapObject::PrintHeader(out, "PropertyCell"); 955 } 956 957 958 void Code::CodePrint(FILE* out) { 959 HeapObject::PrintHeader(out, "Code"); 960 #ifdef ENABLE_DISASSEMBLER 961 if (FLAG_use_verbose_printer) { 962 Disassemble(NULL, out); 963 } 964 #endif 965 } 966 967 968 void Foreign::ForeignPrint(FILE* out) { 969 PrintF(out, "foreign address : %p", foreign_address()); 970 } 971 972 973 void ExecutableAccessorInfo::ExecutableAccessorInfoPrint(FILE* out) { 974 HeapObject::PrintHeader(out, "ExecutableAccessorInfo"); 975 PrintF(out, "\n - name: "); 976 name()->ShortPrint(out); 977 PrintF(out, "\n - flag: "); 978 flag()->ShortPrint(out); 979 PrintF(out, "\n - getter: "); 980 getter()->ShortPrint(out); 981 PrintF(out, "\n - setter: "); 982 setter()->ShortPrint(out); 983 PrintF(out, "\n - data: "); 984 data()->ShortPrint(out); 985 } 986 987 988 void DeclaredAccessorInfo::DeclaredAccessorInfoPrint(FILE* out) { 989 HeapObject::PrintHeader(out, "DeclaredAccessorInfo"); 990 PrintF(out, "\n - name: "); 991 name()->ShortPrint(out); 992 PrintF(out, "\n - flag: "); 993 flag()->ShortPrint(out); 994 PrintF(out, "\n - descriptor: "); 995 descriptor()->ShortPrint(out); 996 } 997 998 999 void DeclaredAccessorDescriptor::DeclaredAccessorDescriptorPrint(FILE* out) { 1000 HeapObject::PrintHeader(out, "DeclaredAccessorDescriptor"); 1001 PrintF(out, "\n - internal field: "); 1002 serialized_data()->ShortPrint(out); 1003 } 1004 1005 1006 void Box::BoxPrint(FILE* out) { 1007 HeapObject::PrintHeader(out, "Box"); 1008 PrintF(out, "\n - value: "); 1009 value()->ShortPrint(out); 1010 } 1011 1012 1013 void AccessorPair::AccessorPairPrint(FILE* out) { 1014 HeapObject::PrintHeader(out, "AccessorPair"); 1015 PrintF(out, "\n - getter: "); 1016 getter()->ShortPrint(out); 1017 PrintF(out, "\n - setter: "); 1018 setter()->ShortPrint(out); 1019 PrintF(out, "\n - flag: "); 1020 access_flags()->ShortPrint(out); 1021 } 1022 1023 1024 void AccessCheckInfo::AccessCheckInfoPrint(FILE* out) { 1025 HeapObject::PrintHeader(out, "AccessCheckInfo"); 1026 PrintF(out, "\n - named_callback: "); 1027 named_callback()->ShortPrint(out); 1028 PrintF(out, "\n - indexed_callback: "); 1029 indexed_callback()->ShortPrint(out); 1030 PrintF(out, "\n - data: "); 1031 data()->ShortPrint(out); 1032 } 1033 1034 1035 void InterceptorInfo::InterceptorInfoPrint(FILE* out) { 1036 HeapObject::PrintHeader(out, "InterceptorInfo"); 1037 PrintF(out, "\n - getter: "); 1038 getter()->ShortPrint(out); 1039 PrintF(out, "\n - setter: "); 1040 setter()->ShortPrint(out); 1041 PrintF(out, "\n - query: "); 1042 query()->ShortPrint(out); 1043 PrintF(out, "\n - deleter: "); 1044 deleter()->ShortPrint(out); 1045 PrintF(out, "\n - enumerator: "); 1046 enumerator()->ShortPrint(out); 1047 PrintF(out, "\n - data: "); 1048 data()->ShortPrint(out); 1049 } 1050 1051 1052 void CallHandlerInfo::CallHandlerInfoPrint(FILE* out) { 1053 HeapObject::PrintHeader(out, "CallHandlerInfo"); 1054 PrintF(out, "\n - callback: "); 1055 callback()->ShortPrint(out); 1056 PrintF(out, "\n - data: "); 1057 data()->ShortPrint(out); 1058 PrintF(out, "\n - call_stub_cache: "); 1059 } 1060 1061 1062 void FunctionTemplateInfo::FunctionTemplateInfoPrint(FILE* out) { 1063 HeapObject::PrintHeader(out, "FunctionTemplateInfo"); 1064 PrintF(out, "\n - class name: "); 1065 class_name()->ShortPrint(out); 1066 PrintF(out, "\n - tag: "); 1067 tag()->ShortPrint(out); 1068 PrintF(out, "\n - property_list: "); 1069 property_list()->ShortPrint(out); 1070 PrintF(out, "\n - serial_number: "); 1071 serial_number()->ShortPrint(out); 1072 PrintF(out, "\n - call_code: "); 1073 call_code()->ShortPrint(out); 1074 PrintF(out, "\n - property_accessors: "); 1075 property_accessors()->ShortPrint(out); 1076 PrintF(out, "\n - prototype_template: "); 1077 prototype_template()->ShortPrint(out); 1078 PrintF(out, "\n - parent_template: "); 1079 parent_template()->ShortPrint(out); 1080 PrintF(out, "\n - named_property_handler: "); 1081 named_property_handler()->ShortPrint(out); 1082 PrintF(out, "\n - indexed_property_handler: "); 1083 indexed_property_handler()->ShortPrint(out); 1084 PrintF(out, "\n - instance_template: "); 1085 instance_template()->ShortPrint(out); 1086 PrintF(out, "\n - signature: "); 1087 signature()->ShortPrint(out); 1088 PrintF(out, "\n - access_check_info: "); 1089 access_check_info()->ShortPrint(out); 1090 PrintF(out, "\n - hidden_prototype: %s", 1091 hidden_prototype() ? "true" : "false"); 1092 PrintF(out, "\n - undetectable: %s", undetectable() ? "true" : "false"); 1093 PrintF(out, "\n - need_access_check: %s", 1094 needs_access_check() ? "true" : "false"); 1095 } 1096 1097 1098 void ObjectTemplateInfo::ObjectTemplateInfoPrint(FILE* out) { 1099 HeapObject::PrintHeader(out, "ObjectTemplateInfo"); 1100 PrintF(out, " - tag: "); 1101 tag()->ShortPrint(out); 1102 PrintF(out, "\n - property_list: "); 1103 property_list()->ShortPrint(out); 1104 PrintF(out, "\n - property_accessors: "); 1105 property_accessors()->ShortPrint(out); 1106 PrintF(out, "\n - constructor: "); 1107 constructor()->ShortPrint(out); 1108 PrintF(out, "\n - internal_field_count: "); 1109 internal_field_count()->ShortPrint(out); 1110 PrintF(out, "\n"); 1111 } 1112 1113 1114 void SignatureInfo::SignatureInfoPrint(FILE* out) { 1115 HeapObject::PrintHeader(out, "SignatureInfo"); 1116 PrintF(out, "\n - receiver: "); 1117 receiver()->ShortPrint(out); 1118 PrintF(out, "\n - args: "); 1119 args()->ShortPrint(out); 1120 } 1121 1122 1123 void TypeSwitchInfo::TypeSwitchInfoPrint(FILE* out) { 1124 HeapObject::PrintHeader(out, "TypeSwitchInfo"); 1125 PrintF(out, "\n - types: "); 1126 types()->ShortPrint(out); 1127 } 1128 1129 1130 void AllocationSite::AllocationSitePrint(FILE* out) { 1131 HeapObject::PrintHeader(out, "AllocationSite"); 1132 PrintF(out, " - weak_next: "); 1133 weak_next()->ShortPrint(out); 1134 PrintF(out, "\n - dependent code: "); 1135 dependent_code()->ShortPrint(out); 1136 PrintF(out, "\n - nested site: "); 1137 nested_site()->ShortPrint(out); 1138 PrintF(out, "\n - memento found count: "); 1139 memento_found_count()->ShortPrint(out); 1140 PrintF(out, "\n - memento create count: "); 1141 memento_create_count()->ShortPrint(out); 1142 PrintF(out, "\n - pretenure decision: "); 1143 pretenure_decision()->ShortPrint(out); 1144 PrintF(out, "\n - transition_info: "); 1145 if (transition_info()->IsSmi()) { 1146 ElementsKind kind = GetElementsKind(); 1147 PrintF(out, "Array allocation with ElementsKind "); 1148 PrintElementsKind(out, kind); 1149 PrintF(out, "\n"); 1150 return; 1151 } else if (transition_info()->IsJSArray()) { 1152 PrintF(out, "Array literal "); 1153 transition_info()->ShortPrint(out); 1154 PrintF(out, "\n"); 1155 return; 1156 } 1157 1158 PrintF(out, "unknown transition_info"); 1159 transition_info()->ShortPrint(out); 1160 PrintF(out, "\n"); 1161 } 1162 1163 1164 void AllocationMemento::AllocationMementoPrint(FILE* out) { 1165 HeapObject::PrintHeader(out, "AllocationMemento"); 1166 PrintF(out, " - allocation site: "); 1167 if (IsValid()) { 1168 GetAllocationSite()->Print(); 1169 } else { 1170 PrintF(out, "<invalid>\n"); 1171 } 1172 } 1173 1174 1175 void Script::ScriptPrint(FILE* out) { 1176 HeapObject::PrintHeader(out, "Script"); 1177 PrintF(out, "\n - source: "); 1178 source()->ShortPrint(out); 1179 PrintF(out, "\n - name: "); 1180 name()->ShortPrint(out); 1181 PrintF(out, "\n - line_offset: "); 1182 line_offset()->ShortPrint(out); 1183 PrintF(out, "\n - column_offset: "); 1184 column_offset()->ShortPrint(out); 1185 PrintF(out, "\n - type: "); 1186 type()->ShortPrint(out); 1187 PrintF(out, "\n - id: "); 1188 id()->ShortPrint(out); 1189 PrintF(out, "\n - data: "); 1190 data()->ShortPrint(out); 1191 PrintF(out, "\n - context data: "); 1192 context_data()->ShortPrint(out); 1193 PrintF(out, "\n - wrapper: "); 1194 wrapper()->ShortPrint(out); 1195 PrintF(out, "\n - compilation type: %d", compilation_type()); 1196 PrintF(out, "\n - line ends: "); 1197 line_ends()->ShortPrint(out); 1198 PrintF(out, "\n - eval from shared: "); 1199 eval_from_shared()->ShortPrint(out); 1200 PrintF(out, "\n - eval from instructions offset: "); 1201 eval_from_instructions_offset()->ShortPrint(out); 1202 PrintF(out, "\n"); 1203 } 1204 1205 1206 #ifdef ENABLE_DEBUGGER_SUPPORT 1207 void DebugInfo::DebugInfoPrint(FILE* out) { 1208 HeapObject::PrintHeader(out, "DebugInfo"); 1209 PrintF(out, "\n - shared: "); 1210 shared()->ShortPrint(out); 1211 PrintF(out, "\n - original_code: "); 1212 original_code()->ShortPrint(out); 1213 PrintF(out, "\n - code: "); 1214 code()->ShortPrint(out); 1215 PrintF(out, "\n - break_points: "); 1216 break_points()->Print(out); 1217 } 1218 1219 1220 void BreakPointInfo::BreakPointInfoPrint(FILE* out) { 1221 HeapObject::PrintHeader(out, "BreakPointInfo"); 1222 PrintF(out, "\n - code_position: %d", code_position()->value()); 1223 PrintF(out, "\n - source_position: %d", source_position()->value()); 1224 PrintF(out, "\n - statement_position: %d", statement_position()->value()); 1225 PrintF(out, "\n - break_point_objects: "); 1226 break_point_objects()->ShortPrint(out); 1227 } 1228 #endif // ENABLE_DEBUGGER_SUPPORT 1229 1230 1231 void DescriptorArray::PrintDescriptors(FILE* out) { 1232 PrintF(out, "Descriptor array %d\n", number_of_descriptors()); 1233 for (int i = 0; i < number_of_descriptors(); i++) { 1234 PrintF(out, " %d: ", i); 1235 Descriptor desc; 1236 Get(i, &desc); 1237 desc.Print(out); 1238 } 1239 PrintF(out, "\n"); 1240 } 1241 1242 1243 void TransitionArray::PrintTransitions(FILE* out) { 1244 PrintF(out, "Transition array %d\n", number_of_transitions()); 1245 for (int i = 0; i < number_of_transitions(); i++) { 1246 PrintF(out, " %d: ", i); 1247 GetKey(i)->NamePrint(out); 1248 PrintF(out, ": "); 1249 switch (GetTargetDetails(i).type()) { 1250 case FIELD: { 1251 PrintF(out, " (transition to field)\n"); 1252 break; 1253 } 1254 case CONSTANT: 1255 PrintF(out, " (transition to constant)\n"); 1256 break; 1257 case CALLBACKS: 1258 PrintF(out, " (transition to callback)\n"); 1259 break; 1260 // Values below are never in the target descriptor array. 1261 case NORMAL: 1262 case HANDLER: 1263 case INTERCEPTOR: 1264 case TRANSITION: 1265 case NONEXISTENT: 1266 UNREACHABLE(); 1267 break; 1268 } 1269 } 1270 PrintF(out, "\n"); 1271 } 1272 1273 1274 #endif // OBJECT_PRINT 1275 1276 1277 } } // namespace v8::internal 1278