Home | History | Annotate | Download | only in src
      1 // Copyright 2010 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 static const char* TypeToString(InstanceType type);
     41 
     42 
     43 void MaybeObject::Print(FILE* out) {
     44   Object* this_as_object;
     45   if (ToObject(&this_as_object)) {
     46     if (this_as_object->IsSmi()) {
     47       Smi::cast(this_as_object)->SmiPrint(out);
     48     } else {
     49       HeapObject::cast(this_as_object)->HeapObjectPrint(out);
     50     }
     51   } else {
     52     Failure::cast(this)->FailurePrint(out);
     53   }
     54   Flush(out);
     55 }
     56 
     57 
     58 void MaybeObject::PrintLn(FILE* out) {
     59   Print(out);
     60   PrintF(out, "\n");
     61 }
     62 
     63 
     64 void HeapObject::PrintHeader(FILE* out, const char* id) {
     65   PrintF(out, "%p: [%s]\n", reinterpret_cast<void*>(this), id);
     66 }
     67 
     68 
     69 void HeapObject::HeapObjectPrint(FILE* out) {
     70   InstanceType instance_type = map()->instance_type();
     71 
     72   HandleScope scope;
     73   if (instance_type < FIRST_NONSTRING_TYPE) {
     74     String::cast(this)->StringPrint(out);
     75     return;
     76   }
     77 
     78   switch (instance_type) {
     79     case MAP_TYPE:
     80       Map::cast(this)->MapPrint(out);
     81       break;
     82     case HEAP_NUMBER_TYPE:
     83       HeapNumber::cast(this)->HeapNumberPrint(out);
     84       break;
     85     case FIXED_ARRAY_TYPE:
     86       FixedArray::cast(this)->FixedArrayPrint(out);
     87       break;
     88     case BYTE_ARRAY_TYPE:
     89       ByteArray::cast(this)->ByteArrayPrint(out);
     90       break;
     91     case EXTERNAL_PIXEL_ARRAY_TYPE:
     92       ExternalPixelArray::cast(this)->ExternalPixelArrayPrint(out);
     93       break;
     94     case EXTERNAL_BYTE_ARRAY_TYPE:
     95       ExternalByteArray::cast(this)->ExternalByteArrayPrint(out);
     96       break;
     97     case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
     98       ExternalUnsignedByteArray::cast(this)
     99           ->ExternalUnsignedByteArrayPrint(out);
    100       break;
    101     case EXTERNAL_SHORT_ARRAY_TYPE:
    102       ExternalShortArray::cast(this)->ExternalShortArrayPrint(out);
    103       break;
    104     case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
    105       ExternalUnsignedShortArray::cast(this)
    106           ->ExternalUnsignedShortArrayPrint(out);
    107       break;
    108     case EXTERNAL_INT_ARRAY_TYPE:
    109       ExternalIntArray::cast(this)->ExternalIntArrayPrint(out);
    110       break;
    111     case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
    112       ExternalUnsignedIntArray::cast(this)->ExternalUnsignedIntArrayPrint(out);
    113       break;
    114     case EXTERNAL_FLOAT_ARRAY_TYPE:
    115       ExternalFloatArray::cast(this)->ExternalFloatArrayPrint(out);
    116       break;
    117     case FILLER_TYPE:
    118       PrintF(out, "filler");
    119       break;
    120     case JS_OBJECT_TYPE:  // fall through
    121     case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
    122     case JS_ARRAY_TYPE:
    123     case JS_REGEXP_TYPE:
    124       JSObject::cast(this)->JSObjectPrint(out);
    125       break;
    126     case ODDBALL_TYPE:
    127       Oddball::cast(this)->to_string()->Print(out);
    128       break;
    129     case JS_FUNCTION_TYPE:
    130       JSFunction::cast(this)->JSFunctionPrint(out);
    131       break;
    132     case JS_GLOBAL_PROXY_TYPE:
    133       JSGlobalProxy::cast(this)->JSGlobalProxyPrint(out);
    134       break;
    135     case JS_GLOBAL_OBJECT_TYPE:
    136       JSGlobalObject::cast(this)->JSGlobalObjectPrint(out);
    137       break;
    138     case JS_BUILTINS_OBJECT_TYPE:
    139       JSBuiltinsObject::cast(this)->JSBuiltinsObjectPrint(out);
    140       break;
    141     case JS_VALUE_TYPE:
    142       PrintF(out, "Value wrapper around:");
    143       JSValue::cast(this)->value()->Print(out);
    144       break;
    145     case CODE_TYPE:
    146       Code::cast(this)->CodePrint(out);
    147       break;
    148     case PROXY_TYPE:
    149       Proxy::cast(this)->ProxyPrint(out);
    150       break;
    151     case SHARED_FUNCTION_INFO_TYPE:
    152       SharedFunctionInfo::cast(this)->SharedFunctionInfoPrint(out);
    153       break;
    154     case JS_MESSAGE_OBJECT_TYPE:
    155       JSMessageObject::cast(this)->JSMessageObjectPrint(out);
    156       break;
    157     case JS_GLOBAL_PROPERTY_CELL_TYPE:
    158       JSGlobalPropertyCell::cast(this)->JSGlobalPropertyCellPrint(out);
    159       break;
    160 #define MAKE_STRUCT_CASE(NAME, Name, name) \
    161   case NAME##_TYPE:                        \
    162     Name::cast(this)->Name##Print(out);    \
    163     break;
    164   STRUCT_LIST(MAKE_STRUCT_CASE)
    165 #undef MAKE_STRUCT_CASE
    166 
    167     default:
    168       PrintF(out, "UNKNOWN TYPE %d", map()->instance_type());
    169       UNREACHABLE();
    170       break;
    171   }
    172 }
    173 
    174 
    175 void ByteArray::ByteArrayPrint(FILE* out) {
    176   PrintF(out, "byte array, data starts at %p", GetDataStartAddress());
    177 }
    178 
    179 
    180 void ExternalPixelArray::ExternalPixelArrayPrint(FILE* out) {
    181   PrintF(out, "external pixel array");
    182 }
    183 
    184 
    185 void ExternalByteArray::ExternalByteArrayPrint(FILE* out) {
    186   PrintF(out, "external byte array");
    187 }
    188 
    189 
    190 void ExternalUnsignedByteArray::ExternalUnsignedByteArrayPrint(FILE* out) {
    191   PrintF(out, "external unsigned byte array");
    192 }
    193 
    194 
    195 void ExternalShortArray::ExternalShortArrayPrint(FILE* out) {
    196   PrintF(out, "external short array");
    197 }
    198 
    199 
    200 void ExternalUnsignedShortArray::ExternalUnsignedShortArrayPrint(FILE* out) {
    201   PrintF(out, "external unsigned short array");
    202 }
    203 
    204 
    205 void ExternalIntArray::ExternalIntArrayPrint(FILE* out) {
    206   PrintF(out, "external int array");
    207 }
    208 
    209 
    210 void ExternalUnsignedIntArray::ExternalUnsignedIntArrayPrint(FILE* out) {
    211   PrintF(out, "external unsigned int array");
    212 }
    213 
    214 
    215 void ExternalFloatArray::ExternalFloatArrayPrint(FILE* out) {
    216   PrintF(out, "external float array");
    217 }
    218 
    219 
    220 void JSObject::PrintProperties(FILE* out) {
    221   if (HasFastProperties()) {
    222     DescriptorArray* descs = map()->instance_descriptors();
    223     for (int i = 0; i < descs->number_of_descriptors(); i++) {
    224       PrintF(out, "   ");
    225       descs->GetKey(i)->StringPrint(out);
    226       PrintF(out, ": ");
    227       switch (descs->GetType(i)) {
    228         case FIELD: {
    229           int index = descs->GetFieldIndex(i);
    230           FastPropertyAt(index)->ShortPrint(out);
    231           PrintF(out, " (field at offset %d)\n", index);
    232           break;
    233         }
    234         case CONSTANT_FUNCTION:
    235           descs->GetConstantFunction(i)->ShortPrint(out);
    236           PrintF(out, " (constant function)\n");
    237           break;
    238         case CALLBACKS:
    239           descs->GetCallbacksObject(i)->ShortPrint(out);
    240           PrintF(out, " (callback)\n");
    241           break;
    242         case MAP_TRANSITION:
    243           PrintF(out, " (map transition)\n");
    244           break;
    245         case CONSTANT_TRANSITION:
    246           PrintF(out, " (constant transition)\n");
    247           break;
    248         case NULL_DESCRIPTOR:
    249           PrintF(out, " (null descriptor)\n");
    250           break;
    251         default:
    252           UNREACHABLE();
    253           break;
    254       }
    255     }
    256   } else {
    257     property_dictionary()->Print(out);
    258   }
    259 }
    260 
    261 
    262 void JSObject::PrintElements(FILE* out) {
    263   switch (GetElementsKind()) {
    264     case FAST_ELEMENTS: {
    265       // Print in array notation for non-sparse arrays.
    266       FixedArray* p = FixedArray::cast(elements());
    267       for (int i = 0; i < p->length(); i++) {
    268         PrintF(out, "   %d: ", i);
    269         p->get(i)->ShortPrint(out);
    270         PrintF(out, "\n");
    271       }
    272       break;
    273     }
    274     case EXTERNAL_PIXEL_ELEMENTS: {
    275       ExternalPixelArray* p = ExternalPixelArray::cast(elements());
    276       for (int i = 0; i < p->length(); i++) {
    277         PrintF(out, "   %d: %d\n", i, p->get(i));
    278       }
    279       break;
    280     }
    281     case EXTERNAL_BYTE_ELEMENTS: {
    282       ExternalByteArray* p = ExternalByteArray::cast(elements());
    283       for (int i = 0; i < p->length(); i++) {
    284         PrintF(out, "   %d: %d\n", i, static_cast<int>(p->get(i)));
    285       }
    286       break;
    287     }
    288     case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: {
    289       ExternalUnsignedByteArray* p =
    290           ExternalUnsignedByteArray::cast(elements());
    291       for (int i = 0; i < p->length(); i++) {
    292         PrintF(out, "   %d: %d\n", i, static_cast<int>(p->get(i)));
    293       }
    294       break;
    295     }
    296     case EXTERNAL_SHORT_ELEMENTS: {
    297       ExternalShortArray* p = ExternalShortArray::cast(elements());
    298       for (int i = 0; i < p->length(); i++) {
    299         PrintF(out, "   %d: %d\n", i, static_cast<int>(p->get(i)));
    300       }
    301       break;
    302     }
    303     case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: {
    304       ExternalUnsignedShortArray* p =
    305           ExternalUnsignedShortArray::cast(elements());
    306       for (int i = 0; i < p->length(); i++) {
    307         PrintF(out, "   %d: %d\n", i, static_cast<int>(p->get(i)));
    308       }
    309       break;
    310     }
    311     case EXTERNAL_INT_ELEMENTS: {
    312       ExternalIntArray* p = ExternalIntArray::cast(elements());
    313       for (int i = 0; i < p->length(); i++) {
    314         PrintF(out, "   %d: %d\n", i, static_cast<int>(p->get(i)));
    315       }
    316       break;
    317     }
    318     case EXTERNAL_UNSIGNED_INT_ELEMENTS: {
    319       ExternalUnsignedIntArray* p =
    320           ExternalUnsignedIntArray::cast(elements());
    321       for (int i = 0; i < p->length(); i++) {
    322         PrintF(out, "   %d: %d\n", i, static_cast<int>(p->get(i)));
    323       }
    324       break;
    325     }
    326     case EXTERNAL_FLOAT_ELEMENTS: {
    327       ExternalFloatArray* p = ExternalFloatArray::cast(elements());
    328       for (int i = 0; i < p->length(); i++) {
    329         PrintF(out, "   %d: %f\n", i, p->get(i));
    330       }
    331       break;
    332     }
    333     case DICTIONARY_ELEMENTS:
    334       elements()->Print(out);
    335       break;
    336     default:
    337       UNREACHABLE();
    338       break;
    339   }
    340 }
    341 
    342 
    343 void JSObject::JSObjectPrint(FILE* out) {
    344   PrintF(out, "%p: [JSObject]\n", reinterpret_cast<void*>(this));
    345   PrintF(out, " - map = %p\n", reinterpret_cast<void*>(map()));
    346   PrintF(out, " - prototype = %p\n", reinterpret_cast<void*>(GetPrototype()));
    347   PrintF(out, " {\n");
    348   PrintProperties(out);
    349   PrintElements(out);
    350   PrintF(out, " }\n");
    351 }
    352 
    353 
    354 static const char* TypeToString(InstanceType type) {
    355   switch (type) {
    356     case INVALID_TYPE: return "INVALID";
    357     case MAP_TYPE: return "MAP";
    358     case HEAP_NUMBER_TYPE: return "HEAP_NUMBER";
    359     case SYMBOL_TYPE: return "SYMBOL";
    360     case ASCII_SYMBOL_TYPE: return "ASCII_SYMBOL";
    361     case CONS_SYMBOL_TYPE: return "CONS_SYMBOL";
    362     case CONS_ASCII_SYMBOL_TYPE: return "CONS_ASCII_SYMBOL";
    363     case EXTERNAL_ASCII_SYMBOL_TYPE:
    364     case EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE:
    365     case EXTERNAL_SYMBOL_TYPE: return "EXTERNAL_SYMBOL";
    366     case ASCII_STRING_TYPE: return "ASCII_STRING";
    367     case STRING_TYPE: return "TWO_BYTE_STRING";
    368     case CONS_STRING_TYPE:
    369     case CONS_ASCII_STRING_TYPE: return "CONS_STRING";
    370     case EXTERNAL_ASCII_STRING_TYPE:
    371     case EXTERNAL_STRING_WITH_ASCII_DATA_TYPE:
    372     case EXTERNAL_STRING_TYPE: return "EXTERNAL_STRING";
    373     case FIXED_ARRAY_TYPE: return "FIXED_ARRAY";
    374     case BYTE_ARRAY_TYPE: return "BYTE_ARRAY";
    375     case EXTERNAL_PIXEL_ARRAY_TYPE: return "EXTERNAL_PIXEL_ARRAY";
    376     case EXTERNAL_BYTE_ARRAY_TYPE: return "EXTERNAL_BYTE_ARRAY";
    377     case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
    378       return "EXTERNAL_UNSIGNED_BYTE_ARRAY";
    379     case EXTERNAL_SHORT_ARRAY_TYPE: return "EXTERNAL_SHORT_ARRAY";
    380     case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
    381       return "EXTERNAL_UNSIGNED_SHORT_ARRAY";
    382     case EXTERNAL_INT_ARRAY_TYPE: return "EXTERNAL_INT_ARRAY";
    383     case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
    384       return "EXTERNAL_UNSIGNED_INT_ARRAY";
    385     case EXTERNAL_FLOAT_ARRAY_TYPE: return "EXTERNAL_FLOAT_ARRAY";
    386     case FILLER_TYPE: return "FILLER";
    387     case JS_OBJECT_TYPE: return "JS_OBJECT";
    388     case JS_CONTEXT_EXTENSION_OBJECT_TYPE: return "JS_CONTEXT_EXTENSION_OBJECT";
    389     case ODDBALL_TYPE: return "ODDBALL";
    390     case JS_GLOBAL_PROPERTY_CELL_TYPE: return "JS_GLOBAL_PROPERTY_CELL";
    391     case SHARED_FUNCTION_INFO_TYPE: return "SHARED_FUNCTION_INFO";
    392     case JS_FUNCTION_TYPE: return "JS_FUNCTION";
    393     case CODE_TYPE: return "CODE";
    394     case JS_ARRAY_TYPE: return "JS_ARRAY";
    395     case JS_REGEXP_TYPE: return "JS_REGEXP";
    396     case JS_VALUE_TYPE: return "JS_VALUE";
    397     case JS_GLOBAL_OBJECT_TYPE: return "JS_GLOBAL_OBJECT";
    398     case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT";
    399     case JS_GLOBAL_PROXY_TYPE: return "JS_GLOBAL_PROXY";
    400     case PROXY_TYPE: return "PROXY";
    401     case LAST_STRING_TYPE: return "LAST_STRING_TYPE";
    402     case JS_MESSAGE_OBJECT_TYPE: return "JS_MESSAGE_OBJECT_TYPE";
    403 #define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME;
    404   STRUCT_LIST(MAKE_STRUCT_CASE)
    405 #undef MAKE_STRUCT_CASE
    406   }
    407   return "UNKNOWN";
    408 }
    409 
    410 
    411 void Map::MapPrint(FILE* out) {
    412   HeapObject::PrintHeader(out, "Map");
    413   PrintF(out, " - type: %s\n", TypeToString(instance_type()));
    414   PrintF(out, " - instance size: %d\n", instance_size());
    415   PrintF(out, " - inobject properties: %d\n", inobject_properties());
    416   PrintF(out, " - pre-allocated property fields: %d\n",
    417       pre_allocated_property_fields());
    418   PrintF(out, " - unused property fields: %d\n", unused_property_fields());
    419   if (is_hidden_prototype()) {
    420     PrintF(out, " - hidden_prototype\n");
    421   }
    422   if (has_named_interceptor()) {
    423     PrintF(out, " - named_interceptor\n");
    424   }
    425   if (has_indexed_interceptor()) {
    426     PrintF(out, " - indexed_interceptor\n");
    427   }
    428   if (is_undetectable()) {
    429     PrintF(out, " - undetectable\n");
    430   }
    431   if (has_instance_call_handler()) {
    432     PrintF(out, " - instance_call_handler\n");
    433   }
    434   if (is_access_check_needed()) {
    435     PrintF(out, " - access_check_needed\n");
    436   }
    437   PrintF(out, " - instance descriptors: ");
    438   instance_descriptors()->ShortPrint(out);
    439   PrintF(out, "\n - prototype: ");
    440   prototype()->ShortPrint(out);
    441   PrintF(out, "\n - constructor: ");
    442   constructor()->ShortPrint(out);
    443   PrintF(out, "\n");
    444 }
    445 
    446 
    447 void CodeCache::CodeCachePrint(FILE* out) {
    448   HeapObject::PrintHeader(out, "CodeCache");
    449   PrintF(out, "\n - default_cache: ");
    450   default_cache()->ShortPrint(out);
    451   PrintF(out, "\n - normal_type_cache: ");
    452   normal_type_cache()->ShortPrint(out);
    453 }
    454 
    455 
    456 void FixedArray::FixedArrayPrint(FILE* out) {
    457   HeapObject::PrintHeader(out, "FixedArray");
    458   PrintF(out, " - length: %d", length());
    459   for (int i = 0; i < length(); i++) {
    460     PrintF(out, "\n  [%d]: ", i);
    461     get(i)->ShortPrint(out);
    462   }
    463   PrintF(out, "\n");
    464 }
    465 
    466 
    467 void JSValue::JSValuePrint(FILE* out) {
    468   HeapObject::PrintHeader(out, "ValueObject");
    469   value()->Print(out);
    470 }
    471 
    472 
    473 void JSMessageObject::JSMessageObjectPrint(FILE* out) {
    474   HeapObject::PrintHeader(out, "JSMessageObject");
    475   PrintF(out, " - type: ");
    476   type()->ShortPrint(out);
    477   PrintF(out, "\n - arguments: ");
    478   arguments()->ShortPrint(out);
    479   PrintF(out, "\n - start_position: %d", start_position());
    480   PrintF(out, "\n - end_position: %d", end_position());
    481   PrintF(out, "\n - script: ");
    482   script()->ShortPrint(out);
    483   PrintF(out, "\n - stack_trace: ");
    484   stack_trace()->ShortPrint(out);
    485   PrintF(out, "\n - stack_frames: ");
    486   stack_frames()->ShortPrint(out);
    487   PrintF(out, "\n");
    488 }
    489 
    490 
    491 void String::StringPrint(FILE* out) {
    492   if (StringShape(this).IsSymbol()) {
    493     PrintF(out, "#");
    494   } else if (StringShape(this).IsCons()) {
    495     PrintF(out, "c\"");
    496   } else {
    497     PrintF(out, "\"");
    498   }
    499 
    500   const char truncated_epilogue[] = "...<truncated>";
    501   int len = length();
    502   if (!FLAG_use_verbose_printer) {
    503     if (len > 100) {
    504       len = 100 - sizeof(truncated_epilogue);
    505     }
    506   }
    507   for (int i = 0; i < len; i++) {
    508     PrintF(out, "%c", Get(i));
    509   }
    510   if (len != length()) {
    511     PrintF(out, "%s", truncated_epilogue);
    512   }
    513 
    514   if (!StringShape(this).IsSymbol()) PrintF(out, "\"");
    515 }
    516 
    517 
    518 void JSFunction::JSFunctionPrint(FILE* out) {
    519   HeapObject::PrintHeader(out, "Function");
    520   PrintF(out, " - map = 0x%p\n", reinterpret_cast<void*>(map()));
    521   PrintF(out, " - initial_map = ");
    522   if (has_initial_map()) {
    523     initial_map()->ShortPrint(out);
    524   }
    525   PrintF(out, "\n - shared_info = ");
    526   shared()->ShortPrint(out);
    527   PrintF(out, "\n   - name = ");
    528   shared()->name()->Print(out);
    529   PrintF(out, "\n - context = ");
    530   unchecked_context()->ShortPrint(out);
    531   PrintF(out, "\n - code = ");
    532   code()->ShortPrint(out);
    533   PrintF(out, "\n");
    534 
    535   PrintProperties(out);
    536   PrintElements(out);
    537 
    538   PrintF(out, "\n");
    539 }
    540 
    541 
    542 void SharedFunctionInfo::SharedFunctionInfoPrint(FILE* out) {
    543   HeapObject::PrintHeader(out, "SharedFunctionInfo");
    544   PrintF(out, " - name: ");
    545   name()->ShortPrint(out);
    546   PrintF(out, "\n - expected_nof_properties: %d", expected_nof_properties());
    547   PrintF(out, "\n - instance class name = ");
    548   instance_class_name()->Print(out);
    549   PrintF(out, "\n - code = ");
    550   code()->ShortPrint(out);
    551   PrintF(out, "\n - source code = ");
    552   GetSourceCode()->ShortPrint(out);
    553   // Script files are often large, hard to read.
    554   // PrintF(out, "\n - script =");
    555   // script()->Print(out);
    556   PrintF(out, "\n - function token position = %d", function_token_position());
    557   PrintF(out, "\n - start position = %d", start_position());
    558   PrintF(out, "\n - end position = %d", end_position());
    559   PrintF(out, "\n - is expression = %d", is_expression());
    560   PrintF(out, "\n - debug info = ");
    561   debug_info()->ShortPrint(out);
    562   PrintF(out, "\n - length = %d", length());
    563   PrintF(out, "\n - has_only_simple_this_property_assignments = %d",
    564          has_only_simple_this_property_assignments());
    565   PrintF(out, "\n - this_property_assignments = ");
    566   this_property_assignments()->ShortPrint(out);
    567   PrintF(out, "\n");
    568 }
    569 
    570 
    571 void JSGlobalProxy::JSGlobalProxyPrint(FILE* out) {
    572   PrintF(out, "global_proxy");
    573   JSObjectPrint(out);
    574   PrintF(out, "context : ");
    575   context()->ShortPrint(out);
    576   PrintF(out, "\n");
    577 }
    578 
    579 
    580 void JSGlobalObject::JSGlobalObjectPrint(FILE* out) {
    581   PrintF(out, "global ");
    582   JSObjectPrint(out);
    583   PrintF(out, "global context : ");
    584   global_context()->ShortPrint(out);
    585   PrintF(out, "\n");
    586 }
    587 
    588 
    589 void JSBuiltinsObject::JSBuiltinsObjectPrint(FILE* out) {
    590   PrintF(out, "builtins ");
    591   JSObjectPrint(out);
    592 }
    593 
    594 
    595 void JSGlobalPropertyCell::JSGlobalPropertyCellPrint(FILE* out) {
    596   HeapObject::PrintHeader(out, "JSGlobalPropertyCell");
    597 }
    598 
    599 
    600 void Code::CodePrint(FILE* out) {
    601   HeapObject::PrintHeader(out, "Code");
    602 #ifdef ENABLE_DISASSEMBLER
    603   if (FLAG_use_verbose_printer) {
    604     Disassemble(NULL, out);
    605   }
    606 #endif
    607 }
    608 
    609 
    610 void Proxy::ProxyPrint(FILE* out) {
    611   PrintF(out, "proxy to %p", proxy());
    612 }
    613 
    614 
    615 void AccessorInfo::AccessorInfoPrint(FILE* out) {
    616   HeapObject::PrintHeader(out, "AccessorInfo");
    617   PrintF(out, "\n - getter: ");
    618   getter()->ShortPrint(out);
    619   PrintF(out, "\n - setter: ");
    620   setter()->ShortPrint(out);
    621   PrintF(out, "\n - name: ");
    622   name()->ShortPrint(out);
    623   PrintF(out, "\n - data: ");
    624   data()->ShortPrint(out);
    625   PrintF(out, "\n - flag: ");
    626   flag()->ShortPrint(out);
    627 }
    628 
    629 
    630 void AccessCheckInfo::AccessCheckInfoPrint(FILE* out) {
    631   HeapObject::PrintHeader(out, "AccessCheckInfo");
    632   PrintF(out, "\n - named_callback: ");
    633   named_callback()->ShortPrint(out);
    634   PrintF(out, "\n - indexed_callback: ");
    635   indexed_callback()->ShortPrint(out);
    636   PrintF(out, "\n - data: ");
    637   data()->ShortPrint(out);
    638 }
    639 
    640 
    641 void InterceptorInfo::InterceptorInfoPrint(FILE* out) {
    642   HeapObject::PrintHeader(out, "InterceptorInfo");
    643   PrintF(out, "\n - getter: ");
    644   getter()->ShortPrint(out);
    645   PrintF(out, "\n - setter: ");
    646   setter()->ShortPrint(out);
    647   PrintF(out, "\n - query: ");
    648   query()->ShortPrint(out);
    649   PrintF(out, "\n - deleter: ");
    650   deleter()->ShortPrint(out);
    651   PrintF(out, "\n - enumerator: ");
    652   enumerator()->ShortPrint(out);
    653   PrintF(out, "\n - data: ");
    654   data()->ShortPrint(out);
    655 }
    656 
    657 
    658 void CallHandlerInfo::CallHandlerInfoPrint(FILE* out) {
    659   HeapObject::PrintHeader(out, "CallHandlerInfo");
    660   PrintF(out, "\n - callback: ");
    661   callback()->ShortPrint(out);
    662   PrintF(out, "\n - data: ");
    663   data()->ShortPrint(out);
    664   PrintF(out, "\n - call_stub_cache: ");
    665 }
    666 
    667 
    668 void FunctionTemplateInfo::FunctionTemplateInfoPrint(FILE* out) {
    669   HeapObject::PrintHeader(out, "FunctionTemplateInfo");
    670   PrintF(out, "\n - class name: ");
    671   class_name()->ShortPrint(out);
    672   PrintF(out, "\n - tag: ");
    673   tag()->ShortPrint(out);
    674   PrintF(out, "\n - property_list: ");
    675   property_list()->ShortPrint(out);
    676   PrintF(out, "\n - serial_number: ");
    677   serial_number()->ShortPrint(out);
    678   PrintF(out, "\n - call_code: ");
    679   call_code()->ShortPrint(out);
    680   PrintF(out, "\n - property_accessors: ");
    681   property_accessors()->ShortPrint(out);
    682   PrintF(out, "\n - prototype_template: ");
    683   prototype_template()->ShortPrint(out);
    684   PrintF(out, "\n - parent_template: ");
    685   parent_template()->ShortPrint(out);
    686   PrintF(out, "\n - named_property_handler: ");
    687   named_property_handler()->ShortPrint(out);
    688   PrintF(out, "\n - indexed_property_handler: ");
    689   indexed_property_handler()->ShortPrint(out);
    690   PrintF(out, "\n - instance_template: ");
    691   instance_template()->ShortPrint(out);
    692   PrintF(out, "\n - signature: ");
    693   signature()->ShortPrint(out);
    694   PrintF(out, "\n - access_check_info: ");
    695   access_check_info()->ShortPrint(out);
    696   PrintF(out, "\n - hidden_prototype: %s",
    697          hidden_prototype() ? "true" : "false");
    698   PrintF(out, "\n - undetectable: %s", undetectable() ? "true" : "false");
    699   PrintF(out, "\n - need_access_check: %s",
    700          needs_access_check() ? "true" : "false");
    701 }
    702 
    703 
    704 void ObjectTemplateInfo::ObjectTemplateInfoPrint(FILE* out) {
    705   HeapObject::PrintHeader(out, "ObjectTemplateInfo");
    706   PrintF(out, "\n - constructor: ");
    707   constructor()->ShortPrint(out);
    708   PrintF(out, "\n - internal_field_count: ");
    709   internal_field_count()->ShortPrint(out);
    710 }
    711 
    712 
    713 void SignatureInfo::SignatureInfoPrint(FILE* out) {
    714   HeapObject::PrintHeader(out, "SignatureInfo");
    715   PrintF(out, "\n - receiver: ");
    716   receiver()->ShortPrint(out);
    717   PrintF(out, "\n - args: ");
    718   args()->ShortPrint(out);
    719 }
    720 
    721 
    722 void TypeSwitchInfo::TypeSwitchInfoPrint(FILE* out) {
    723   HeapObject::PrintHeader(out, "TypeSwitchInfo");
    724   PrintF(out, "\n - types: ");
    725   types()->ShortPrint(out);
    726 }
    727 
    728 
    729 void Script::ScriptPrint(FILE* out) {
    730   HeapObject::PrintHeader(out, "Script");
    731   PrintF(out, "\n - source: ");
    732   source()->ShortPrint(out);
    733   PrintF(out, "\n - name: ");
    734   name()->ShortPrint(out);
    735   PrintF(out, "\n - line_offset: ");
    736   line_offset()->ShortPrint(out);
    737   PrintF(out, "\n - column_offset: ");
    738   column_offset()->ShortPrint(out);
    739   PrintF(out, "\n - type: ");
    740   type()->ShortPrint(out);
    741   PrintF(out, "\n - id: ");
    742   id()->ShortPrint(out);
    743   PrintF(out, "\n - data: ");
    744   data()->ShortPrint(out);
    745   PrintF(out, "\n - context data: ");
    746   context_data()->ShortPrint(out);
    747   PrintF(out, "\n - wrapper: ");
    748   wrapper()->ShortPrint(out);
    749   PrintF(out, "\n - compilation type: ");
    750   compilation_type()->ShortPrint(out);
    751   PrintF(out, "\n - line ends: ");
    752   line_ends()->ShortPrint(out);
    753   PrintF(out, "\n - eval from shared: ");
    754   eval_from_shared()->ShortPrint(out);
    755   PrintF(out, "\n - eval from instructions offset: ");
    756   eval_from_instructions_offset()->ShortPrint(out);
    757   PrintF(out, "\n");
    758 }
    759 
    760 
    761 #ifdef ENABLE_DEBUGGER_SUPPORT
    762 void DebugInfo::DebugInfoPrint(FILE* out) {
    763   HeapObject::PrintHeader(out, "DebugInfo");
    764   PrintF(out, "\n - shared: ");
    765   shared()->ShortPrint(out);
    766   PrintF(out, "\n - original_code: ");
    767   original_code()->ShortPrint(out);
    768   PrintF(out, "\n - code: ");
    769   code()->ShortPrint(out);
    770   PrintF(out, "\n - break_points: ");
    771   break_points()->Print(out);
    772 }
    773 
    774 
    775 void BreakPointInfo::BreakPointInfoPrint(FILE* out) {
    776   HeapObject::PrintHeader(out, "BreakPointInfo");
    777   PrintF(out, "\n - code_position: %d", code_position()->value());
    778   PrintF(out, "\n - source_position: %d", source_position()->value());
    779   PrintF(out, "\n - statement_position: %d", statement_position()->value());
    780   PrintF(out, "\n - break_point_objects: ");
    781   break_point_objects()->ShortPrint(out);
    782 }
    783 #endif  // ENABLE_DEBUGGER_SUPPORT
    784 
    785 
    786 void DescriptorArray::PrintDescriptors(FILE* out) {
    787   PrintF(out, "Descriptor array  %d\n", number_of_descriptors());
    788   for (int i = 0; i < number_of_descriptors(); i++) {
    789     PrintF(out, " %d: ", i);
    790     Descriptor desc;
    791     Get(i, &desc);
    792     desc.Print(out);
    793   }
    794   PrintF(out, "\n");
    795 }
    796 
    797 
    798 #endif  // OBJECT_PRINT
    799 
    800 
    801 } }  // namespace v8::internal
    802