• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Print(FILE * out)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 
PrintLn(FILE * out)58 void MaybeObject::PrintLn(FILE* out) {
59   Print(out);
60   PrintF(out, "\n");
61 }
62 
63 
PrintHeader(FILE * out,const char * id)64 void HeapObject::PrintHeader(FILE* out, const char* id) {
65   PrintF(out, "%p: [%s]\n", reinterpret_cast<void*>(this), id);
66 }
67 
68 
HeapObjectPrint(FILE * out)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 
ByteArrayPrint(FILE * out)175 void ByteArray::ByteArrayPrint(FILE* out) {
176   PrintF(out, "byte array, data starts at %p", GetDataStartAddress());
177 }
178 
179 
ExternalPixelArrayPrint(FILE * out)180 void ExternalPixelArray::ExternalPixelArrayPrint(FILE* out) {
181   PrintF(out, "external pixel array");
182 }
183 
184 
ExternalByteArrayPrint(FILE * out)185 void ExternalByteArray::ExternalByteArrayPrint(FILE* out) {
186   PrintF(out, "external byte array");
187 }
188 
189 
ExternalUnsignedByteArrayPrint(FILE * out)190 void ExternalUnsignedByteArray::ExternalUnsignedByteArrayPrint(FILE* out) {
191   PrintF(out, "external unsigned byte array");
192 }
193 
194 
ExternalShortArrayPrint(FILE * out)195 void ExternalShortArray::ExternalShortArrayPrint(FILE* out) {
196   PrintF(out, "external short array");
197 }
198 
199 
ExternalUnsignedShortArrayPrint(FILE * out)200 void ExternalUnsignedShortArray::ExternalUnsignedShortArrayPrint(FILE* out) {
201   PrintF(out, "external unsigned short array");
202 }
203 
204 
ExternalIntArrayPrint(FILE * out)205 void ExternalIntArray::ExternalIntArrayPrint(FILE* out) {
206   PrintF(out, "external int array");
207 }
208 
209 
ExternalUnsignedIntArrayPrint(FILE * out)210 void ExternalUnsignedIntArray::ExternalUnsignedIntArrayPrint(FILE* out) {
211   PrintF(out, "external unsigned int array");
212 }
213 
214 
ExternalFloatArrayPrint(FILE * out)215 void ExternalFloatArray::ExternalFloatArrayPrint(FILE* out) {
216   PrintF(out, "external float array");
217 }
218 
219 
PrintProperties(FILE * out)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 
PrintElements(FILE * out)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 
JSObjectPrint(FILE * out)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 
TypeToString(InstanceType type)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 
MapPrint(FILE * out)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 
CodeCachePrint(FILE * out)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 
FixedArrayPrint(FILE * out)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 
JSValuePrint(FILE * out)467 void JSValue::JSValuePrint(FILE* out) {
468   HeapObject::PrintHeader(out, "ValueObject");
469   value()->Print(out);
470 }
471 
472 
JSMessageObjectPrint(FILE * out)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 
StringPrint(FILE * out)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 
JSFunctionPrint(FILE * out)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 
SharedFunctionInfoPrint(FILE * out)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 
JSGlobalProxyPrint(FILE * out)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 
JSGlobalObjectPrint(FILE * out)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 
JSBuiltinsObjectPrint(FILE * out)589 void JSBuiltinsObject::JSBuiltinsObjectPrint(FILE* out) {
590   PrintF(out, "builtins ");
591   JSObjectPrint(out);
592 }
593 
594 
JSGlobalPropertyCellPrint(FILE * out)595 void JSGlobalPropertyCell::JSGlobalPropertyCellPrint(FILE* out) {
596   HeapObject::PrintHeader(out, "JSGlobalPropertyCell");
597 }
598 
599 
CodePrint(FILE * out)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 
ProxyPrint(FILE * out)610 void Proxy::ProxyPrint(FILE* out) {
611   PrintF(out, "proxy to %p", proxy());
612 }
613 
614 
AccessorInfoPrint(FILE * out)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 
AccessCheckInfoPrint(FILE * out)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 
InterceptorInfoPrint(FILE * out)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 
CallHandlerInfoPrint(FILE * out)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 
FunctionTemplateInfoPrint(FILE * out)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 
ObjectTemplateInfoPrint(FILE * out)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 
SignatureInfoPrint(FILE * out)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 
TypeSwitchInfoPrint(FILE * out)722 void TypeSwitchInfo::TypeSwitchInfoPrint(FILE* out) {
723   HeapObject::PrintHeader(out, "TypeSwitchInfo");
724   PrintF(out, "\n - types: ");
725   types()->ShortPrint(out);
726 }
727 
728 
ScriptPrint(FILE * out)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
DebugInfoPrint(FILE * out)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 
BreakPointInfoPrint(FILE * out)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 
PrintDescriptors(FILE * out)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