Home | History | Annotate | Download | only in src
      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