blob: 67bc62e7e2c9d16c8c69f32741dd170263a5ad2c [file] [log] [blame]
Ben Murdoch3ef787d2012-04-12 10:51:47 +01001// Copyright 2012 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Block9fac8402011-05-12 15:51:54 +01004
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00005#include "src/objects.h"
Steve Block9fac8402011-05-12 15:51:54 +01006
Ben Murdochb8a8cc12014-11-26 15:28:44 +00007#include "src/disasm.h"
8#include "src/disassembler.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00009#include "src/interpreter/bytecodes.h"
10#include "src/objects-inl.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011#include "src/ostreams.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000012#include "src/regexp/jsregexp.h"
Steve Block9fac8402011-05-12 15:51:54 +010013
14namespace v8 {
15namespace internal {
16
17#ifdef OBJECT_PRINT
18
Ben Murdochb8a8cc12014-11-26 15:28:44 +000019void Object::Print() {
20 OFStream os(stdout);
21 this->Print(os);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040022 os << std::flush;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000023}
Steve Block9fac8402011-05-12 15:51:54 +010024
25
Emily Bernierd0a1eb72015-03-24 16:35:39 -040026void Object::Print(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +000027 if (IsSmi()) {
28 Smi::cast(this)->SmiPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +010029 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000030 HeapObject::cast(this)->HeapObjectPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +010031 }
Steve Block9fac8402011-05-12 15:51:54 +010032}
33
34
Emily Bernierd0a1eb72015-03-24 16:35:39 -040035void HeapObject::PrintHeader(std::ostream& os, const char* id) { // NOLINT
Ben Murdoch097c5b22016-05-18 11:27:45 +010036 os << reinterpret_cast<void*>(this) << ": [" << id << "]";
Steve Block9fac8402011-05-12 15:51:54 +010037}
38
39
Emily Bernierd0a1eb72015-03-24 16:35:39 -040040void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT
Steve Block9fac8402011-05-12 15:51:54 +010041 InstanceType instance_type = map()->instance_type();
42
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043 HandleScope scope(GetIsolate());
Steve Block9fac8402011-05-12 15:51:54 +010044 if (instance_type < FIRST_NONSTRING_TYPE) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000045 String::cast(this)->StringPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +010046 return;
47 }
48
49 switch (instance_type) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000050 case SYMBOL_TYPE:
51 Symbol::cast(this)->SymbolPrint(os);
52 break;
Steve Block9fac8402011-05-12 15:51:54 +010053 case MAP_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +000054 Map::cast(this)->MapPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +010055 break;
56 case HEAP_NUMBER_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057 HeapNumber::cast(this)->HeapNumberPrint(os);
58 break;
59 case MUTABLE_HEAP_NUMBER_TYPE:
60 os << "<mutable ";
61 HeapNumber::cast(this)->HeapNumberPrint(os);
62 os << ">";
Steve Block9fac8402011-05-12 15:51:54 +010063 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000064 case SIMD128_VALUE_TYPE:
65 Simd128Value::cast(this)->Simd128ValuePrint(os);
66 break;
Ben Murdoch3ef787d2012-04-12 10:51:47 +010067 case FIXED_DOUBLE_ARRAY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +000068 FixedDoubleArray::cast(this)->FixedDoubleArrayPrint(os);
69 break;
Steve Block9fac8402011-05-12 15:51:54 +010070 case FIXED_ARRAY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +000071 FixedArray::cast(this)->FixedArrayPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +010072 break;
73 case BYTE_ARRAY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +000074 ByteArray::cast(this)->ByteArrayPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +010075 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000076 case BYTECODE_ARRAY_TYPE:
77 BytecodeArray::cast(this)->BytecodeArrayPrint(os);
78 break;
79 case TRANSITION_ARRAY_TYPE:
80 TransitionArray::cast(this)->TransitionArrayPrint(os);
81 break;
Ben Murdoch3ef787d2012-04-12 10:51:47 +010082 case FREE_SPACE_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +000083 FreeSpace::cast(this)->FreeSpacePrint(os);
Ben Murdoch3ef787d2012-04-12 10:51:47 +010084 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000085
Ben Murdochb8a8cc12014-11-26 15:28:44 +000086#define PRINT_FIXED_TYPED_ARRAY(Type, type, TYPE, ctype, size) \
87 case Fixed##Type##Array::kInstanceType: \
88 Fixed##Type##Array::cast(this)->FixedTypedArrayPrint(os); \
89 break;
90
91 TYPED_ARRAYS(PRINT_FIXED_TYPED_ARRAY)
92#undef PRINT_FIXED_TYPED_ARRAY
93
Steve Block9fac8402011-05-12 15:51:54 +010094 case FILLER_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +000095 os << "filler";
Steve Block9fac8402011-05-12 15:51:54 +010096 break;
97 case JS_OBJECT_TYPE: // fall through
98 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
99 case JS_ARRAY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000100 case JS_GENERATOR_OBJECT_TYPE:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000101 case JS_PROMISE_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000102 JSObject::cast(this)->JSObjectPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100103 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000104 case JS_REGEXP_TYPE:
105 JSRegExp::cast(this)->JSRegExpPrint(os);
106 break;
Steve Block9fac8402011-05-12 15:51:54 +0100107 case ODDBALL_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000108 Oddball::cast(this)->to_string()->Print(os);
109 break;
110 case JS_MODULE_TYPE:
111 JSModule::cast(this)->JSModulePrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100112 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000113 case JS_BOUND_FUNCTION_TYPE:
114 JSBoundFunction::cast(this)->JSBoundFunctionPrint(os);
115 break;
Steve Block9fac8402011-05-12 15:51:54 +0100116 case JS_FUNCTION_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000117 JSFunction::cast(this)->JSFunctionPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100118 break;
119 case JS_GLOBAL_PROXY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000120 JSGlobalProxy::cast(this)->JSGlobalProxyPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100121 break;
122 case JS_GLOBAL_OBJECT_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000123 JSGlobalObject::cast(this)->JSGlobalObjectPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100124 break;
Steve Block9fac8402011-05-12 15:51:54 +0100125 case JS_VALUE_TYPE:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000126 JSValue::cast(this)->JSValuePrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100127 break;
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100128 case JS_DATE_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129 JSDate::cast(this)->JSDatePrint(os);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100130 break;
Steve Block9fac8402011-05-12 15:51:54 +0100131 case CODE_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000132 Code::cast(this)->CodePrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100133 break;
Ben Murdoch257744e2011-11-30 15:57:28 +0000134 case JS_PROXY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000135 JSProxy::cast(this)->JSProxyPrint(os);
Ben Murdoch257744e2011-11-30 15:57:28 +0000136 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000137 case JS_SET_TYPE:
138 JSSet::cast(this)->JSSetPrint(os);
139 break;
140 case JS_MAP_TYPE:
141 JSMap::cast(this)->JSMapPrint(os);
142 break;
143 case JS_SET_ITERATOR_TYPE:
144 JSSetIterator::cast(this)->JSSetIteratorPrint(os);
145 break;
146 case JS_MAP_ITERATOR_TYPE:
147 JSMapIterator::cast(this)->JSMapIteratorPrint(os);
Ben Murdoch589d6972011-11-30 16:04:58 +0000148 break;
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000149 case JS_WEAK_MAP_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000150 JSWeakMap::cast(this)->JSWeakMapPrint(os);
151 break;
152 case JS_WEAK_SET_TYPE:
153 JSWeakSet::cast(this)->JSWeakSetPrint(os);
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000154 break;
Ben Murdoch257744e2011-11-30 15:57:28 +0000155 case FOREIGN_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000156 Foreign::cast(this)->ForeignPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100157 break;
158 case SHARED_FUNCTION_INFO_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000159 SharedFunctionInfo::cast(this)->SharedFunctionInfoPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100160 break;
Steve Block1e0659c2011-05-24 12:43:12 +0100161 case JS_MESSAGE_OBJECT_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000162 JSMessageObject::cast(this)->JSMessageObjectPrint(os);
Steve Block1e0659c2011-05-24 12:43:12 +0100163 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000164 case CELL_TYPE:
165 Cell::cast(this)->CellPrint(os);
166 break;
167 case PROPERTY_CELL_TYPE:
168 PropertyCell::cast(this)->PropertyCellPrint(os);
169 break;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400170 case WEAK_CELL_TYPE:
171 WeakCell::cast(this)->WeakCellPrint(os);
172 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000173 case JS_ARRAY_BUFFER_TYPE:
174 JSArrayBuffer::cast(this)->JSArrayBufferPrint(os);
175 break;
176 case JS_TYPED_ARRAY_TYPE:
177 JSTypedArray::cast(this)->JSTypedArrayPrint(os);
178 break;
179 case JS_DATA_VIEW_TYPE:
180 JSDataView::cast(this)->JSDataViewPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100181 break;
182#define MAKE_STRUCT_CASE(NAME, Name, name) \
183 case NAME##_TYPE: \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000184 Name::cast(this)->Name##Print(os); \
Steve Block9fac8402011-05-12 15:51:54 +0100185 break;
186 STRUCT_LIST(MAKE_STRUCT_CASE)
187#undef MAKE_STRUCT_CASE
188
189 default:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000190 os << "UNKNOWN TYPE " << map()->instance_type();
Steve Block9fac8402011-05-12 15:51:54 +0100191 UNREACHABLE();
192 break;
193 }
194}
195
196
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000197void Simd128Value::Simd128ValuePrint(std::ostream& os) { // NOLINT
198#define PRINT_SIMD128_VALUE(TYPE, Type, type, lane_count, lane_type) \
199 if (Is##Type()) return Type::cast(this)->Type##Print(os);
200 SIMD128_TYPES(PRINT_SIMD128_VALUE)
201#undef PRINT_SIMD128_VALUE
202 UNREACHABLE();
203}
204
205
206void Float32x4::Float32x4Print(std::ostream& os) { // NOLINT
207 char arr[100];
208 Vector<char> buffer(arr, arraysize(arr));
209 os << std::string(DoubleToCString(get_lane(0), buffer)) << ", "
210 << std::string(DoubleToCString(get_lane(1), buffer)) << ", "
211 << std::string(DoubleToCString(get_lane(2), buffer)) << ", "
212 << std::string(DoubleToCString(get_lane(3), buffer));
213}
214
215
216#define SIMD128_INT_PRINT_FUNCTION(type, lane_count) \
217 void type::type##Print(std::ostream& os) { \
218 char arr[100]; \
219 Vector<char> buffer(arr, arraysize(arr)); \
220 os << std::string(IntToCString(get_lane(0), buffer)); \
221 for (int i = 1; i < lane_count; i++) { \
222 os << ", " << std::string(IntToCString(get_lane(i), buffer)); \
223 } \
224 }
225SIMD128_INT_PRINT_FUNCTION(Int32x4, 4)
226SIMD128_INT_PRINT_FUNCTION(Uint32x4, 4)
227SIMD128_INT_PRINT_FUNCTION(Int16x8, 8)
228SIMD128_INT_PRINT_FUNCTION(Uint16x8, 8)
229SIMD128_INT_PRINT_FUNCTION(Int8x16, 16)
230SIMD128_INT_PRINT_FUNCTION(Uint8x16, 16)
231#undef SIMD128_INT_PRINT_FUNCTION
232
233
234#define SIMD128_BOOL_PRINT_FUNCTION(type, lane_count) \
235 void type::type##Print(std::ostream& os) { \
236 char arr[100]; \
237 Vector<char> buffer(arr, arraysize(arr)); \
238 os << std::string(get_lane(0) ? "true" : "false"); \
239 for (int i = 1; i < lane_count; i++) { \
240 os << ", " << std::string(get_lane(i) ? "true" : "false"); \
241 } \
242 }
243SIMD128_BOOL_PRINT_FUNCTION(Bool32x4, 4)
244SIMD128_BOOL_PRINT_FUNCTION(Bool16x8, 8)
245SIMD128_BOOL_PRINT_FUNCTION(Bool8x16, 16)
246#undef SIMD128_BOOL_PRINT_FUNCTION
247
248
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400249void ByteArray::ByteArrayPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000250 os << "byte array, data starts at " << GetDataStartAddress();
Steve Block9fac8402011-05-12 15:51:54 +0100251}
252
253
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000254void BytecodeArray::BytecodeArrayPrint(std::ostream& os) { // NOLINT
255 Disassemble(os);
256}
257
258
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400259void FreeSpace::FreeSpacePrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000260 os << "free space, size " << Size();
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100261}
262
263
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000264template <class Traits>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400265void FixedTypedArray<Traits>::FixedTypedArrayPrint(
266 std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000267 os << "fixed " << Traits::Designator();
Steve Block9fac8402011-05-12 15:51:54 +0100268}
269
270
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400271void JSObject::PrintProperties(std::ostream& os) { // NOLINT
Steve Block9fac8402011-05-12 15:51:54 +0100272 if (HasFastProperties()) {
273 DescriptorArray* descs = map()->instance_descriptors();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274 for (int i = 0; i < map()->NumberOfOwnDescriptors(); i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000275 os << "\n ";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000276 descs->GetKey(i)->NamePrint(os);
277 os << ": ";
Steve Block9fac8402011-05-12 15:51:54 +0100278 switch (descs->GetType(i)) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000279 case DATA: {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000280 FieldIndex index = FieldIndex::ForDescriptor(map(), i);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400281 if (IsUnboxedDoubleField(index)) {
282 os << "<unboxed double> " << RawFastDoublePropertyAt(index);
283 } else {
284 os << Brief(RawFastPropertyAt(index));
285 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286 os << " (data field at offset " << index.property_index() << ")";
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400287 break;
288 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000289 case ACCESSOR: {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400290 FieldIndex index = FieldIndex::ForDescriptor(map(), i);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291 os << " (accessor field at offset " << index.property_index() << ")";
Steve Block9fac8402011-05-12 15:51:54 +0100292 break;
293 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000294 case DATA_CONSTANT:
295 os << Brief(descs->GetConstant(i)) << " (data constant)";
Steve Block9fac8402011-05-12 15:51:54 +0100296 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297 case ACCESSOR_CONSTANT:
298 os << Brief(descs->GetCallbacksObject(i)) << " (accessor constant)";
Steve Block9fac8402011-05-12 15:51:54 +0100299 break;
300 }
301 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000302 } else if (IsJSGlobalObject()) {
303 global_dictionary()->Print(os);
Steve Block9fac8402011-05-12 15:51:54 +0100304 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000305 property_dictionary()->Print(os);
Steve Block9fac8402011-05-12 15:51:54 +0100306 }
307}
308
309
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000310template <class T>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400311static void DoPrintElements(std::ostream& os, Object* object) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000312 T* p = T::cast(object);
313 for (int i = 0; i < p->length(); i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000314 os << "\n " << i << ": " << p->get_scalar(i);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000315 }
316}
317
318
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400319void JSObject::PrintElements(std::ostream& os) { // NOLINT
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100320 // Don't call GetElementsKind, its validation code can cause the printer to
321 // fail when debugging.
322 switch (map()->elements_kind()) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000323 case FAST_HOLEY_SMI_ELEMENTS:
324 case FAST_SMI_ELEMENTS:
325 case FAST_HOLEY_ELEMENTS:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100326 case FAST_ELEMENTS:
327 case FAST_STRING_WRAPPER_ELEMENTS: {
Steve Block9fac8402011-05-12 15:51:54 +0100328 // Print in array notation for non-sparse arrays.
329 FixedArray* p = FixedArray::cast(elements());
330 for (int i = 0; i < p->length(); i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000331 os << "\n " << i << ": " << Brief(p->get(i));
Steve Block9fac8402011-05-12 15:51:54 +0100332 }
333 break;
334 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000335 case FAST_HOLEY_DOUBLE_ELEMENTS:
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000336 case FAST_DOUBLE_ELEMENTS: {
337 // Print in array notation for non-sparse arrays.
Ben Murdoch5710cea2012-05-21 14:52:42 +0100338 if (elements()->length() > 0) {
339 FixedDoubleArray* p = FixedDoubleArray::cast(elements());
340 for (int i = 0; i < p->length(); i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000341 os << "\n " << i << ": ";
Ben Murdoch5710cea2012-05-21 14:52:42 +0100342 if (p->is_the_hole(i)) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000343 os << "<the hole>";
Ben Murdoch5710cea2012-05-21 14:52:42 +0100344 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000345 os << p->get_scalar(i);
Ben Murdoch5710cea2012-05-21 14:52:42 +0100346 }
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000347 }
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000348 }
349 break;
350 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000351
352
353#define PRINT_ELEMENTS(Kind, Type) \
354 case Kind: { \
355 DoPrintElements<Type>(os, elements()); \
356 break; \
357 }
358
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000359 PRINT_ELEMENTS(UINT8_ELEMENTS, FixedUint8Array)
360 PRINT_ELEMENTS(UINT8_CLAMPED_ELEMENTS, FixedUint8ClampedArray)
361 PRINT_ELEMENTS(INT8_ELEMENTS, FixedInt8Array)
362 PRINT_ELEMENTS(UINT16_ELEMENTS, FixedUint16Array)
363 PRINT_ELEMENTS(INT16_ELEMENTS, FixedInt16Array)
364 PRINT_ELEMENTS(UINT32_ELEMENTS, FixedUint32Array)
365 PRINT_ELEMENTS(INT32_ELEMENTS, FixedInt32Array)
366 PRINT_ELEMENTS(FLOAT32_ELEMENTS, FixedFloat32Array)
367 PRINT_ELEMENTS(FLOAT64_ELEMENTS, FixedFloat64Array)
368
369#undef PRINT_ELEMENTS
370
Steve Block9fac8402011-05-12 15:51:54 +0100371 case DICTIONARY_ELEMENTS:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100372 case SLOW_STRING_WRAPPER_ELEMENTS:
373 os << "\n - elements: ";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000374 elements()->Print(os);
Steve Block9fac8402011-05-12 15:51:54 +0100375 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000376 case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
377 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: {
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000378 FixedArray* p = FixedArray::cast(elements());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000379 os << "\n parameter map:";
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000380 for (int i = 2; i < p->length(); i++) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000381 os << " " << (i - 2) << ":" << Brief(p->get(i));
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000382 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000383 os << "\n context: " << Brief(p->get(0))
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000384 << "\n arguments: " << Brief(p->get(1));
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000385 break;
386 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100387 case NO_ELEMENTS:
388 break;
Steve Block9fac8402011-05-12 15:51:54 +0100389 }
390}
391
392
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000393static void JSObjectPrintHeader(std::ostream& os, JSObject* obj,
394 const char* id) { // NOLINT
395 obj->PrintHeader(os, id);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100396 // Don't call GetElementsKind, its validation code can cause the printer to
397 // fail when debugging.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000398 PrototypeIterator iter(obj->GetIsolate(), obj);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100399 os << "\n - map = " << reinterpret_cast<void*>(obj->map()) << " ["
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000400 << ElementsKindToString(obj->map()->elements_kind())
401 << "]\n - prototype = " << reinterpret_cast<void*>(iter.GetCurrent());
402}
403
404
405static void JSObjectPrintBody(std::ostream& os, JSObject* obj, // NOLINT
406 bool print_elements = true) {
407 os << "\n {";
408 obj->PrintProperties(os);
409 obj->PrintTransitions(os);
410 if (print_elements) obj->PrintElements(os);
411 os << "\n }\n";
412}
413
414
415void JSObject::JSObjectPrint(std::ostream& os) { // NOLINT
416 JSObjectPrintHeader(os, this, "JSObject");
417 JSObjectPrintBody(os, this);
418}
419
420
421void JSRegExp::JSRegExpPrint(std::ostream& os) { // NOLINT
422 JSObjectPrintHeader(os, this, "JSRegExp");
423 os << "\n - data = " << Brief(data());
424 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000425}
426
427
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400428void JSModule::JSModulePrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000429 JSObjectPrintHeader(os, this, "JSModule");
430 os << "\n - context = " << Brief(context());
431 os << " - scope_info = " << Brief(scope_info());
432 JSObjectPrintBody(os, this);
Steve Block9fac8402011-05-12 15:51:54 +0100433}
434
435
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400436void Symbol::SymbolPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000437 HeapObject::PrintHeader(os, "Symbol");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100438 os << "\n - hash: " << Hash();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000439 os << "\n - name: " << Brief(name());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400440 if (name()->IsUndefined()) {
441 os << " (" << PrivateSymbolToName() << ")";
442 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000443 os << "\n - private: " << is_private();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000444 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100445}
446
447
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400448void Map::MapPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000449 HeapObject::PrintHeader(os, "Map");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100450 os << "\n - type: " << instance_type();
451 os << "\n - instance size: " << instance_size();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000452 if (IsJSObjectMap()) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100453 os << "\n - inobject properties: " << GetInObjectProperties();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000454 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100455 os << "\n - elements kind: " << ElementsKindToString(elements_kind());
456 os << "\n - unused property fields: " << unused_property_fields();
457 if (is_deprecated()) os << "\n - deprecated_map";
458 if (is_stable()) os << "\n - stable_map";
459 if (is_dictionary_map()) os << "\n - dictionary_map";
460 if (has_hidden_prototype()) os << "\n - has_hidden_prototype";
461 if (has_named_interceptor()) os << " - named_interceptor";
462 if (has_indexed_interceptor()) os << "\n - indexed_interceptor";
463 if (is_undetectable()) os << "\n - undetectable";
464 if (is_callable()) os << "\n - callable";
465 if (is_constructor()) os << "\n - constructor";
466 if (is_access_check_needed()) os << "\n - access_check_needed";
467 if (!is_extensible()) os << "\n - non-extensible";
468 if (is_observed()) os << "\n - observed";
469 if (is_strong()) os << "\n - strong_map";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000470 if (is_prototype_map()) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100471 os << "\n - prototype_map";
472 os << "\n - prototype info: " << Brief(prototype_info());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000473 } else {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100474 os << "\n - back pointer: " << Brief(GetBackPointer());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000475 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000476 os << "\n - instance descriptors " << (owns_descriptors() ? "(own) " : "")
477 << "#" << NumberOfOwnDescriptors() << ": "
478 << Brief(instance_descriptors());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400479 if (FLAG_unbox_double_fields) {
480 os << "\n - layout descriptor: " << Brief(layout_descriptor());
481 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000482 int nof_transitions = TransitionArray::NumberOfTransitions(raw_transitions());
483 if (nof_transitions > 0) {
484 os << "\n - transitions #" << nof_transitions << ": "
485 << Brief(raw_transitions());
486 TransitionArray::PrintTransitions(os, raw_transitions(), false);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000487 }
488 os << "\n - prototype: " << Brief(prototype());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000489 os << "\n - constructor: " << Brief(GetConstructor());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000490 os << "\n - code cache: " << Brief(code_cache());
491 os << "\n - dependent code: " << Brief(dependent_code());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000492 os << "\n - construction counter: " << construction_counter();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000493 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100494}
495
496
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400497void CodeCache::CodeCachePrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000498 HeapObject::PrintHeader(os, "CodeCache");
499 os << "\n - default_cache: " << Brief(default_cache());
500 os << "\n - normal_type_cache: " << Brief(normal_type_cache());
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000501}
502
503
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400504void PolymorphicCodeCache::PolymorphicCodeCachePrint(
505 std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000506 HeapObject::PrintHeader(os, "PolymorphicCodeCache");
507 os << "\n - cache: " << Brief(cache());
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100508}
509
510
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400511void TypeFeedbackInfo::TypeFeedbackInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000512 HeapObject::PrintHeader(os, "TypeFeedbackInfo");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100513 os << "\n - ic_total_count: " << ic_total_count()
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000514 << ", ic_with_type_info_count: " << ic_with_type_info_count()
515 << ", ic_generic_count: " << ic_generic_count() << "\n";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100516}
517
518
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400519void AliasedArgumentsEntry::AliasedArgumentsEntryPrint(
520 std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000521 HeapObject::PrintHeader(os, "AliasedArgumentsEntry");
522 os << "\n - aliased_context_slot: " << aliased_context_slot();
523}
524
525
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400526void FixedArray::FixedArrayPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000527 HeapObject::PrintHeader(os, "FixedArray");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100528 os << "\n - length: " << length();
Steve Block9fac8402011-05-12 15:51:54 +0100529 for (int i = 0; i < length(); i++) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000530 os << "\n [" << i << "]: " << Brief(get(i));
Steve Block9fac8402011-05-12 15:51:54 +0100531 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000532 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100533}
534
535
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400536void FixedDoubleArray::FixedDoubleArrayPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000537 HeapObject::PrintHeader(os, "FixedDoubleArray");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100538 os << "\n - length: " << length();
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100539 for (int i = 0; i < length(); i++) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000540 os << "\n [" << i << "]: ";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100541 if (is_the_hole(i)) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000542 os << "<the hole>";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100543 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000544 os << get_scalar(i);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100545 }
546 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000547 os << "\n";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100548}
549
550
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000551void TransitionArray::TransitionArrayPrint(std::ostream& os) { // NOLINT
552 HeapObject::PrintHeader(os, "TransitionArray");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100553 os << "\n - capacity: " << length();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000554 for (int i = 0; i < length(); i++) {
555 os << "\n [" << i << "]: " << Brief(get(i));
556 if (i == kNextLinkIndex) os << " (next link)";
557 if (i == kPrototypeTransitionsIndex) os << " (prototype transitions)";
558 if (i == kTransitionLengthIndex) os << " (number of transitions)";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000559 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000560 os << "\n";
561}
562
563
564void TypeFeedbackMetadata::Print() {
565 OFStream os(stdout);
566 TypeFeedbackMetadataPrint(os);
567 os << std::flush;
568}
569
570
571void TypeFeedbackMetadata::TypeFeedbackMetadataPrint(
572 std::ostream& os) { // NOLINT
573 HeapObject::PrintHeader(os, "TypeFeedbackMetadata");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100574 os << "\n - length: " << length();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000575 if (length() == 0) {
576 os << " (empty)\n";
577 return;
578 }
579
580 TypeFeedbackMetadataIterator iter(this);
581 while (iter.HasNext()) {
582 FeedbackVectorSlot slot = iter.Next();
583 FeedbackVectorSlotKind kind = iter.kind();
584 os << "\n Slot " << slot << " " << kind;
585 }
586 os << "\n";
587}
588
589
590void TypeFeedbackVector::Print() {
591 OFStream os(stdout);
592 TypeFeedbackVectorPrint(os);
593 os << std::flush;
594}
595
596
597void TypeFeedbackVector::TypeFeedbackVectorPrint(std::ostream& os) { // NOLINT
598 HeapObject::PrintHeader(os, "TypeFeedbackVector");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100599 os << "\n - length: " << length();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000600 if (length() == 0) {
601 os << " (empty)\n";
602 return;
603 }
604
605 TypeFeedbackMetadataIterator iter(metadata());
606 while (iter.HasNext()) {
607 FeedbackVectorSlot slot = iter.Next();
608 FeedbackVectorSlotKind kind = iter.kind();
609
610 os << "\n Slot " << slot << " " << kind << " ";
611 switch (kind) {
612 case FeedbackVectorSlotKind::LOAD_IC: {
613 LoadICNexus nexus(this, slot);
614 os << Code::ICState2String(nexus.StateFromFeedback());
615 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000616 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000617 case FeedbackVectorSlotKind::KEYED_LOAD_IC: {
618 KeyedLoadICNexus nexus(this, slot);
619 os << Code::ICState2String(nexus.StateFromFeedback());
620 break;
621 }
622 case FeedbackVectorSlotKind::CALL_IC: {
623 CallICNexus nexus(this, slot);
624 os << Code::ICState2String(nexus.StateFromFeedback());
625 break;
626 }
627 case FeedbackVectorSlotKind::STORE_IC: {
628 StoreICNexus nexus(this, slot);
629 os << Code::ICState2String(nexus.StateFromFeedback());
630 break;
631 }
632 case FeedbackVectorSlotKind::KEYED_STORE_IC: {
633 KeyedStoreICNexus nexus(this, slot);
634 os << Code::ICState2String(nexus.StateFromFeedback());
635 break;
636 }
637 case FeedbackVectorSlotKind::GENERAL:
638 break;
639 case FeedbackVectorSlotKind::INVALID:
640 case FeedbackVectorSlotKind::KINDS_NUMBER:
641 UNREACHABLE();
642 break;
643 }
644
645 int entry_size = iter.entry_size();
646 for (int i = 0; i < entry_size; i++) {
647 int index = GetIndex(slot) + i;
648 os << "\n [" << index << "]: " << Brief(get(index));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000649 }
650 }
651 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100652}
653
654
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400655void JSValue::JSValuePrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000656 JSObjectPrintHeader(os, this, "JSValue");
657 os << "\n - value = " << Brief(value());
658 JSObjectPrintBody(os, this);
Steve Block1e0659c2011-05-24 12:43:12 +0100659}
660
661
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400662void JSMessageObject::JSMessageObjectPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000663 JSObjectPrintHeader(os, this, "JSMessageObject");
664 os << "\n - type: " << type();
665 os << "\n - arguments: " << Brief(argument());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000666 os << "\n - start_position: " << start_position();
667 os << "\n - end_position: " << end_position();
668 os << "\n - script: " << Brief(script());
669 os << "\n - stack_frames: " << Brief(stack_frames());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000670 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000671}
672
673
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400674void String::StringPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000675 if (StringShape(this).IsInternalized()) {
676 os << "#";
Steve Block9fac8402011-05-12 15:51:54 +0100677 } else if (StringShape(this).IsCons()) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000678 os << "c\"";
Steve Block9fac8402011-05-12 15:51:54 +0100679 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000680 os << "\"";
Steve Block9fac8402011-05-12 15:51:54 +0100681 }
682
683 const char truncated_epilogue[] = "...<truncated>";
684 int len = length();
685 if (!FLAG_use_verbose_printer) {
686 if (len > 100) {
687 len = 100 - sizeof(truncated_epilogue);
688 }
689 }
690 for (int i = 0; i < len; i++) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000691 os << AsUC16(Get(i));
Steve Block9fac8402011-05-12 15:51:54 +0100692 }
693 if (len != length()) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000694 os << truncated_epilogue;
Steve Block9fac8402011-05-12 15:51:54 +0100695 }
696
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000697 if (!StringShape(this).IsInternalized()) os << "\"";
698}
699
700
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400701void Name::NamePrint(std::ostream& os) { // NOLINT
702 if (IsString()) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000703 String::cast(this)->StringPrint(os);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400704 } else if (IsSymbol()) {
705 Symbol::cast(this)->name()->Print(os);
706 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000707 os << Brief(this);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400708 }
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000709}
710
711
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100712static const char* const weekdays[] = {
713 "???", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
714};
715
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000716
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400717void JSDate::JSDatePrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000718 JSObjectPrintHeader(os, this, "JSDate");
719 os << "\n - value = " << Brief(value());
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100720 if (!year()->IsSmi()) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000721 os << "\n - time = NaN\n";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100722 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000723 // TODO(svenpanne) Add some basic formatting to our streams.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000724 ScopedVector<char> buf(100);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000725 SNPrintF(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000726 buf, "\n - time = %s %04d/%02d/%02d %02d:%02d:%02d\n",
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000727 weekdays[weekday()->IsSmi() ? Smi::cast(weekday())->value() + 1 : 0],
728 year()->IsSmi() ? Smi::cast(year())->value() : -1,
729 month()->IsSmi() ? Smi::cast(month())->value() : -1,
730 day()->IsSmi() ? Smi::cast(day())->value() : -1,
731 hour()->IsSmi() ? Smi::cast(hour())->value() : -1,
732 min()->IsSmi() ? Smi::cast(min())->value() : -1,
733 sec()->IsSmi() ? Smi::cast(sec())->value() : -1);
734 os << buf.start();
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100735 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000736 JSObjectPrintBody(os, this);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100737}
738
739
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400740void JSProxy::JSProxyPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000741 HeapObject::PrintHeader(os, "JSProxy");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100742 os << "\n - map = " << reinterpret_cast<void*>(map());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000743 os << "\n - target = ";
744 target()->ShortPrint(os);
745 os << "\n - handler = ";
746 handler()->ShortPrint(os);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000747 os << "\n - hash = ";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000748 hash()->ShortPrint(os);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000749 os << "\n";
Ben Murdoch589d6972011-11-30 16:04:58 +0000750}
751
752
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400753void JSSet::JSSetPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000754 JSObjectPrintHeader(os, this, "JSSet");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000755 os << " - table = " << Brief(table());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000756 JSObjectPrintBody(os, this);
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000757}
758
759
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400760void JSMap::JSMapPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000761 JSObjectPrintHeader(os, this, "JSMap");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000762 os << " - table = " << Brief(table());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000763 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000764}
765
766
767template <class Derived, class TableType>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400768void
769OrderedHashTableIterator<Derived, TableType>::OrderedHashTableIteratorPrint(
770 std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000771 os << "\n - table = " << Brief(table());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000772 os << "\n - index = " << Brief(index());
773 os << "\n - kind = " << Brief(kind());
774 os << "\n";
775}
776
777
778template void OrderedHashTableIterator<
779 JSSetIterator,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400780 OrderedHashSet>::OrderedHashTableIteratorPrint(std::ostream& os); // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000781
782
783template void OrderedHashTableIterator<
784 JSMapIterator,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400785 OrderedHashMap>::OrderedHashTableIteratorPrint(std::ostream& os); // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000786
787
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400788void JSSetIterator::JSSetIteratorPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000789 JSObjectPrintHeader(os, this, "JSSetIterator");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000790 OrderedHashTableIteratorPrint(os);
791}
792
793
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400794void JSMapIterator::JSMapIteratorPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000795 JSObjectPrintHeader(os, this, "JSMapIterator");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000796 OrderedHashTableIteratorPrint(os);
797}
798
799
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000800void JSWeakMap::JSWeakMapPrint(std::ostream& os) { // NOLINT
801 JSObjectPrintHeader(os, this, "JSWeakMap");
802 os << "\n - table = " << Brief(table());
803 JSObjectPrintBody(os, this);
804}
805
806
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400807void JSWeakSet::JSWeakSetPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000808 JSObjectPrintHeader(os, this, "JSWeakSet");
809 os << "\n - table = " << Brief(table());
810 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000811}
812
813
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400814void JSArrayBuffer::JSArrayBufferPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000815 JSObjectPrintHeader(os, this, "JSArrayBuffer");
816 os << "\n - backing_store = " << backing_store();
817 os << "\n - byte_length = " << Brief(byte_length());
818 if (was_neutered()) os << " - neutered\n";
819 JSObjectPrintBody(os, this, !was_neutered());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000820}
821
822
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400823void JSTypedArray::JSTypedArrayPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000824 JSObjectPrintHeader(os, this, "JSTypedArray");
825 os << "\n - buffer = " << Brief(buffer());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000826 os << "\n - byte_offset = " << Brief(byte_offset());
827 os << "\n - byte_length = " << Brief(byte_length());
828 os << "\n - length = " << Brief(length());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000829 if (WasNeutered()) os << " - neutered\n";
830 JSObjectPrintBody(os, this, !WasNeutered());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000831}
832
833
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400834void JSDataView::JSDataViewPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000835 JSObjectPrintHeader(os, this, "JSDataView");
836 os << "\n - buffer =" << Brief(buffer());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000837 os << "\n - byte_offset = " << Brief(byte_offset());
838 os << "\n - byte_length = " << Brief(byte_length());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000839 if (WasNeutered()) os << " - neutered\n";
840 JSObjectPrintBody(os, this, !WasNeutered());
841}
842
843
844void JSBoundFunction::JSBoundFunctionPrint(std::ostream& os) { // NOLINT
845 JSObjectPrintHeader(os, this, "JSBoundFunction");
846 os << "\n - bound_target_function = " << Brief(bound_target_function());
847 os << "\n - bound_this = " << Brief(bound_this());
848 os << "\n - bound_arguments = " << Brief(bound_arguments());
849 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000850}
851
852
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400853void JSFunction::JSFunctionPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000854 JSObjectPrintHeader(os, this, "Function");
855 os << "\n - initial_map = ";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000856 if (has_initial_map()) os << Brief(initial_map());
857 os << "\n - shared_info = " << Brief(shared());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000858 os << "\n - name = " << Brief(shared()->name());
859 if (shared()->is_generator()) {
860 os << "\n - generator";
Steve Block9fac8402011-05-12 15:51:54 +0100861 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000862 os << "\n - context = " << Brief(context());
863 os << "\n - literals = " << Brief(literals());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000864 os << "\n - code = " << Brief(code());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000865 JSObjectPrintBody(os, this);
Steve Block9fac8402011-05-12 15:51:54 +0100866}
867
868
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400869void SharedFunctionInfo::SharedFunctionInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000870 HeapObject::PrintHeader(os, "SharedFunctionInfo");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100871 os << "\n - name: " << Brief(name());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000872 os << "\n - expected_nof_properties: " << expected_nof_properties();
873 os << "\n - ast_node_count: " << ast_node_count();
874 os << "\n - instance class name = ";
875 instance_class_name()->Print(os);
876 os << "\n - code = " << Brief(code());
877 if (HasSourceCode()) {
878 os << "\n - source code = ";
879 String* source = String::cast(Script::cast(script())->source());
880 int start = start_position();
881 int length = end_position() - start;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000882 base::SmartArrayPointer<char> source_string = source->ToCString(
883 DISALLOW_NULLS, FAST_STRING_TRAVERSAL, start, length, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000884 os << source_string.get();
885 }
Steve Block9fac8402011-05-12 15:51:54 +0100886 // Script files are often large, hard to read.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000887 // os << "\n - script =";
888 // script()->Print(os);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100889 if (is_named_expression()) {
890 os << "\n - named expression";
891 } else if (is_anonymous_expression()) {
892 os << "\n - anonymous expression";
893 } else if (is_declaration()) {
894 os << "\n - declaration";
895 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000896 os << "\n - function token position = " << function_token_position();
897 os << "\n - start position = " << start_position();
898 os << "\n - end position = " << end_position();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000899 os << "\n - debug info = " << Brief(debug_info());
900 os << "\n - length = " << length();
901 os << "\n - optimized_code_map = " << Brief(optimized_code_map());
902 os << "\n - feedback_vector = ";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000903 feedback_vector()->TypeFeedbackVectorPrint(os);
904 if (HasBytecodeArray()) {
905 os << "\n - bytecode_array = " << bytecode_array();
906 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000907 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100908}
909
910
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400911void JSGlobalProxy::JSGlobalProxyPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000912 os << "global_proxy ";
913 JSObjectPrint(os);
914 os << "native context : " << Brief(native_context());
915 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100916}
917
918
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400919void JSGlobalObject::JSGlobalObjectPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000920 os << "global ";
921 JSObjectPrint(os);
922 os << "native context : " << Brief(native_context());
923 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100924}
925
926
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400927void Cell::CellPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000928 HeapObject::PrintHeader(os, "Cell");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100929 os << "\n - value: " << Brief(value());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000930 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100931}
932
933
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400934void PropertyCell::PropertyCellPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000935 HeapObject::PrintHeader(os, "PropertyCell");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100936 os << "\n - value: " << Brief(value());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000937 os << "\n - details: " << property_details();
938 os << "\n";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000939}
940
941
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400942void WeakCell::WeakCellPrint(std::ostream& os) { // NOLINT
943 HeapObject::PrintHeader(os, "WeakCell");
944 if (cleared()) {
945 os << "\n - cleared";
946 } else {
947 os << "\n - value: " << Brief(value());
948 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000949 os << "\n";
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400950}
951
952
953void Code::CodePrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000954 HeapObject::PrintHeader(os, "Code");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100955 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100956#ifdef ENABLE_DISASSEMBLER
957 if (FLAG_use_verbose_printer) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000958 Disassemble(NULL, os);
Steve Block9fac8402011-05-12 15:51:54 +0100959 }
960#endif
961}
962
963
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400964void Foreign::ForeignPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000965 os << "foreign address : " << foreign_address();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000966 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100967}
968
969
Ben Murdoch097c5b22016-05-18 11:27:45 +0100970void AccessorInfo::AccessorInfoPrint(std::ostream& os) { // NOLINT
971 HeapObject::PrintHeader(os, "AccessorInfo");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000972 os << "\n - name: " << Brief(name());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000973 os << "\n - flag: " << flag();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000974 os << "\n - getter: " << Brief(getter());
975 os << "\n - setter: " << Brief(setter());
976 os << "\n - data: " << Brief(data());
977 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100978}
979
980
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400981void Box::BoxPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000982 HeapObject::PrintHeader(os, "Box");
983 os << "\n - value: " << Brief(value());
984 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100985}
986
987
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000988void PrototypeInfo::PrototypeInfoPrint(std::ostream& os) { // NOLINT
989 HeapObject::PrintHeader(os, "PrototypeInfo");
990 os << "\n - prototype users: " << Brief(prototype_users());
991 os << "\n - registry slot: " << registry_slot();
992 os << "\n - validity cell: " << Brief(validity_cell());
993 os << "\n";
994}
995
996
997void SloppyBlockWithEvalContextExtension::
998 SloppyBlockWithEvalContextExtensionPrint(std::ostream& os) { // NOLINT
999 HeapObject::PrintHeader(os, "SloppyBlockWithEvalContextExtension");
1000 os << "\n - scope_info: " << Brief(scope_info());
1001 os << "\n - extension: " << Brief(extension());
1002 os << "\n";
1003}
1004
1005
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001006void AccessorPair::AccessorPairPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001007 HeapObject::PrintHeader(os, "AccessorPair");
1008 os << "\n - getter: " << Brief(getter());
1009 os << "\n - setter: " << Brief(setter());
1010 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001011}
1012
1013
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001014void AccessCheckInfo::AccessCheckInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001015 HeapObject::PrintHeader(os, "AccessCheckInfo");
1016 os << "\n - named_callback: " << Brief(named_callback());
1017 os << "\n - indexed_callback: " << Brief(indexed_callback());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001018 os << "\n - callback: " << Brief(callback());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001019 os << "\n - data: " << Brief(data());
1020 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001021}
1022
1023
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001024void InterceptorInfo::InterceptorInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001025 HeapObject::PrintHeader(os, "InterceptorInfo");
1026 os << "\n - getter: " << Brief(getter());
1027 os << "\n - setter: " << Brief(setter());
1028 os << "\n - query: " << Brief(query());
1029 os << "\n - deleter: " << Brief(deleter());
1030 os << "\n - enumerator: " << Brief(enumerator());
1031 os << "\n - data: " << Brief(data());
1032 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001033}
1034
1035
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001036void CallHandlerInfo::CallHandlerInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001037 HeapObject::PrintHeader(os, "CallHandlerInfo");
1038 os << "\n - callback: " << Brief(callback());
1039 os << "\n - data: " << Brief(data());
1040 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001041}
1042
1043
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001044void FunctionTemplateInfo::FunctionTemplateInfoPrint(
1045 std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001046 HeapObject::PrintHeader(os, "FunctionTemplateInfo");
1047 os << "\n - class name: " << Brief(class_name());
1048 os << "\n - tag: " << Brief(tag());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001049 os << "\n - serial_number: " << Brief(serial_number());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001050 os << "\n - property_list: " << Brief(property_list());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001051 os << "\n - call_code: " << Brief(call_code());
1052 os << "\n - property_accessors: " << Brief(property_accessors());
1053 os << "\n - prototype_template: " << Brief(prototype_template());
1054 os << "\n - parent_template: " << Brief(parent_template());
1055 os << "\n - named_property_handler: " << Brief(named_property_handler());
1056 os << "\n - indexed_property_handler: " << Brief(indexed_property_handler());
1057 os << "\n - instance_template: " << Brief(instance_template());
1058 os << "\n - signature: " << Brief(signature());
1059 os << "\n - access_check_info: " << Brief(access_check_info());
1060 os << "\n - hidden_prototype: " << (hidden_prototype() ? "true" : "false");
1061 os << "\n - undetectable: " << (undetectable() ? "true" : "false");
1062 os << "\n - need_access_check: " << (needs_access_check() ? "true" : "false");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001063 os << "\n - instantiated: " << (instantiated() ? "true" : "false");
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001064 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001065}
1066
1067
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001068void ObjectTemplateInfo::ObjectTemplateInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001069 HeapObject::PrintHeader(os, "ObjectTemplateInfo");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001070 os << "\n - tag: " << Brief(tag());
1071 os << "\n - serial_number: " << Brief(serial_number());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001072 os << "\n - property_list: " << Brief(property_list());
1073 os << "\n - property_accessors: " << Brief(property_accessors());
1074 os << "\n - constructor: " << Brief(constructor());
1075 os << "\n - internal_field_count: " << Brief(internal_field_count());
1076 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001077}
1078
1079
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001080void AllocationSite::AllocationSitePrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001081 HeapObject::PrintHeader(os, "AllocationSite");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001082 os << "\n - weak_next: " << Brief(weak_next());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001083 os << "\n - dependent code: " << Brief(dependent_code());
1084 os << "\n - nested site: " << Brief(nested_site());
1085 os << "\n - memento found count: "
1086 << Brief(Smi::FromInt(memento_found_count()));
1087 os << "\n - memento create count: "
1088 << Brief(Smi::FromInt(memento_create_count()));
1089 os << "\n - pretenure decision: "
1090 << Brief(Smi::FromInt(pretenure_decision()));
1091 os << "\n - transition_info: ";
1092 if (transition_info()->IsSmi()) {
1093 ElementsKind kind = GetElementsKind();
1094 os << "Array allocation with ElementsKind " << ElementsKindToString(kind);
1095 } else if (transition_info()->IsJSArray()) {
1096 os << "Array literal " << Brief(transition_info());
1097 } else {
1098 os << "unknown transition_info" << Brief(transition_info());
1099 }
1100 os << "\n";
1101}
1102
1103
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001104void AllocationMemento::AllocationMementoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001105 HeapObject::PrintHeader(os, "AllocationMemento");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001106 os << "\n - allocation site: ";
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001107 if (IsValid()) {
1108 GetAllocationSite()->Print(os);
1109 } else {
1110 os << "<invalid>\n";
1111 }
1112}
1113
1114
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001115void Script::ScriptPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001116 HeapObject::PrintHeader(os, "Script");
1117 os << "\n - source: " << Brief(source());
1118 os << "\n - name: " << Brief(name());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001119 os << "\n - line_offset: " << line_offset();
1120 os << "\n - column_offset: " << column_offset();
1121 os << "\n - type: " << type();
1122 os << "\n - id: " << id();
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001123 os << "\n - context data: " << Brief(context_data());
1124 os << "\n - wrapper: " << Brief(wrapper());
1125 os << "\n - compilation type: " << compilation_type();
1126 os << "\n - line ends: " << Brief(line_ends());
1127 os << "\n - eval from shared: " << Brief(eval_from_shared());
1128 os << "\n - eval from instructions offset: "
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001129 << eval_from_instructions_offset();
1130 os << "\n - shared function infos: " << Brief(shared_function_infos());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001131 os << "\n";
1132}
1133
1134
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001135void DebugInfo::DebugInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001136 HeapObject::PrintHeader(os, "DebugInfo");
1137 os << "\n - shared: " << Brief(shared());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001138 os << "\n - code: " << Brief(abstract_code());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001139 os << "\n - break_points: ";
1140 break_points()->Print(os);
1141}
1142
1143
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001144void BreakPointInfo::BreakPointInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001145 HeapObject::PrintHeader(os, "BreakPointInfo");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001146 os << "\n - code_offset: " << code_offset();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001147 os << "\n - source_position: " << source_position();
1148 os << "\n - statement_position: " << statement_position();
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001149 os << "\n - break_point_objects: " << Brief(break_point_objects());
1150 os << "\n";
1151}
1152
1153
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001154static void PrintBitMask(std::ostream& os, uint32_t value) { // NOLINT
1155 for (int i = 0; i < 32; i++) {
1156 if ((i & 7) == 0) os << " ";
1157 os << (((value & 1) == 0) ? "_" : "x");
1158 value >>= 1;
Steve Block9fac8402011-05-12 15:51:54 +01001159 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001160}
1161
1162
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001163void LayoutDescriptor::Print() {
1164 OFStream os(stdout);
1165 this->Print(os);
1166 os << std::flush;
1167}
1168
1169
1170void LayoutDescriptor::Print(std::ostream& os) { // NOLINT
1171 os << "Layout descriptor: ";
1172 if (IsUninitialized()) {
1173 os << "<uninitialized>";
1174 } else if (IsFastPointerLayout()) {
1175 os << "<all tagged>";
1176 } else if (IsSmi()) {
1177 os << "fast";
1178 PrintBitMask(os, static_cast<uint32_t>(Smi::cast(this)->value()));
1179 } else {
1180 os << "slow";
1181 int len = length();
1182 for (int i = 0; i < len; i++) {
1183 if (i > 0) os << " |";
1184 PrintBitMask(os, get_scalar(i));
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001185 }
1186 }
1187 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001188}
1189
1190
1191#endif // OBJECT_PRINT
1192
1193
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001194#if TRACE_MAPS
1195
1196
1197void Name::NameShortPrint() {
1198 if (this->IsString()) {
1199 PrintF("%s", String::cast(this)->ToCString().get());
1200 } else {
1201 DCHECK(this->IsSymbol());
1202 Symbol* s = Symbol::cast(this);
1203 if (s->name()->IsUndefined()) {
1204 PrintF("#<%s>", s->PrivateSymbolToName());
1205 } else {
1206 PrintF("<%s>", String::cast(s->name())->ToCString().get());
1207 }
1208 }
1209}
1210
1211
1212int Name::NameShortPrint(Vector<char> str) {
1213 if (this->IsString()) {
1214 return SNPrintF(str, "%s", String::cast(this)->ToCString().get());
1215 } else {
1216 DCHECK(this->IsSymbol());
1217 Symbol* s = Symbol::cast(this);
1218 if (s->name()->IsUndefined()) {
1219 return SNPrintF(str, "#<%s>", s->PrivateSymbolToName());
1220 } else {
1221 return SNPrintF(str, "<%s>", String::cast(s->name())->ToCString().get());
1222 }
1223 }
1224}
1225
1226
1227#endif // TRACE_MAPS
1228
1229
1230#if defined(DEBUG) || defined(OBJECT_PRINT)
1231// This method is only meant to be called from gdb for debugging purposes.
1232// Since the string can also be in two-byte encoding, non-Latin1 characters
1233// will be ignored in the output.
1234char* String::ToAsciiArray() {
1235 // Static so that subsequent calls frees previously allocated space.
1236 // This also means that previous results will be overwritten.
1237 static char* buffer = NULL;
1238 if (buffer != NULL) delete[] buffer;
1239 buffer = new char[length() + 1];
1240 WriteToFlat(this, reinterpret_cast<uint8_t*>(buffer), 0, length());
1241 buffer[length()] = 0;
1242 return buffer;
1243}
1244
1245
1246void DescriptorArray::Print() {
1247 OFStream os(stdout);
1248 this->PrintDescriptors(os);
1249 os << std::flush;
1250}
1251
1252
1253void DescriptorArray::PrintDescriptors(std::ostream& os) { // NOLINT
1254 HandleScope scope(GetIsolate());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001255 os << "Descriptor array #" << number_of_descriptors();
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001256 for (int i = 0; i < number_of_descriptors(); i++) {
1257 Descriptor desc;
1258 Get(i, &desc);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001259 os << "\n " << i << ": " << desc;
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001260 }
1261 os << "\n";
1262}
1263
1264
1265void TransitionArray::Print() {
1266 OFStream os(stdout);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001267 TransitionArray::PrintTransitions(os, this);
1268 os << "\n" << std::flush;
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001269}
1270
1271
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001272void TransitionArray::PrintTransitions(std::ostream& os, Object* transitions,
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001273 bool print_header) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001274 int num_transitions = NumberOfTransitions(transitions);
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001275 if (print_header) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001276 os << "Transition array #" << num_transitions << ":";
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001277 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001278 for (int i = 0; i < num_transitions; i++) {
1279 Name* key = GetKey(transitions, i);
1280 Map* target = GetTarget(transitions, i);
1281 os << "\n ";
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001282#ifdef OBJECT_PRINT
1283 key->NamePrint(os);
1284#else
1285 key->ShortPrint(os);
1286#endif
1287 os << ": ";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001288 Heap* heap = key->GetHeap();
1289 if (key == heap->nonextensible_symbol()) {
1290 os << "(transition to non-extensible)";
1291 } else if (key == heap->sealed_symbol()) {
1292 os << "(transition to sealed)";
1293 } else if (key == heap->frozen_symbol()) {
1294 os << "(transition to frozen)";
1295 } else if (key == heap->elements_transition_symbol()) {
1296 os << "(transition to " << ElementsKindToString(target->elements_kind())
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001297 << ")";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001298 } else if (key == heap->strict_function_transition_symbol()) {
1299 os << " (transition to strict function)";
1300 } else if (key == heap->strong_function_transition_symbol()) {
1301 os << " (transition to strong function)";
1302 } else if (key == heap->observed_symbol()) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001303 os << " (transition to Object.observe)";
1304 } else {
1305 PropertyDetails details = GetTargetDetails(key, target);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001306 os << "(transition to ";
1307 if (details.location() == kDescriptor) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001308 os << "immutable ";
1309 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001310 os << (details.kind() == kData ? "data" : "accessor");
1311 if (details.location() == kDescriptor) {
1312 Object* value =
1313 target->instance_descriptors()->GetValue(target->LastAdded());
1314 os << " " << Brief(value);
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001315 }
1316 os << "), attrs: " << details.attributes();
1317 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001318 os << " -> " << Brief(target);
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001319 }
1320}
1321
1322
1323void JSObject::PrintTransitions(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001324 Object* transitions = map()->raw_transitions();
1325 int num_transitions = TransitionArray::NumberOfTransitions(transitions);
1326 if (num_transitions == 0) return;
1327 os << "\n - transitions";
1328 TransitionArray::PrintTransitions(os, transitions, false);
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001329}
1330#endif // defined(DEBUG) || defined(OBJECT_PRINT)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001331} // namespace internal
1332} // namespace v8