blob: 58092a49baad8cc552e74bb80f1a43e685bf619e [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
Ben Murdochda12d292016-06-02 14:46:10 +010098 case JS_SPECIAL_API_OBJECT_TYPE:
Steve Block9fac8402011-05-12 15:51:54 +010099 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
100 case JS_ARRAY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000101 case JS_GENERATOR_OBJECT_TYPE:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000102 case JS_PROMISE_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000103 JSObject::cast(this)->JSObjectPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100104 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000105 case JS_REGEXP_TYPE:
106 JSRegExp::cast(this)->JSRegExpPrint(os);
107 break;
Steve Block9fac8402011-05-12 15:51:54 +0100108 case ODDBALL_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000109 Oddball::cast(this)->to_string()->Print(os);
110 break;
111 case JS_MODULE_TYPE:
112 JSModule::cast(this)->JSModulePrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100113 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114 case JS_BOUND_FUNCTION_TYPE:
115 JSBoundFunction::cast(this)->JSBoundFunctionPrint(os);
116 break;
Steve Block9fac8402011-05-12 15:51:54 +0100117 case JS_FUNCTION_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000118 JSFunction::cast(this)->JSFunctionPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100119 break;
120 case JS_GLOBAL_PROXY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000121 JSGlobalProxy::cast(this)->JSGlobalProxyPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100122 break;
123 case JS_GLOBAL_OBJECT_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000124 JSGlobalObject::cast(this)->JSGlobalObjectPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100125 break;
Steve Block9fac8402011-05-12 15:51:54 +0100126 case JS_VALUE_TYPE:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000127 JSValue::cast(this)->JSValuePrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100128 break;
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100129 case JS_DATE_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000130 JSDate::cast(this)->JSDatePrint(os);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100131 break;
Steve Block9fac8402011-05-12 15:51:54 +0100132 case CODE_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000133 Code::cast(this)->CodePrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100134 break;
Ben Murdoch257744e2011-11-30 15:57:28 +0000135 case JS_PROXY_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000136 JSProxy::cast(this)->JSProxyPrint(os);
Ben Murdoch257744e2011-11-30 15:57:28 +0000137 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000138 case JS_SET_TYPE:
139 JSSet::cast(this)->JSSetPrint(os);
140 break;
141 case JS_MAP_TYPE:
142 JSMap::cast(this)->JSMapPrint(os);
143 break;
144 case JS_SET_ITERATOR_TYPE:
145 JSSetIterator::cast(this)->JSSetIteratorPrint(os);
146 break;
147 case JS_MAP_ITERATOR_TYPE:
148 JSMapIterator::cast(this)->JSMapIteratorPrint(os);
Ben Murdoch589d6972011-11-30 16:04:58 +0000149 break;
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000150 case JS_WEAK_MAP_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000151 JSWeakMap::cast(this)->JSWeakMapPrint(os);
152 break;
153 case JS_WEAK_SET_TYPE:
154 JSWeakSet::cast(this)->JSWeakSetPrint(os);
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000155 break;
Ben Murdoch257744e2011-11-30 15:57:28 +0000156 case FOREIGN_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000157 Foreign::cast(this)->ForeignPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100158 break;
159 case SHARED_FUNCTION_INFO_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000160 SharedFunctionInfo::cast(this)->SharedFunctionInfoPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100161 break;
Steve Block1e0659c2011-05-24 12:43:12 +0100162 case JS_MESSAGE_OBJECT_TYPE:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000163 JSMessageObject::cast(this)->JSMessageObjectPrint(os);
Steve Block1e0659c2011-05-24 12:43:12 +0100164 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000165 case CELL_TYPE:
166 Cell::cast(this)->CellPrint(os);
167 break;
168 case PROPERTY_CELL_TYPE:
169 PropertyCell::cast(this)->PropertyCellPrint(os);
170 break;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400171 case WEAK_CELL_TYPE:
172 WeakCell::cast(this)->WeakCellPrint(os);
173 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000174 case JS_ARRAY_BUFFER_TYPE:
175 JSArrayBuffer::cast(this)->JSArrayBufferPrint(os);
176 break;
177 case JS_TYPED_ARRAY_TYPE:
178 JSTypedArray::cast(this)->JSTypedArrayPrint(os);
179 break;
180 case JS_DATA_VIEW_TYPE:
181 JSDataView::cast(this)->JSDataViewPrint(os);
Steve Block9fac8402011-05-12 15:51:54 +0100182 break;
183#define MAKE_STRUCT_CASE(NAME, Name, name) \
184 case NAME##_TYPE: \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000185 Name::cast(this)->Name##Print(os); \
Steve Block9fac8402011-05-12 15:51:54 +0100186 break;
187 STRUCT_LIST(MAKE_STRUCT_CASE)
188#undef MAKE_STRUCT_CASE
189
190 default:
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000191 os << "UNKNOWN TYPE " << map()->instance_type();
Steve Block9fac8402011-05-12 15:51:54 +0100192 UNREACHABLE();
193 break;
194 }
195}
196
197
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198void Simd128Value::Simd128ValuePrint(std::ostream& os) { // NOLINT
199#define PRINT_SIMD128_VALUE(TYPE, Type, type, lane_count, lane_type) \
200 if (Is##Type()) return Type::cast(this)->Type##Print(os);
201 SIMD128_TYPES(PRINT_SIMD128_VALUE)
202#undef PRINT_SIMD128_VALUE
203 UNREACHABLE();
204}
205
206
207void Float32x4::Float32x4Print(std::ostream& os) { // NOLINT
208 char arr[100];
209 Vector<char> buffer(arr, arraysize(arr));
210 os << std::string(DoubleToCString(get_lane(0), buffer)) << ", "
211 << std::string(DoubleToCString(get_lane(1), buffer)) << ", "
212 << std::string(DoubleToCString(get_lane(2), buffer)) << ", "
213 << std::string(DoubleToCString(get_lane(3), buffer));
214}
215
216
217#define SIMD128_INT_PRINT_FUNCTION(type, lane_count) \
218 void type::type##Print(std::ostream& os) { \
219 char arr[100]; \
220 Vector<char> buffer(arr, arraysize(arr)); \
221 os << std::string(IntToCString(get_lane(0), buffer)); \
222 for (int i = 1; i < lane_count; i++) { \
223 os << ", " << std::string(IntToCString(get_lane(i), buffer)); \
224 } \
225 }
226SIMD128_INT_PRINT_FUNCTION(Int32x4, 4)
227SIMD128_INT_PRINT_FUNCTION(Uint32x4, 4)
228SIMD128_INT_PRINT_FUNCTION(Int16x8, 8)
229SIMD128_INT_PRINT_FUNCTION(Uint16x8, 8)
230SIMD128_INT_PRINT_FUNCTION(Int8x16, 16)
231SIMD128_INT_PRINT_FUNCTION(Uint8x16, 16)
232#undef SIMD128_INT_PRINT_FUNCTION
233
234
235#define SIMD128_BOOL_PRINT_FUNCTION(type, lane_count) \
236 void type::type##Print(std::ostream& os) { \
237 char arr[100]; \
238 Vector<char> buffer(arr, arraysize(arr)); \
239 os << std::string(get_lane(0) ? "true" : "false"); \
240 for (int i = 1; i < lane_count; i++) { \
241 os << ", " << std::string(get_lane(i) ? "true" : "false"); \
242 } \
243 }
244SIMD128_BOOL_PRINT_FUNCTION(Bool32x4, 4)
245SIMD128_BOOL_PRINT_FUNCTION(Bool16x8, 8)
246SIMD128_BOOL_PRINT_FUNCTION(Bool8x16, 16)
247#undef SIMD128_BOOL_PRINT_FUNCTION
248
249
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400250void ByteArray::ByteArrayPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000251 os << "byte array, data starts at " << GetDataStartAddress();
Steve Block9fac8402011-05-12 15:51:54 +0100252}
253
254
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000255void BytecodeArray::BytecodeArrayPrint(std::ostream& os) { // NOLINT
256 Disassemble(os);
257}
258
259
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400260void FreeSpace::FreeSpacePrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000261 os << "free space, size " << Size();
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100262}
263
264
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000265template <class Traits>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400266void FixedTypedArray<Traits>::FixedTypedArrayPrint(
267 std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000268 os << "fixed " << Traits::Designator();
Steve Block9fac8402011-05-12 15:51:54 +0100269}
270
271
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400272void JSObject::PrintProperties(std::ostream& os) { // NOLINT
Steve Block9fac8402011-05-12 15:51:54 +0100273 if (HasFastProperties()) {
274 DescriptorArray* descs = map()->instance_descriptors();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000275 for (int i = 0; i < map()->NumberOfOwnDescriptors(); i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000276 os << "\n ";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000277 descs->GetKey(i)->NamePrint(os);
278 os << ": ";
Steve Block9fac8402011-05-12 15:51:54 +0100279 switch (descs->GetType(i)) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000280 case DATA: {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000281 FieldIndex index = FieldIndex::ForDescriptor(map(), i);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400282 if (IsUnboxedDoubleField(index)) {
283 os << "<unboxed double> " << RawFastDoublePropertyAt(index);
284 } else {
285 os << Brief(RawFastPropertyAt(index));
286 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000287 os << " (data field at offset " << index.property_index() << ")";
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400288 break;
289 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290 case ACCESSOR: {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400291 FieldIndex index = FieldIndex::ForDescriptor(map(), i);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292 os << " (accessor field at offset " << index.property_index() << ")";
Steve Block9fac8402011-05-12 15:51:54 +0100293 break;
294 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000295 case DATA_CONSTANT:
296 os << Brief(descs->GetConstant(i)) << " (data constant)";
Steve Block9fac8402011-05-12 15:51:54 +0100297 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000298 case ACCESSOR_CONSTANT:
299 os << Brief(descs->GetCallbacksObject(i)) << " (accessor constant)";
Steve Block9fac8402011-05-12 15:51:54 +0100300 break;
301 }
302 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303 } else if (IsJSGlobalObject()) {
304 global_dictionary()->Print(os);
Steve Block9fac8402011-05-12 15:51:54 +0100305 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000306 property_dictionary()->Print(os);
Steve Block9fac8402011-05-12 15:51:54 +0100307 }
308}
309
310
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000311template <class T>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400312static void DoPrintElements(std::ostream& os, Object* object) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000313 T* p = T::cast(object);
314 for (int i = 0; i < p->length(); i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000315 os << "\n " << i << ": " << p->get_scalar(i);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000316 }
317}
318
319
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400320void JSObject::PrintElements(std::ostream& os) { // NOLINT
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100321 // Don't call GetElementsKind, its validation code can cause the printer to
322 // fail when debugging.
323 switch (map()->elements_kind()) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000324 case FAST_HOLEY_SMI_ELEMENTS:
325 case FAST_SMI_ELEMENTS:
326 case FAST_HOLEY_ELEMENTS:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100327 case FAST_ELEMENTS:
328 case FAST_STRING_WRAPPER_ELEMENTS: {
Steve Block9fac8402011-05-12 15:51:54 +0100329 // Print in array notation for non-sparse arrays.
330 FixedArray* p = FixedArray::cast(elements());
331 for (int i = 0; i < p->length(); i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000332 os << "\n " << i << ": " << Brief(p->get(i));
Steve Block9fac8402011-05-12 15:51:54 +0100333 }
334 break;
335 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000336 case FAST_HOLEY_DOUBLE_ELEMENTS:
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000337 case FAST_DOUBLE_ELEMENTS: {
338 // Print in array notation for non-sparse arrays.
Ben Murdoch5710cea2012-05-21 14:52:42 +0100339 if (elements()->length() > 0) {
340 FixedDoubleArray* p = FixedDoubleArray::cast(elements());
341 for (int i = 0; i < p->length(); i++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000342 os << "\n " << i << ": ";
Ben Murdoch5710cea2012-05-21 14:52:42 +0100343 if (p->is_the_hole(i)) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000344 os << "<the hole>";
Ben Murdoch5710cea2012-05-21 14:52:42 +0100345 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000346 os << p->get_scalar(i);
Ben Murdoch5710cea2012-05-21 14:52:42 +0100347 }
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000348 }
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000349 }
350 break;
351 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000352
353
354#define PRINT_ELEMENTS(Kind, Type) \
355 case Kind: { \
356 DoPrintElements<Type>(os, elements()); \
357 break; \
358 }
359
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000360 PRINT_ELEMENTS(UINT8_ELEMENTS, FixedUint8Array)
361 PRINT_ELEMENTS(UINT8_CLAMPED_ELEMENTS, FixedUint8ClampedArray)
362 PRINT_ELEMENTS(INT8_ELEMENTS, FixedInt8Array)
363 PRINT_ELEMENTS(UINT16_ELEMENTS, FixedUint16Array)
364 PRINT_ELEMENTS(INT16_ELEMENTS, FixedInt16Array)
365 PRINT_ELEMENTS(UINT32_ELEMENTS, FixedUint32Array)
366 PRINT_ELEMENTS(INT32_ELEMENTS, FixedInt32Array)
367 PRINT_ELEMENTS(FLOAT32_ELEMENTS, FixedFloat32Array)
368 PRINT_ELEMENTS(FLOAT64_ELEMENTS, FixedFloat64Array)
369
370#undef PRINT_ELEMENTS
371
Steve Block9fac8402011-05-12 15:51:54 +0100372 case DICTIONARY_ELEMENTS:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100373 case SLOW_STRING_WRAPPER_ELEMENTS:
374 os << "\n - elements: ";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000375 elements()->Print(os);
Steve Block9fac8402011-05-12 15:51:54 +0100376 break;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000377 case FAST_SLOPPY_ARGUMENTS_ELEMENTS:
378 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: {
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000379 FixedArray* p = FixedArray::cast(elements());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000380 os << "\n parameter map:";
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000381 for (int i = 2; i < p->length(); i++) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000382 os << " " << (i - 2) << ":" << Brief(p->get(i));
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000383 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000384 os << "\n context: " << Brief(p->get(0))
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000385 << "\n arguments: " << Brief(p->get(1));
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000386 break;
387 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100388 case NO_ELEMENTS:
389 break;
Steve Block9fac8402011-05-12 15:51:54 +0100390 }
391}
392
393
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394static void JSObjectPrintHeader(std::ostream& os, JSObject* obj,
395 const char* id) { // NOLINT
396 obj->PrintHeader(os, id);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100397 // Don't call GetElementsKind, its validation code can cause the printer to
398 // fail when debugging.
Ben Murdoch097c5b22016-05-18 11:27:45 +0100399 os << "\n - map = " << reinterpret_cast<void*>(obj->map()) << " ["
Ben Murdochda12d292016-06-02 14:46:10 +0100400 << ElementsKindToString(obj->map()->elements_kind());
401 if (obj->elements()->map() == obj->GetHeap()->fixed_cow_array_map()) {
402 os << " (COW)";
403 }
404 PrototypeIterator iter(obj->GetIsolate(), obj);
405 os << "]\n - prototype = " << reinterpret_cast<void*>(iter.GetCurrent());
406 if (obj->elements()->length() > 0) {
407 os << "\n - elements = " << Brief(obj->elements());
408 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000409}
410
411
412static void JSObjectPrintBody(std::ostream& os, JSObject* obj, // NOLINT
413 bool print_elements = true) {
414 os << "\n {";
415 obj->PrintProperties(os);
416 obj->PrintTransitions(os);
417 if (print_elements) obj->PrintElements(os);
418 os << "\n }\n";
419}
420
421
422void JSObject::JSObjectPrint(std::ostream& os) { // NOLINT
423 JSObjectPrintHeader(os, this, "JSObject");
424 JSObjectPrintBody(os, this);
425}
426
427
428void JSRegExp::JSRegExpPrint(std::ostream& os) { // NOLINT
429 JSObjectPrintHeader(os, this, "JSRegExp");
430 os << "\n - data = " << Brief(data());
431 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000432}
433
434
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400435void JSModule::JSModulePrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000436 JSObjectPrintHeader(os, this, "JSModule");
437 os << "\n - context = " << Brief(context());
438 os << " - scope_info = " << Brief(scope_info());
439 JSObjectPrintBody(os, this);
Steve Block9fac8402011-05-12 15:51:54 +0100440}
441
442
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400443void Symbol::SymbolPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000444 HeapObject::PrintHeader(os, "Symbol");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100445 os << "\n - hash: " << Hash();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000446 os << "\n - name: " << Brief(name());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400447 if (name()->IsUndefined()) {
448 os << " (" << PrivateSymbolToName() << ")";
449 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000450 os << "\n - private: " << is_private();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000451 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100452}
453
454
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400455void Map::MapPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000456 HeapObject::PrintHeader(os, "Map");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100457 os << "\n - type: " << instance_type();
458 os << "\n - instance size: " << instance_size();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000459 if (IsJSObjectMap()) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100460 os << "\n - inobject properties: " << GetInObjectProperties();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000461 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100462 os << "\n - elements kind: " << ElementsKindToString(elements_kind());
463 os << "\n - unused property fields: " << unused_property_fields();
Ben Murdochda12d292016-06-02 14:46:10 +0100464 os << "\n - enum length: ";
465 if (EnumLength() == kInvalidEnumCacheSentinel) {
466 os << "invalid";
467 } else {
468 os << EnumLength();
469 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100470 if (is_deprecated()) os << "\n - deprecated_map";
471 if (is_stable()) os << "\n - stable_map";
472 if (is_dictionary_map()) os << "\n - dictionary_map";
473 if (has_hidden_prototype()) os << "\n - has_hidden_prototype";
474 if (has_named_interceptor()) os << " - named_interceptor";
475 if (has_indexed_interceptor()) os << "\n - indexed_interceptor";
476 if (is_undetectable()) os << "\n - undetectable";
477 if (is_callable()) os << "\n - callable";
478 if (is_constructor()) os << "\n - constructor";
479 if (is_access_check_needed()) os << "\n - access_check_needed";
480 if (!is_extensible()) os << "\n - non-extensible";
481 if (is_observed()) os << "\n - observed";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000482 if (is_prototype_map()) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100483 os << "\n - prototype_map";
484 os << "\n - prototype info: " << Brief(prototype_info());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000485 } else {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100486 os << "\n - back pointer: " << Brief(GetBackPointer());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000487 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000488 os << "\n - instance descriptors " << (owns_descriptors() ? "(own) " : "")
489 << "#" << NumberOfOwnDescriptors() << ": "
490 << Brief(instance_descriptors());
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400491 if (FLAG_unbox_double_fields) {
492 os << "\n - layout descriptor: " << Brief(layout_descriptor());
493 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000494 int nof_transitions = TransitionArray::NumberOfTransitions(raw_transitions());
495 if (nof_transitions > 0) {
496 os << "\n - transitions #" << nof_transitions << ": "
497 << Brief(raw_transitions());
498 TransitionArray::PrintTransitions(os, raw_transitions(), false);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000499 }
500 os << "\n - prototype: " << Brief(prototype());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000501 os << "\n - constructor: " << Brief(GetConstructor());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000502 os << "\n - code cache: " << Brief(code_cache());
503 os << "\n - dependent code: " << Brief(dependent_code());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000504 os << "\n - construction counter: " << construction_counter();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000505 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100506}
507
508
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400509void CodeCache::CodeCachePrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000510 HeapObject::PrintHeader(os, "CodeCache");
511 os << "\n - default_cache: " << Brief(default_cache());
512 os << "\n - normal_type_cache: " << Brief(normal_type_cache());
Ben Murdoch3fb3ca82011-12-02 17:19:32 +0000513}
514
515
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400516void PolymorphicCodeCache::PolymorphicCodeCachePrint(
517 std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000518 HeapObject::PrintHeader(os, "PolymorphicCodeCache");
519 os << "\n - cache: " << Brief(cache());
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100520}
521
522
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400523void TypeFeedbackInfo::TypeFeedbackInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000524 HeapObject::PrintHeader(os, "TypeFeedbackInfo");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100525 os << "\n - ic_total_count: " << ic_total_count()
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000526 << ", ic_with_type_info_count: " << ic_with_type_info_count()
527 << ", ic_generic_count: " << ic_generic_count() << "\n";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100528}
529
530
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400531void AliasedArgumentsEntry::AliasedArgumentsEntryPrint(
532 std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000533 HeapObject::PrintHeader(os, "AliasedArgumentsEntry");
534 os << "\n - aliased_context_slot: " << aliased_context_slot();
535}
536
537
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400538void FixedArray::FixedArrayPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000539 HeapObject::PrintHeader(os, "FixedArray");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100540 os << "\n - length: " << length();
Steve Block9fac8402011-05-12 15:51:54 +0100541 for (int i = 0; i < length(); i++) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000542 os << "\n [" << i << "]: " << Brief(get(i));
Steve Block9fac8402011-05-12 15:51:54 +0100543 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000544 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100545}
546
547
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400548void FixedDoubleArray::FixedDoubleArrayPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000549 HeapObject::PrintHeader(os, "FixedDoubleArray");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100550 os << "\n - length: " << length();
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100551 for (int i = 0; i < length(); i++) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000552 os << "\n [" << i << "]: ";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100553 if (is_the_hole(i)) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000554 os << "<the hole>";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100555 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000556 os << get_scalar(i);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100557 }
558 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000559 os << "\n";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100560}
561
562
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000563void TransitionArray::TransitionArrayPrint(std::ostream& os) { // NOLINT
564 HeapObject::PrintHeader(os, "TransitionArray");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100565 os << "\n - capacity: " << length();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000566 for (int i = 0; i < length(); i++) {
567 os << "\n [" << i << "]: " << Brief(get(i));
568 if (i == kNextLinkIndex) os << " (next link)";
569 if (i == kPrototypeTransitionsIndex) os << " (prototype transitions)";
570 if (i == kTransitionLengthIndex) os << " (number of transitions)";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000571 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000572 os << "\n";
573}
574
575
576void TypeFeedbackMetadata::Print() {
577 OFStream os(stdout);
578 TypeFeedbackMetadataPrint(os);
579 os << std::flush;
580}
581
582
583void TypeFeedbackMetadata::TypeFeedbackMetadataPrint(
584 std::ostream& os) { // NOLINT
585 HeapObject::PrintHeader(os, "TypeFeedbackMetadata");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100586 os << "\n - length: " << length();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000587 if (length() == 0) {
588 os << " (empty)\n";
589 return;
590 }
591
592 TypeFeedbackMetadataIterator iter(this);
593 while (iter.HasNext()) {
594 FeedbackVectorSlot slot = iter.Next();
595 FeedbackVectorSlotKind kind = iter.kind();
596 os << "\n Slot " << slot << " " << kind;
597 }
598 os << "\n";
599}
600
601
602void TypeFeedbackVector::Print() {
603 OFStream os(stdout);
604 TypeFeedbackVectorPrint(os);
605 os << std::flush;
606}
607
608
609void TypeFeedbackVector::TypeFeedbackVectorPrint(std::ostream& os) { // NOLINT
610 HeapObject::PrintHeader(os, "TypeFeedbackVector");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100611 os << "\n - length: " << length();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000612 if (length() == 0) {
613 os << " (empty)\n";
614 return;
615 }
616
617 TypeFeedbackMetadataIterator iter(metadata());
618 while (iter.HasNext()) {
619 FeedbackVectorSlot slot = iter.Next();
620 FeedbackVectorSlotKind kind = iter.kind();
621
622 os << "\n Slot " << slot << " " << kind << " ";
623 switch (kind) {
624 case FeedbackVectorSlotKind::LOAD_IC: {
625 LoadICNexus nexus(this, slot);
626 os << Code::ICState2String(nexus.StateFromFeedback());
627 break;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000628 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000629 case FeedbackVectorSlotKind::KEYED_LOAD_IC: {
630 KeyedLoadICNexus nexus(this, slot);
631 os << Code::ICState2String(nexus.StateFromFeedback());
632 break;
633 }
634 case FeedbackVectorSlotKind::CALL_IC: {
635 CallICNexus nexus(this, slot);
636 os << Code::ICState2String(nexus.StateFromFeedback());
637 break;
638 }
639 case FeedbackVectorSlotKind::STORE_IC: {
640 StoreICNexus nexus(this, slot);
641 os << Code::ICState2String(nexus.StateFromFeedback());
642 break;
643 }
644 case FeedbackVectorSlotKind::KEYED_STORE_IC: {
645 KeyedStoreICNexus nexus(this, slot);
646 os << Code::ICState2String(nexus.StateFromFeedback());
647 break;
648 }
649 case FeedbackVectorSlotKind::GENERAL:
650 break;
651 case FeedbackVectorSlotKind::INVALID:
652 case FeedbackVectorSlotKind::KINDS_NUMBER:
653 UNREACHABLE();
654 break;
655 }
656
657 int entry_size = iter.entry_size();
658 for (int i = 0; i < entry_size; i++) {
659 int index = GetIndex(slot) + i;
660 os << "\n [" << index << "]: " << Brief(get(index));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000661 }
662 }
663 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100664}
665
666
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400667void JSValue::JSValuePrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000668 JSObjectPrintHeader(os, this, "JSValue");
669 os << "\n - value = " << Brief(value());
670 JSObjectPrintBody(os, this);
Steve Block1e0659c2011-05-24 12:43:12 +0100671}
672
673
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400674void JSMessageObject::JSMessageObjectPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000675 JSObjectPrintHeader(os, this, "JSMessageObject");
676 os << "\n - type: " << type();
677 os << "\n - arguments: " << Brief(argument());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000678 os << "\n - start_position: " << start_position();
679 os << "\n - end_position: " << end_position();
680 os << "\n - script: " << Brief(script());
681 os << "\n - stack_frames: " << Brief(stack_frames());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000682 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000683}
684
685
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400686void String::StringPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000687 if (StringShape(this).IsInternalized()) {
688 os << "#";
Steve Block9fac8402011-05-12 15:51:54 +0100689 } else if (StringShape(this).IsCons()) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000690 os << "c\"";
Steve Block9fac8402011-05-12 15:51:54 +0100691 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000692 os << "\"";
Steve Block9fac8402011-05-12 15:51:54 +0100693 }
694
695 const char truncated_epilogue[] = "...<truncated>";
696 int len = length();
697 if (!FLAG_use_verbose_printer) {
698 if (len > 100) {
699 len = 100 - sizeof(truncated_epilogue);
700 }
701 }
702 for (int i = 0; i < len; i++) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000703 os << AsUC16(Get(i));
Steve Block9fac8402011-05-12 15:51:54 +0100704 }
705 if (len != length()) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000706 os << truncated_epilogue;
Steve Block9fac8402011-05-12 15:51:54 +0100707 }
708
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000709 if (!StringShape(this).IsInternalized()) os << "\"";
710}
711
712
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400713void Name::NamePrint(std::ostream& os) { // NOLINT
714 if (IsString()) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000715 String::cast(this)->StringPrint(os);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400716 } else if (IsSymbol()) {
717 Symbol::cast(this)->name()->Print(os);
718 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000719 os << Brief(this);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400720 }
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000721}
722
723
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100724static const char* const weekdays[] = {
725 "???", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
726};
727
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000728
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400729void JSDate::JSDatePrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000730 JSObjectPrintHeader(os, this, "JSDate");
731 os << "\n - value = " << Brief(value());
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100732 if (!year()->IsSmi()) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000733 os << "\n - time = NaN\n";
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100734 } else {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000735 // TODO(svenpanne) Add some basic formatting to our streams.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000736 ScopedVector<char> buf(100);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000737 SNPrintF(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000738 buf, "\n - time = %s %04d/%02d/%02d %02d:%02d:%02d\n",
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000739 weekdays[weekday()->IsSmi() ? Smi::cast(weekday())->value() + 1 : 0],
740 year()->IsSmi() ? Smi::cast(year())->value() : -1,
741 month()->IsSmi() ? Smi::cast(month())->value() : -1,
742 day()->IsSmi() ? Smi::cast(day())->value() : -1,
743 hour()->IsSmi() ? Smi::cast(hour())->value() : -1,
744 min()->IsSmi() ? Smi::cast(min())->value() : -1,
745 sec()->IsSmi() ? Smi::cast(sec())->value() : -1);
746 os << buf.start();
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100747 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000748 JSObjectPrintBody(os, this);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100749}
750
751
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400752void JSProxy::JSProxyPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000753 HeapObject::PrintHeader(os, "JSProxy");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100754 os << "\n - map = " << reinterpret_cast<void*>(map());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000755 os << "\n - target = ";
756 target()->ShortPrint(os);
757 os << "\n - handler = ";
758 handler()->ShortPrint(os);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000759 os << "\n - hash = ";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000760 hash()->ShortPrint(os);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000761 os << "\n";
Ben Murdoch589d6972011-11-30 16:04:58 +0000762}
763
764
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400765void JSSet::JSSetPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000766 JSObjectPrintHeader(os, this, "JSSet");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000767 os << " - table = " << Brief(table());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000768 JSObjectPrintBody(os, this);
Ben Murdoch69a99ed2011-11-30 16:03:39 +0000769}
770
771
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400772void JSMap::JSMapPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000773 JSObjectPrintHeader(os, this, "JSMap");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000774 os << " - table = " << Brief(table());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000775 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000776}
777
778
779template <class Derived, class TableType>
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400780void
781OrderedHashTableIterator<Derived, TableType>::OrderedHashTableIteratorPrint(
782 std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000783 os << "\n - table = " << Brief(table());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000784 os << "\n - index = " << Brief(index());
785 os << "\n - kind = " << Brief(kind());
786 os << "\n";
787}
788
789
790template void OrderedHashTableIterator<
791 JSSetIterator,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400792 OrderedHashSet>::OrderedHashTableIteratorPrint(std::ostream& os); // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000793
794
795template void OrderedHashTableIterator<
796 JSMapIterator,
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400797 OrderedHashMap>::OrderedHashTableIteratorPrint(std::ostream& os); // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000798
799
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400800void JSSetIterator::JSSetIteratorPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000801 JSObjectPrintHeader(os, this, "JSSetIterator");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000802 OrderedHashTableIteratorPrint(os);
803}
804
805
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400806void JSMapIterator::JSMapIteratorPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000807 JSObjectPrintHeader(os, this, "JSMapIterator");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000808 OrderedHashTableIteratorPrint(os);
809}
810
811
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000812void JSWeakMap::JSWeakMapPrint(std::ostream& os) { // NOLINT
813 JSObjectPrintHeader(os, this, "JSWeakMap");
814 os << "\n - table = " << Brief(table());
815 JSObjectPrintBody(os, this);
816}
817
818
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400819void JSWeakSet::JSWeakSetPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000820 JSObjectPrintHeader(os, this, "JSWeakSet");
821 os << "\n - table = " << Brief(table());
822 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000823}
824
825
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400826void JSArrayBuffer::JSArrayBufferPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000827 JSObjectPrintHeader(os, this, "JSArrayBuffer");
828 os << "\n - backing_store = " << backing_store();
829 os << "\n - byte_length = " << Brief(byte_length());
830 if (was_neutered()) os << " - neutered\n";
831 JSObjectPrintBody(os, this, !was_neutered());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000832}
833
834
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400835void JSTypedArray::JSTypedArrayPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000836 JSObjectPrintHeader(os, this, "JSTypedArray");
837 os << "\n - buffer = " << Brief(buffer());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000838 os << "\n - byte_offset = " << Brief(byte_offset());
839 os << "\n - byte_length = " << Brief(byte_length());
840 os << "\n - length = " << Brief(length());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000841 if (WasNeutered()) os << " - neutered\n";
842 JSObjectPrintBody(os, this, !WasNeutered());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000843}
844
845
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400846void JSDataView::JSDataViewPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000847 JSObjectPrintHeader(os, this, "JSDataView");
848 os << "\n - buffer =" << Brief(buffer());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000849 os << "\n - byte_offset = " << Brief(byte_offset());
850 os << "\n - byte_length = " << Brief(byte_length());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000851 if (WasNeutered()) os << " - neutered\n";
852 JSObjectPrintBody(os, this, !WasNeutered());
853}
854
855
856void JSBoundFunction::JSBoundFunctionPrint(std::ostream& os) { // NOLINT
857 JSObjectPrintHeader(os, this, "JSBoundFunction");
858 os << "\n - bound_target_function = " << Brief(bound_target_function());
859 os << "\n - bound_this = " << Brief(bound_this());
860 os << "\n - bound_arguments = " << Brief(bound_arguments());
861 JSObjectPrintBody(os, this);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000862}
863
864
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400865void JSFunction::JSFunctionPrint(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000866 JSObjectPrintHeader(os, this, "Function");
867 os << "\n - initial_map = ";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000868 if (has_initial_map()) os << Brief(initial_map());
869 os << "\n - shared_info = " << Brief(shared());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000870 os << "\n - name = " << Brief(shared()->name());
Ben Murdochda12d292016-06-02 14:46:10 +0100871 os << "\n - formal_parameter_count = "
872 << shared()->internal_formal_parameter_count();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000873 if (shared()->is_generator()) {
874 os << "\n - generator";
Steve Block9fac8402011-05-12 15:51:54 +0100875 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000876 os << "\n - context = " << Brief(context());
877 os << "\n - literals = " << Brief(literals());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000878 os << "\n - code = " << Brief(code());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000879 JSObjectPrintBody(os, this);
Steve Block9fac8402011-05-12 15:51:54 +0100880}
881
882
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400883void SharedFunctionInfo::SharedFunctionInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000884 HeapObject::PrintHeader(os, "SharedFunctionInfo");
Ben Murdochda12d292016-06-02 14:46:10 +0100885 os << "\n - name = " << Brief(name());
886 os << "\n - formal_parameter_count = " << internal_formal_parameter_count();
887 os << "\n - expected_nof_properties = " << expected_nof_properties();
888 os << "\n - ast_node_count = " << ast_node_count();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000889 os << "\n - instance class name = ";
890 instance_class_name()->Print(os);
891 os << "\n - code = " << Brief(code());
892 if (HasSourceCode()) {
893 os << "\n - source code = ";
894 String* source = String::cast(Script::cast(script())->source());
895 int start = start_position();
896 int length = end_position() - start;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000897 base::SmartArrayPointer<char> source_string = source->ToCString(
898 DISALLOW_NULLS, FAST_STRING_TRAVERSAL, start, length, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000899 os << source_string.get();
900 }
Steve Block9fac8402011-05-12 15:51:54 +0100901 // Script files are often large, hard to read.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000902 // os << "\n - script =";
903 // script()->Print(os);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100904 if (is_named_expression()) {
905 os << "\n - named expression";
906 } else if (is_anonymous_expression()) {
907 os << "\n - anonymous expression";
908 } else if (is_declaration()) {
909 os << "\n - declaration";
910 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000911 os << "\n - function token position = " << function_token_position();
912 os << "\n - start position = " << start_position();
913 os << "\n - end position = " << end_position();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000914 os << "\n - debug info = " << Brief(debug_info());
915 os << "\n - length = " << length();
916 os << "\n - optimized_code_map = " << Brief(optimized_code_map());
917 os << "\n - feedback_vector = ";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000918 feedback_vector()->TypeFeedbackVectorPrint(os);
919 if (HasBytecodeArray()) {
920 os << "\n - bytecode_array = " << bytecode_array();
921 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000922 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100923}
924
925
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400926void JSGlobalProxy::JSGlobalProxyPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000927 os << "global_proxy ";
928 JSObjectPrint(os);
929 os << "native context : " << Brief(native_context());
930 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100931}
932
933
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400934void JSGlobalObject::JSGlobalObjectPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000935 os << "global ";
936 JSObjectPrint(os);
937 os << "native context : " << Brief(native_context());
938 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100939}
940
941
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400942void Cell::CellPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000943 HeapObject::PrintHeader(os, "Cell");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100944 os << "\n - value: " << Brief(value());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000945 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100946}
947
948
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400949void PropertyCell::PropertyCellPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000950 HeapObject::PrintHeader(os, "PropertyCell");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100951 os << "\n - value: " << Brief(value());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000952 os << "\n - details: " << property_details();
953 os << "\n";
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000954}
955
956
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400957void WeakCell::WeakCellPrint(std::ostream& os) { // NOLINT
958 HeapObject::PrintHeader(os, "WeakCell");
959 if (cleared()) {
960 os << "\n - cleared";
961 } else {
962 os << "\n - value: " << Brief(value());
963 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000964 os << "\n";
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400965}
966
967
968void Code::CodePrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000969 HeapObject::PrintHeader(os, "Code");
Ben Murdoch097c5b22016-05-18 11:27:45 +0100970 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100971#ifdef ENABLE_DISASSEMBLER
972 if (FLAG_use_verbose_printer) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000973 Disassemble(NULL, os);
Steve Block9fac8402011-05-12 15:51:54 +0100974 }
975#endif
976}
977
978
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400979void Foreign::ForeignPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000980 os << "foreign address : " << foreign_address();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000981 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100982}
983
984
Ben Murdoch097c5b22016-05-18 11:27:45 +0100985void AccessorInfo::AccessorInfoPrint(std::ostream& os) { // NOLINT
986 HeapObject::PrintHeader(os, "AccessorInfo");
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000987 os << "\n - name: " << Brief(name());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000988 os << "\n - flag: " << flag();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000989 os << "\n - getter: " << Brief(getter());
990 os << "\n - setter: " << Brief(setter());
991 os << "\n - data: " << Brief(data());
992 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +0100993}
994
995
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400996void Box::BoxPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000997 HeapObject::PrintHeader(os, "Box");
998 os << "\n - value: " << Brief(value());
999 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001000}
1001
1002
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001003void PrototypeInfo::PrototypeInfoPrint(std::ostream& os) { // NOLINT
1004 HeapObject::PrintHeader(os, "PrototypeInfo");
1005 os << "\n - prototype users: " << Brief(prototype_users());
1006 os << "\n - registry slot: " << registry_slot();
1007 os << "\n - validity cell: " << Brief(validity_cell());
1008 os << "\n";
1009}
1010
1011
1012void SloppyBlockWithEvalContextExtension::
1013 SloppyBlockWithEvalContextExtensionPrint(std::ostream& os) { // NOLINT
1014 HeapObject::PrintHeader(os, "SloppyBlockWithEvalContextExtension");
1015 os << "\n - scope_info: " << Brief(scope_info());
1016 os << "\n - extension: " << Brief(extension());
1017 os << "\n";
1018}
1019
1020
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001021void AccessorPair::AccessorPairPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001022 HeapObject::PrintHeader(os, "AccessorPair");
1023 os << "\n - getter: " << Brief(getter());
1024 os << "\n - setter: " << Brief(setter());
1025 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001026}
1027
1028
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001029void AccessCheckInfo::AccessCheckInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001030 HeapObject::PrintHeader(os, "AccessCheckInfo");
1031 os << "\n - named_callback: " << Brief(named_callback());
1032 os << "\n - indexed_callback: " << Brief(indexed_callback());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001033 os << "\n - callback: " << Brief(callback());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001034 os << "\n - data: " << Brief(data());
1035 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001036}
1037
1038
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001039void InterceptorInfo::InterceptorInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001040 HeapObject::PrintHeader(os, "InterceptorInfo");
1041 os << "\n - getter: " << Brief(getter());
1042 os << "\n - setter: " << Brief(setter());
1043 os << "\n - query: " << Brief(query());
1044 os << "\n - deleter: " << Brief(deleter());
1045 os << "\n - enumerator: " << Brief(enumerator());
1046 os << "\n - data: " << Brief(data());
1047 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001048}
1049
1050
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001051void CallHandlerInfo::CallHandlerInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001052 HeapObject::PrintHeader(os, "CallHandlerInfo");
1053 os << "\n - callback: " << Brief(callback());
1054 os << "\n - data: " << Brief(data());
1055 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001056}
1057
1058
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001059void FunctionTemplateInfo::FunctionTemplateInfoPrint(
1060 std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001061 HeapObject::PrintHeader(os, "FunctionTemplateInfo");
1062 os << "\n - class name: " << Brief(class_name());
1063 os << "\n - tag: " << Brief(tag());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001064 os << "\n - serial_number: " << Brief(serial_number());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001065 os << "\n - property_list: " << Brief(property_list());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001066 os << "\n - call_code: " << Brief(call_code());
1067 os << "\n - property_accessors: " << Brief(property_accessors());
1068 os << "\n - prototype_template: " << Brief(prototype_template());
1069 os << "\n - parent_template: " << Brief(parent_template());
1070 os << "\n - named_property_handler: " << Brief(named_property_handler());
1071 os << "\n - indexed_property_handler: " << Brief(indexed_property_handler());
1072 os << "\n - instance_template: " << Brief(instance_template());
1073 os << "\n - signature: " << Brief(signature());
1074 os << "\n - access_check_info: " << Brief(access_check_info());
1075 os << "\n - hidden_prototype: " << (hidden_prototype() ? "true" : "false");
1076 os << "\n - undetectable: " << (undetectable() ? "true" : "false");
1077 os << "\n - need_access_check: " << (needs_access_check() ? "true" : "false");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001078 os << "\n - instantiated: " << (instantiated() ? "true" : "false");
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001079 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001080}
1081
1082
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001083void ObjectTemplateInfo::ObjectTemplateInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001084 HeapObject::PrintHeader(os, "ObjectTemplateInfo");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001085 os << "\n - tag: " << Brief(tag());
1086 os << "\n - serial_number: " << Brief(serial_number());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001087 os << "\n - property_list: " << Brief(property_list());
1088 os << "\n - property_accessors: " << Brief(property_accessors());
1089 os << "\n - constructor: " << Brief(constructor());
1090 os << "\n - internal_field_count: " << Brief(internal_field_count());
1091 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001092}
1093
1094
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001095void AllocationSite::AllocationSitePrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001096 HeapObject::PrintHeader(os, "AllocationSite");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001097 os << "\n - weak_next: " << Brief(weak_next());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001098 os << "\n - dependent code: " << Brief(dependent_code());
1099 os << "\n - nested site: " << Brief(nested_site());
1100 os << "\n - memento found count: "
1101 << Brief(Smi::FromInt(memento_found_count()));
1102 os << "\n - memento create count: "
1103 << Brief(Smi::FromInt(memento_create_count()));
1104 os << "\n - pretenure decision: "
1105 << Brief(Smi::FromInt(pretenure_decision()));
1106 os << "\n - transition_info: ";
1107 if (transition_info()->IsSmi()) {
1108 ElementsKind kind = GetElementsKind();
1109 os << "Array allocation with ElementsKind " << ElementsKindToString(kind);
1110 } else if (transition_info()->IsJSArray()) {
1111 os << "Array literal " << Brief(transition_info());
1112 } else {
1113 os << "unknown transition_info" << Brief(transition_info());
1114 }
1115 os << "\n";
1116}
1117
1118
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001119void AllocationMemento::AllocationMementoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001120 HeapObject::PrintHeader(os, "AllocationMemento");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001121 os << "\n - allocation site: ";
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001122 if (IsValid()) {
1123 GetAllocationSite()->Print(os);
1124 } else {
1125 os << "<invalid>\n";
1126 }
1127}
1128
1129
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001130void Script::ScriptPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001131 HeapObject::PrintHeader(os, "Script");
1132 os << "\n - source: " << Brief(source());
1133 os << "\n - name: " << Brief(name());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001134 os << "\n - line_offset: " << line_offset();
1135 os << "\n - column_offset: " << column_offset();
1136 os << "\n - type: " << type();
1137 os << "\n - id: " << id();
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001138 os << "\n - context data: " << Brief(context_data());
1139 os << "\n - wrapper: " << Brief(wrapper());
1140 os << "\n - compilation type: " << compilation_type();
1141 os << "\n - line ends: " << Brief(line_ends());
1142 os << "\n - eval from shared: " << Brief(eval_from_shared());
1143 os << "\n - eval from instructions offset: "
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001144 << eval_from_instructions_offset();
1145 os << "\n - shared function infos: " << Brief(shared_function_infos());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001146 os << "\n";
1147}
1148
1149
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001150void DebugInfo::DebugInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001151 HeapObject::PrintHeader(os, "DebugInfo");
1152 os << "\n - shared: " << Brief(shared());
Ben Murdoch097c5b22016-05-18 11:27:45 +01001153 os << "\n - code: " << Brief(abstract_code());
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001154 os << "\n - break_points: ";
1155 break_points()->Print(os);
1156}
1157
1158
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001159void BreakPointInfo::BreakPointInfoPrint(std::ostream& os) { // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001160 HeapObject::PrintHeader(os, "BreakPointInfo");
Ben Murdoch097c5b22016-05-18 11:27:45 +01001161 os << "\n - code_offset: " << code_offset();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001162 os << "\n - source_position: " << source_position();
1163 os << "\n - statement_position: " << statement_position();
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001164 os << "\n - break_point_objects: " << Brief(break_point_objects());
1165 os << "\n";
1166}
1167
1168
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001169static void PrintBitMask(std::ostream& os, uint32_t value) { // NOLINT
1170 for (int i = 0; i < 32; i++) {
1171 if ((i & 7) == 0) os << " ";
1172 os << (((value & 1) == 0) ? "_" : "x");
1173 value >>= 1;
Steve Block9fac8402011-05-12 15:51:54 +01001174 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001175}
1176
1177
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001178void LayoutDescriptor::Print() {
1179 OFStream os(stdout);
1180 this->Print(os);
1181 os << std::flush;
1182}
1183
1184
1185void LayoutDescriptor::Print(std::ostream& os) { // NOLINT
1186 os << "Layout descriptor: ";
1187 if (IsUninitialized()) {
1188 os << "<uninitialized>";
1189 } else if (IsFastPointerLayout()) {
1190 os << "<all tagged>";
1191 } else if (IsSmi()) {
1192 os << "fast";
1193 PrintBitMask(os, static_cast<uint32_t>(Smi::cast(this)->value()));
1194 } else {
1195 os << "slow";
1196 int len = length();
1197 for (int i = 0; i < len; i++) {
1198 if (i > 0) os << " |";
1199 PrintBitMask(os, get_scalar(i));
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001200 }
1201 }
1202 os << "\n";
Steve Block9fac8402011-05-12 15:51:54 +01001203}
1204
1205
1206#endif // OBJECT_PRINT
1207
1208
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001209#if TRACE_MAPS
1210
1211
1212void Name::NameShortPrint() {
1213 if (this->IsString()) {
1214 PrintF("%s", String::cast(this)->ToCString().get());
1215 } else {
1216 DCHECK(this->IsSymbol());
1217 Symbol* s = Symbol::cast(this);
1218 if (s->name()->IsUndefined()) {
1219 PrintF("#<%s>", s->PrivateSymbolToName());
1220 } else {
1221 PrintF("<%s>", String::cast(s->name())->ToCString().get());
1222 }
1223 }
1224}
1225
1226
1227int Name::NameShortPrint(Vector<char> str) {
1228 if (this->IsString()) {
1229 return SNPrintF(str, "%s", String::cast(this)->ToCString().get());
1230 } else {
1231 DCHECK(this->IsSymbol());
1232 Symbol* s = Symbol::cast(this);
1233 if (s->name()->IsUndefined()) {
1234 return SNPrintF(str, "#<%s>", s->PrivateSymbolToName());
1235 } else {
1236 return SNPrintF(str, "<%s>", String::cast(s->name())->ToCString().get());
1237 }
1238 }
1239}
1240
1241
1242#endif // TRACE_MAPS
1243
1244
1245#if defined(DEBUG) || defined(OBJECT_PRINT)
1246// This method is only meant to be called from gdb for debugging purposes.
1247// Since the string can also be in two-byte encoding, non-Latin1 characters
1248// will be ignored in the output.
1249char* String::ToAsciiArray() {
1250 // Static so that subsequent calls frees previously allocated space.
1251 // This also means that previous results will be overwritten.
1252 static char* buffer = NULL;
1253 if (buffer != NULL) delete[] buffer;
1254 buffer = new char[length() + 1];
1255 WriteToFlat(this, reinterpret_cast<uint8_t*>(buffer), 0, length());
1256 buffer[length()] = 0;
1257 return buffer;
1258}
1259
1260
1261void DescriptorArray::Print() {
1262 OFStream os(stdout);
1263 this->PrintDescriptors(os);
1264 os << std::flush;
1265}
1266
1267
1268void DescriptorArray::PrintDescriptors(std::ostream& os) { // NOLINT
1269 HandleScope scope(GetIsolate());
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001270 os << "Descriptor array #" << number_of_descriptors();
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001271 for (int i = 0; i < number_of_descriptors(); i++) {
1272 Descriptor desc;
1273 Get(i, &desc);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001274 os << "\n " << i << ": " << desc;
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001275 }
1276 os << "\n";
1277}
1278
1279
1280void TransitionArray::Print() {
1281 OFStream os(stdout);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001282 TransitionArray::PrintTransitions(os, this);
1283 os << "\n" << std::flush;
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001284}
1285
1286
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001287void TransitionArray::PrintTransitions(std::ostream& os, Object* transitions,
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001288 bool print_header) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001289 int num_transitions = NumberOfTransitions(transitions);
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001290 if (print_header) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001291 os << "Transition array #" << num_transitions << ":";
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001292 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001293 for (int i = 0; i < num_transitions; i++) {
1294 Name* key = GetKey(transitions, i);
1295 Map* target = GetTarget(transitions, i);
1296 os << "\n ";
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001297#ifdef OBJECT_PRINT
1298 key->NamePrint(os);
1299#else
1300 key->ShortPrint(os);
1301#endif
1302 os << ": ";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001303 Heap* heap = key->GetHeap();
1304 if (key == heap->nonextensible_symbol()) {
1305 os << "(transition to non-extensible)";
1306 } else if (key == heap->sealed_symbol()) {
1307 os << "(transition to sealed)";
1308 } else if (key == heap->frozen_symbol()) {
1309 os << "(transition to frozen)";
1310 } else if (key == heap->elements_transition_symbol()) {
1311 os << "(transition to " << ElementsKindToString(target->elements_kind())
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001312 << ")";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001313 } else if (key == heap->strict_function_transition_symbol()) {
1314 os << " (transition to strict function)";
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001315 } else if (key == heap->observed_symbol()) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001316 os << " (transition to Object.observe)";
1317 } else {
1318 PropertyDetails details = GetTargetDetails(key, target);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001319 os << "(transition to ";
1320 if (details.location() == kDescriptor) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001321 os << "immutable ";
1322 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001323 os << (details.kind() == kData ? "data" : "accessor");
1324 if (details.location() == kDescriptor) {
1325 Object* value =
1326 target->instance_descriptors()->GetValue(target->LastAdded());
1327 os << " " << Brief(value);
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001328 }
1329 os << "), attrs: " << details.attributes();
1330 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001331 os << " -> " << Brief(target);
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001332 }
1333}
1334
1335
1336void JSObject::PrintTransitions(std::ostream& os) { // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001337 Object* transitions = map()->raw_transitions();
1338 int num_transitions = TransitionArray::NumberOfTransitions(transitions);
1339 if (num_transitions == 0) return;
1340 os << "\n - transitions";
1341 TransitionArray::PrintTransitions(os, transitions, false);
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001342}
1343#endif // defined(DEBUG) || defined(OBJECT_PRINT)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001344} // namespace internal
1345} // namespace v8