objects-printer.cc revision 44f0eee88ff00398ff7f715fab053374d808c90d
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
35namespace v8 {
36namespace internal {
37
38#ifdef OBJECT_PRINT
39
40static const char* TypeToString(InstanceType type);
41
42
43void 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
58void MaybeObject::PrintLn(FILE* out) {
59  Print(out);
60  PrintF(out, "\n");
61}
62
63
64void HeapObject::PrintHeader(FILE* out, const char* id) {
65  PrintF(out, "%p: [%s]\n", reinterpret_cast<void*>(this), id);
66}
67
68
69void 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
175void ByteArray::ByteArrayPrint(FILE* out) {
176  PrintF(out, "byte array, data starts at %p", GetDataStartAddress());
177}
178
179
180void ExternalPixelArray::ExternalPixelArrayPrint(FILE* out) {
181  PrintF(out, "external pixel array");
182}
183
184
185void ExternalByteArray::ExternalByteArrayPrint(FILE* out) {
186  PrintF(out, "external byte array");
187}
188
189
190void ExternalUnsignedByteArray::ExternalUnsignedByteArrayPrint(FILE* out) {
191  PrintF(out, "external unsigned byte array");
192}
193
194
195void ExternalShortArray::ExternalShortArrayPrint(FILE* out) {
196  PrintF(out, "external short array");
197}
198
199
200void ExternalUnsignedShortArray::ExternalUnsignedShortArrayPrint(FILE* out) {
201  PrintF(out, "external unsigned short array");
202}
203
204
205void ExternalIntArray::ExternalIntArrayPrint(FILE* out) {
206  PrintF(out, "external int array");
207}
208
209
210void ExternalUnsignedIntArray::ExternalUnsignedIntArrayPrint(FILE* out) {
211  PrintF(out, "external unsigned int array");
212}
213
214
215void ExternalFloatArray::ExternalFloatArrayPrint(FILE* out) {
216  PrintF(out, "external float array");
217}
218
219
220void 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
262void 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
343void 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
354static 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
411void 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
447void 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
456void 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
467void JSValue::JSValuePrint(FILE* out) {
468  HeapObject::PrintHeader(out, "ValueObject");
469  value()->Print(out);
470}
471
472
473void 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
491void 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
518void 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
542void 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
571void 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
580void 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
589void JSBuiltinsObject::JSBuiltinsObjectPrint(FILE* out) {
590  PrintF(out, "builtins ");
591  JSObjectPrint(out);
592}
593
594
595void JSGlobalPropertyCell::JSGlobalPropertyCellPrint(FILE* out) {
596  HeapObject::PrintHeader(out, "JSGlobalPropertyCell");
597}
598
599
600void 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
610void Proxy::ProxyPrint(FILE* out) {
611  PrintF(out, "proxy to %p", proxy());
612}
613
614
615void 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
630void 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
641void 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
658void 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
668void 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
704void 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
713void 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
722void TypeSwitchInfo::TypeSwitchInfoPrint(FILE* out) {
723  HeapObject::PrintHeader(out, "TypeSwitchInfo");
724  PrintF(out, "\n - types: ");
725  types()->ShortPrint(out);
726}
727
728
729void 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
762void 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
775void 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
786void 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