blob: ed08468e5c86d2b24cd2e32ce5d726cfdaeb9885 [file] [log] [blame]
Steve Blocka7e24c12009-10-30 11:49:00 +00001// Copyright 2006-2008 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#include "v8.h"
29
30#include "disassembler.h"
31#include "disasm.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000032#include "jsregexp.h"
Kristian Monsen80d68ea2010-09-08 11:05:35 +010033#include "objects-visiting.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000034
35namespace v8 {
36namespace internal {
37
38#ifdef DEBUG
39
40static const char* TypeToString(InstanceType type);
41
42
43void Object::Print() {
44 if (IsSmi()) {
45 Smi::cast(this)->SmiPrint();
46 } else if (IsFailure()) {
47 Failure::cast(this)->FailurePrint();
48 } else {
49 HeapObject::cast(this)->HeapObjectPrint();
50 }
51 Flush();
52}
53
54
55void Object::PrintLn() {
56 Print();
57 PrintF("\n");
58}
59
60
61void Object::Verify() {
62 if (IsSmi()) {
63 Smi::cast(this)->SmiVerify();
64 } else if (IsFailure()) {
65 Failure::cast(this)->FailureVerify();
66 } else {
67 HeapObject::cast(this)->HeapObjectVerify();
68 }
69}
70
71
72void Object::VerifyPointer(Object* p) {
73 if (p->IsHeapObject()) {
74 HeapObject::VerifyHeapPointer(p);
75 } else {
76 ASSERT(p->IsSmi());
77 }
78}
79
80
81void Smi::SmiVerify() {
82 ASSERT(IsSmi());
83}
84
85
86void Failure::FailureVerify() {
87 ASSERT(IsFailure());
88}
89
90
91void HeapObject::PrintHeader(const char* id) {
92 PrintF("%p: [%s]\n", this, id);
93}
94
95
96void HeapObject::HeapObjectPrint() {
97 InstanceType instance_type = map()->instance_type();
98
99 HandleScope scope;
100 if (instance_type < FIRST_NONSTRING_TYPE) {
101 String::cast(this)->StringPrint();
102 return;
103 }
104
105 switch (instance_type) {
106 case MAP_TYPE:
107 Map::cast(this)->MapPrint();
108 break;
109 case HEAP_NUMBER_TYPE:
110 HeapNumber::cast(this)->HeapNumberPrint();
111 break;
112 case FIXED_ARRAY_TYPE:
113 FixedArray::cast(this)->FixedArrayPrint();
114 break;
115 case BYTE_ARRAY_TYPE:
116 ByteArray::cast(this)->ByteArrayPrint();
117 break;
118 case PIXEL_ARRAY_TYPE:
119 PixelArray::cast(this)->PixelArrayPrint();
120 break;
Steve Block3ce2e202009-11-05 08:53:23 +0000121 case EXTERNAL_BYTE_ARRAY_TYPE:
122 ExternalByteArray::cast(this)->ExternalByteArrayPrint();
123 break;
124 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
125 ExternalUnsignedByteArray::cast(this)->ExternalUnsignedByteArrayPrint();
126 break;
127 case EXTERNAL_SHORT_ARRAY_TYPE:
128 ExternalShortArray::cast(this)->ExternalShortArrayPrint();
129 break;
130 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
131 ExternalUnsignedShortArray::cast(this)->ExternalUnsignedShortArrayPrint();
132 break;
133 case EXTERNAL_INT_ARRAY_TYPE:
134 ExternalIntArray::cast(this)->ExternalIntArrayPrint();
135 break;
136 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
137 ExternalUnsignedIntArray::cast(this)->ExternalUnsignedIntArrayPrint();
138 break;
139 case EXTERNAL_FLOAT_ARRAY_TYPE:
140 ExternalFloatArray::cast(this)->ExternalFloatArrayPrint();
141 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000142 case FILLER_TYPE:
143 PrintF("filler");
144 break;
145 case JS_OBJECT_TYPE: // fall through
146 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
147 case JS_ARRAY_TYPE:
148 case JS_REGEXP_TYPE:
149 JSObject::cast(this)->JSObjectPrint();
150 break;
151 case ODDBALL_TYPE:
152 Oddball::cast(this)->to_string()->Print();
153 break;
154 case JS_FUNCTION_TYPE:
155 JSFunction::cast(this)->JSFunctionPrint();
156 break;
157 case JS_GLOBAL_PROXY_TYPE:
158 JSGlobalProxy::cast(this)->JSGlobalProxyPrint();
159 break;
160 case JS_GLOBAL_OBJECT_TYPE:
161 JSGlobalObject::cast(this)->JSGlobalObjectPrint();
162 break;
163 case JS_BUILTINS_OBJECT_TYPE:
164 JSBuiltinsObject::cast(this)->JSBuiltinsObjectPrint();
165 break;
166 case JS_VALUE_TYPE:
167 PrintF("Value wrapper around:");
168 JSValue::cast(this)->value()->Print();
169 break;
170 case CODE_TYPE:
171 Code::cast(this)->CodePrint();
172 break;
173 case PROXY_TYPE:
174 Proxy::cast(this)->ProxyPrint();
175 break;
176 case SHARED_FUNCTION_INFO_TYPE:
177 SharedFunctionInfo::cast(this)->SharedFunctionInfoPrint();
178 break;
179 case JS_GLOBAL_PROPERTY_CELL_TYPE:
180 JSGlobalPropertyCell::cast(this)->JSGlobalPropertyCellPrint();
181 break;
182#define MAKE_STRUCT_CASE(NAME, Name, name) \
183 case NAME##_TYPE: \
184 Name::cast(this)->Name##Print(); \
185 break;
186 STRUCT_LIST(MAKE_STRUCT_CASE)
187#undef MAKE_STRUCT_CASE
188
189 default:
190 PrintF("UNKNOWN TYPE %d", map()->instance_type());
191 UNREACHABLE();
192 break;
193 }
194}
195
196
197void HeapObject::HeapObjectVerify() {
198 InstanceType instance_type = map()->instance_type();
199
200 if (instance_type < FIRST_NONSTRING_TYPE) {
201 String::cast(this)->StringVerify();
202 return;
203 }
204
205 switch (instance_type) {
206 case MAP_TYPE:
207 Map::cast(this)->MapVerify();
208 break;
209 case HEAP_NUMBER_TYPE:
210 HeapNumber::cast(this)->HeapNumberVerify();
211 break;
212 case FIXED_ARRAY_TYPE:
213 FixedArray::cast(this)->FixedArrayVerify();
214 break;
215 case BYTE_ARRAY_TYPE:
216 ByteArray::cast(this)->ByteArrayVerify();
217 break;
218 case PIXEL_ARRAY_TYPE:
219 PixelArray::cast(this)->PixelArrayVerify();
220 break;
Steve Block3ce2e202009-11-05 08:53:23 +0000221 case EXTERNAL_BYTE_ARRAY_TYPE:
222 ExternalByteArray::cast(this)->ExternalByteArrayVerify();
223 break;
224 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
225 ExternalUnsignedByteArray::cast(this)->ExternalUnsignedByteArrayVerify();
226 break;
227 case EXTERNAL_SHORT_ARRAY_TYPE:
228 ExternalShortArray::cast(this)->ExternalShortArrayVerify();
229 break;
230 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
231 ExternalUnsignedShortArray::cast(this)->
232 ExternalUnsignedShortArrayVerify();
233 break;
234 case EXTERNAL_INT_ARRAY_TYPE:
235 ExternalIntArray::cast(this)->ExternalIntArrayVerify();
236 break;
237 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
238 ExternalUnsignedIntArray::cast(this)->ExternalUnsignedIntArrayVerify();
239 break;
240 case EXTERNAL_FLOAT_ARRAY_TYPE:
241 ExternalFloatArray::cast(this)->ExternalFloatArrayVerify();
242 break;
Steve Blocka7e24c12009-10-30 11:49:00 +0000243 case CODE_TYPE:
244 Code::cast(this)->CodeVerify();
245 break;
246 case ODDBALL_TYPE:
247 Oddball::cast(this)->OddballVerify();
248 break;
249 case JS_OBJECT_TYPE:
250 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
251 JSObject::cast(this)->JSObjectVerify();
252 break;
253 case JS_VALUE_TYPE:
254 JSValue::cast(this)->JSValueVerify();
255 break;
256 case JS_FUNCTION_TYPE:
257 JSFunction::cast(this)->JSFunctionVerify();
258 break;
259 case JS_GLOBAL_PROXY_TYPE:
260 JSGlobalProxy::cast(this)->JSGlobalProxyVerify();
261 break;
262 case JS_GLOBAL_OBJECT_TYPE:
263 JSGlobalObject::cast(this)->JSGlobalObjectVerify();
264 break;
265 case JS_BUILTINS_OBJECT_TYPE:
266 JSBuiltinsObject::cast(this)->JSBuiltinsObjectVerify();
267 break;
268 case JS_GLOBAL_PROPERTY_CELL_TYPE:
269 JSGlobalPropertyCell::cast(this)->JSGlobalPropertyCellVerify();
270 break;
271 case JS_ARRAY_TYPE:
272 JSArray::cast(this)->JSArrayVerify();
273 break;
274 case JS_REGEXP_TYPE:
275 JSRegExp::cast(this)->JSRegExpVerify();
276 break;
277 case FILLER_TYPE:
278 break;
279 case PROXY_TYPE:
280 Proxy::cast(this)->ProxyVerify();
281 break;
282 case SHARED_FUNCTION_INFO_TYPE:
283 SharedFunctionInfo::cast(this)->SharedFunctionInfoVerify();
284 break;
285
286#define MAKE_STRUCT_CASE(NAME, Name, name) \
287 case NAME##_TYPE: \
288 Name::cast(this)->Name##Verify(); \
289 break;
290 STRUCT_LIST(MAKE_STRUCT_CASE)
291#undef MAKE_STRUCT_CASE
292
293 default:
294 UNREACHABLE();
295 break;
296 }
297}
298
299
300void HeapObject::VerifyHeapPointer(Object* p) {
301 ASSERT(p->IsHeapObject());
302 ASSERT(Heap::Contains(HeapObject::cast(p)));
303}
304
305
306void HeapNumber::HeapNumberVerify() {
307 ASSERT(IsHeapNumber());
308}
309
310
311void ByteArray::ByteArrayPrint() {
312 PrintF("byte array, data starts at %p", GetDataStartAddress());
313}
314
315
316void PixelArray::PixelArrayPrint() {
317 PrintF("pixel array");
318}
319
320
Steve Block3ce2e202009-11-05 08:53:23 +0000321void ExternalByteArray::ExternalByteArrayPrint() {
322 PrintF("external byte array");
323}
324
325
326void ExternalUnsignedByteArray::ExternalUnsignedByteArrayPrint() {
327 PrintF("external unsigned byte array");
328}
329
330
331void ExternalShortArray::ExternalShortArrayPrint() {
332 PrintF("external short array");
333}
334
335
336void ExternalUnsignedShortArray::ExternalUnsignedShortArrayPrint() {
337 PrintF("external unsigned short array");
338}
339
340
341void ExternalIntArray::ExternalIntArrayPrint() {
342 PrintF("external int array");
343}
344
345
346void ExternalUnsignedIntArray::ExternalUnsignedIntArrayPrint() {
347 PrintF("external unsigned int array");
348}
349
350
351void ExternalFloatArray::ExternalFloatArrayPrint() {
352 PrintF("external float array");
353}
354
355
Steve Blocka7e24c12009-10-30 11:49:00 +0000356void ByteArray::ByteArrayVerify() {
357 ASSERT(IsByteArray());
358}
359
360
361void PixelArray::PixelArrayVerify() {
362 ASSERT(IsPixelArray());
363}
364
365
Steve Block3ce2e202009-11-05 08:53:23 +0000366void ExternalByteArray::ExternalByteArrayVerify() {
367 ASSERT(IsExternalByteArray());
368}
369
370
371void ExternalUnsignedByteArray::ExternalUnsignedByteArrayVerify() {
372 ASSERT(IsExternalUnsignedByteArray());
373}
374
375
376void ExternalShortArray::ExternalShortArrayVerify() {
377 ASSERT(IsExternalShortArray());
378}
379
380
381void ExternalUnsignedShortArray::ExternalUnsignedShortArrayVerify() {
382 ASSERT(IsExternalUnsignedShortArray());
383}
384
385
386void ExternalIntArray::ExternalIntArrayVerify() {
387 ASSERT(IsExternalIntArray());
388}
389
390
391void ExternalUnsignedIntArray::ExternalUnsignedIntArrayVerify() {
392 ASSERT(IsExternalUnsignedIntArray());
393}
394
395
396void ExternalFloatArray::ExternalFloatArrayVerify() {
397 ASSERT(IsExternalFloatArray());
398}
399
400
Steve Blocka7e24c12009-10-30 11:49:00 +0000401void JSObject::PrintProperties() {
402 if (HasFastProperties()) {
403 DescriptorArray* descs = map()->instance_descriptors();
404 for (int i = 0; i < descs->number_of_descriptors(); i++) {
405 PrintF(" ");
406 descs->GetKey(i)->StringPrint();
407 PrintF(": ");
408 switch (descs->GetType(i)) {
409 case FIELD: {
410 int index = descs->GetFieldIndex(i);
411 FastPropertyAt(index)->ShortPrint();
412 PrintF(" (field at offset %d)\n", index);
413 break;
414 }
415 case CONSTANT_FUNCTION:
416 descs->GetConstantFunction(i)->ShortPrint();
417 PrintF(" (constant function)\n");
418 break;
419 case CALLBACKS:
420 descs->GetCallbacksObject(i)->ShortPrint();
421 PrintF(" (callback)\n");
422 break;
423 case MAP_TRANSITION:
424 PrintF(" (map transition)\n");
425 break;
426 case CONSTANT_TRANSITION:
427 PrintF(" (constant transition)\n");
428 break;
429 case NULL_DESCRIPTOR:
430 PrintF(" (null descriptor)\n");
431 break;
432 default:
433 UNREACHABLE();
434 break;
435 }
436 }
437 } else {
438 property_dictionary()->Print();
439 }
440}
441
442
443void JSObject::PrintElements() {
444 switch (GetElementsKind()) {
445 case FAST_ELEMENTS: {
446 // Print in array notation for non-sparse arrays.
447 FixedArray* p = FixedArray::cast(elements());
448 for (int i = 0; i < p->length(); i++) {
449 PrintF(" %d: ", i);
450 p->get(i)->ShortPrint();
451 PrintF("\n");
452 }
453 break;
454 }
455 case PIXEL_ELEMENTS: {
456 PixelArray* p = PixelArray::cast(elements());
457 for (int i = 0; i < p->length(); i++) {
458 PrintF(" %d: %d\n", i, p->get(i));
459 }
460 break;
461 }
Steve Block3ce2e202009-11-05 08:53:23 +0000462 case EXTERNAL_BYTE_ELEMENTS: {
463 ExternalByteArray* p = ExternalByteArray::cast(elements());
464 for (int i = 0; i < p->length(); i++) {
465 PrintF(" %d: %d\n", i, static_cast<int>(p->get(i)));
466 }
467 break;
468 }
469 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: {
470 ExternalUnsignedByteArray* p =
471 ExternalUnsignedByteArray::cast(elements());
472 for (int i = 0; i < p->length(); i++) {
473 PrintF(" %d: %d\n", i, static_cast<int>(p->get(i)));
474 }
475 break;
476 }
477 case EXTERNAL_SHORT_ELEMENTS: {
478 ExternalShortArray* p = ExternalShortArray::cast(elements());
479 for (int i = 0; i < p->length(); i++) {
480 PrintF(" %d: %d\n", i, static_cast<int>(p->get(i)));
481 }
482 break;
483 }
484 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: {
485 ExternalUnsignedShortArray* p =
486 ExternalUnsignedShortArray::cast(elements());
487 for (int i = 0; i < p->length(); i++) {
488 PrintF(" %d: %d\n", i, static_cast<int>(p->get(i)));
489 }
490 break;
491 }
492 case EXTERNAL_INT_ELEMENTS: {
493 ExternalIntArray* p = ExternalIntArray::cast(elements());
494 for (int i = 0; i < p->length(); i++) {
495 PrintF(" %d: %d\n", i, static_cast<int>(p->get(i)));
496 }
497 break;
498 }
499 case EXTERNAL_UNSIGNED_INT_ELEMENTS: {
500 ExternalUnsignedIntArray* p =
501 ExternalUnsignedIntArray::cast(elements());
502 for (int i = 0; i < p->length(); i++) {
503 PrintF(" %d: %d\n", i, static_cast<int>(p->get(i)));
504 }
505 break;
506 }
507 case EXTERNAL_FLOAT_ELEMENTS: {
508 ExternalFloatArray* p = ExternalFloatArray::cast(elements());
509 for (int i = 0; i < p->length(); i++) {
510 PrintF(" %d: %f\n", i, p->get(i));
511 }
512 break;
513 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000514 case DICTIONARY_ELEMENTS:
515 elements()->Print();
516 break;
517 default:
518 UNREACHABLE();
519 break;
520 }
521}
522
523
524void JSObject::JSObjectPrint() {
525 PrintF("%p: [JSObject]\n", this);
526 PrintF(" - map = %p\n", map());
527 PrintF(" - prototype = %p\n", GetPrototype());
528 PrintF(" {\n");
529 PrintProperties();
530 PrintElements();
531 PrintF(" }\n");
532}
533
534
535void JSObject::JSObjectVerify() {
536 VerifyHeapPointer(properties());
537 VerifyHeapPointer(elements());
538 if (HasFastProperties()) {
539 CHECK_EQ(map()->unused_property_fields(),
540 (map()->inobject_properties() + properties()->length() -
541 map()->NextFreePropertyIndex()));
542 }
Steve Block8defd9f2010-07-08 12:39:36 +0100543 ASSERT(map()->has_fast_elements() ==
Iain Merrick75681382010-08-19 15:07:18 +0100544 (elements()->map() == Heap::fixed_array_map() ||
545 elements()->map() == Heap::fixed_cow_array_map()));
Steve Block8defd9f2010-07-08 12:39:36 +0100546 ASSERT(map()->has_fast_elements() == HasFastElements());
Steve Blocka7e24c12009-10-30 11:49:00 +0000547}
548
549
550static const char* TypeToString(InstanceType type) {
551 switch (type) {
552 case INVALID_TYPE: return "INVALID";
553 case MAP_TYPE: return "MAP";
554 case HEAP_NUMBER_TYPE: return "HEAP_NUMBER";
Steve Blockd0582a62009-12-15 09:54:21 +0000555 case SYMBOL_TYPE: return "SYMBOL";
556 case ASCII_SYMBOL_TYPE: return "ASCII_SYMBOL";
557 case CONS_SYMBOL_TYPE: return "CONS_SYMBOL";
558 case CONS_ASCII_SYMBOL_TYPE: return "CONS_ASCII_SYMBOL";
559 case EXTERNAL_ASCII_SYMBOL_TYPE:
Kristian Monsen9dcf7e22010-06-28 14:14:28 +0100560 case EXTERNAL_SYMBOL_WITH_ASCII_DATA_TYPE:
Steve Blockd0582a62009-12-15 09:54:21 +0000561 case EXTERNAL_SYMBOL_TYPE: return "EXTERNAL_SYMBOL";
562 case ASCII_STRING_TYPE: return "ASCII_STRING";
563 case STRING_TYPE: return "TWO_BYTE_STRING";
564 case CONS_STRING_TYPE:
565 case CONS_ASCII_STRING_TYPE: return "CONS_STRING";
566 case EXTERNAL_ASCII_STRING_TYPE:
Kristian Monsen9dcf7e22010-06-28 14:14:28 +0100567 case EXTERNAL_STRING_WITH_ASCII_DATA_TYPE:
Steve Blockd0582a62009-12-15 09:54:21 +0000568 case EXTERNAL_STRING_TYPE: return "EXTERNAL_STRING";
Steve Blocka7e24c12009-10-30 11:49:00 +0000569 case FIXED_ARRAY_TYPE: return "FIXED_ARRAY";
570 case BYTE_ARRAY_TYPE: return "BYTE_ARRAY";
571 case PIXEL_ARRAY_TYPE: return "PIXEL_ARRAY";
Steve Block3ce2e202009-11-05 08:53:23 +0000572 case EXTERNAL_BYTE_ARRAY_TYPE: return "EXTERNAL_BYTE_ARRAY";
573 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
574 return "EXTERNAL_UNSIGNED_BYTE_ARRAY";
575 case EXTERNAL_SHORT_ARRAY_TYPE: return "EXTERNAL_SHORT_ARRAY";
576 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
577 return "EXTERNAL_UNSIGNED_SHORT_ARRAY";
578 case EXTERNAL_INT_ARRAY_TYPE: return "EXTERNAL_INT_ARRAY";
579 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
580 return "EXTERNAL_UNSIGNED_INT_ARRAY";
581 case EXTERNAL_FLOAT_ARRAY_TYPE: return "EXTERNAL_FLOAT_ARRAY";
Steve Blocka7e24c12009-10-30 11:49:00 +0000582 case FILLER_TYPE: return "FILLER";
583 case JS_OBJECT_TYPE: return "JS_OBJECT";
584 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: return "JS_CONTEXT_EXTENSION_OBJECT";
585 case ODDBALL_TYPE: return "ODDBALL";
586 case JS_GLOBAL_PROPERTY_CELL_TYPE: return "JS_GLOBAL_PROPERTY_CELL";
587 case SHARED_FUNCTION_INFO_TYPE: return "SHARED_FUNCTION_INFO";
588 case JS_FUNCTION_TYPE: return "JS_FUNCTION";
589 case CODE_TYPE: return "CODE";
590 case JS_ARRAY_TYPE: return "JS_ARRAY";
591 case JS_REGEXP_TYPE: return "JS_REGEXP";
592 case JS_VALUE_TYPE: return "JS_VALUE";
593 case JS_GLOBAL_OBJECT_TYPE: return "JS_GLOBAL_OBJECT";
594 case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT";
595 case JS_GLOBAL_PROXY_TYPE: return "JS_GLOBAL_PROXY";
596 case PROXY_TYPE: return "PROXY";
Steve Blocka7e24c12009-10-30 11:49:00 +0000597#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME;
598 STRUCT_LIST(MAKE_STRUCT_CASE)
599#undef MAKE_STRUCT_CASE
600 }
601 return "UNKNOWN";
602}
603
604
605void Map::MapPrint() {
606 HeapObject::PrintHeader("Map");
607 PrintF(" - type: %s\n", TypeToString(instance_type()));
608 PrintF(" - instance size: %d\n", instance_size());
609 PrintF(" - inobject properties: %d\n", inobject_properties());
610 PrintF(" - pre-allocated property fields: %d\n",
611 pre_allocated_property_fields());
612 PrintF(" - unused property fields: %d\n", unused_property_fields());
613 if (is_hidden_prototype()) {
614 PrintF(" - hidden_prototype\n");
615 }
616 if (has_named_interceptor()) {
617 PrintF(" - named_interceptor\n");
618 }
619 if (has_indexed_interceptor()) {
620 PrintF(" - indexed_interceptor\n");
621 }
622 if (is_undetectable()) {
623 PrintF(" - undetectable\n");
624 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000625 if (has_instance_call_handler()) {
626 PrintF(" - instance_call_handler\n");
627 }
628 if (is_access_check_needed()) {
629 PrintF(" - access_check_needed\n");
630 }
631 PrintF(" - instance descriptors: ");
632 instance_descriptors()->ShortPrint();
633 PrintF("\n - prototype: ");
634 prototype()->ShortPrint();
635 PrintF("\n - constructor: ");
636 constructor()->ShortPrint();
637 PrintF("\n");
638}
639
640
641void Map::MapVerify() {
642 ASSERT(!Heap::InNewSpace(this));
643 ASSERT(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE);
Steve Block791712a2010-08-27 10:21:07 +0100644 ASSERT(instance_size() == kVariableSizeSentinel ||
645 (kPointerSize <= instance_size() &&
646 instance_size() < Heap::Capacity()));
Steve Blocka7e24c12009-10-30 11:49:00 +0000647 VerifyHeapPointer(prototype());
648 VerifyHeapPointer(instance_descriptors());
649}
650
651
Kristian Monsen0d5e1162010-09-30 15:31:59 +0100652void Map::SharedMapVerify() {
Kristian Monsen80d68ea2010-09-08 11:05:35 +0100653 MapVerify();
Kristian Monsen0d5e1162010-09-30 15:31:59 +0100654 ASSERT(is_shared());
Kristian Monsen80d68ea2010-09-08 11:05:35 +0100655 ASSERT_EQ(Heap::empty_descriptor_array(), instance_descriptors());
656 ASSERT_EQ(Heap::empty_fixed_array(), code_cache());
657 ASSERT_EQ(0, pre_allocated_property_fields());
658 ASSERT_EQ(0, unused_property_fields());
659 ASSERT_EQ(StaticVisitorBase::GetVisitorId(instance_type(), instance_size()),
660 visitor_id());
661}
662
663
Steve Block6ded16b2010-05-10 14:33:55 +0100664void CodeCache::CodeCachePrint() {
665 HeapObject::PrintHeader("CodeCache");
666 PrintF("\n - default_cache: ");
667 default_cache()->ShortPrint();
668 PrintF("\n - normal_type_cache: ");
669 normal_type_cache()->ShortPrint();
670}
671
672
673void CodeCache::CodeCacheVerify() {
674 VerifyHeapPointer(default_cache());
675 VerifyHeapPointer(normal_type_cache());
676 ASSERT(default_cache()->IsFixedArray());
677 ASSERT(normal_type_cache()->IsUndefined()
678 || normal_type_cache()->IsCodeCacheHashTable());
679}
680
681
Steve Blocka7e24c12009-10-30 11:49:00 +0000682void FixedArray::FixedArrayPrint() {
683 HeapObject::PrintHeader("FixedArray");
684 PrintF(" - length: %d", length());
685 for (int i = 0; i < length(); i++) {
686 PrintF("\n [%d]: ", i);
687 get(i)->ShortPrint();
688 }
689 PrintF("\n");
690}
691
692
693void FixedArray::FixedArrayVerify() {
694 for (int i = 0; i < length(); i++) {
695 Object* e = get(i);
696 if (e->IsHeapObject()) {
697 VerifyHeapPointer(e);
698 } else {
699 e->Verify();
700 }
701 }
702}
703
704
705void JSValue::JSValuePrint() {
706 HeapObject::PrintHeader("ValueObject");
707 value()->Print();
708}
709
710
711void JSValue::JSValueVerify() {
712 Object* v = value();
713 if (v->IsHeapObject()) {
714 VerifyHeapPointer(v);
715 }
716}
717
718
719void String::StringPrint() {
720 if (StringShape(this).IsSymbol()) {
721 PrintF("#");
722 } else if (StringShape(this).IsCons()) {
723 PrintF("c\"");
724 } else {
725 PrintF("\"");
726 }
727
728 for (int i = 0; i < length(); i++) {
729 PrintF("%c", Get(i));
730 }
731
732 if (!StringShape(this).IsSymbol()) PrintF("\"");
733}
734
735
736void String::StringVerify() {
737 CHECK(IsString());
738 CHECK(length() >= 0 && length() <= Smi::kMaxValue);
739 if (IsSymbol()) {
740 CHECK(!Heap::InNewSpace(this));
741 }
742}
743
744
745void JSFunction::JSFunctionPrint() {
746 HeapObject::PrintHeader("Function");
747 PrintF(" - map = 0x%p\n", map());
Steve Blocka7e24c12009-10-30 11:49:00 +0000748 PrintF(" - initial_map = ");
749 if (has_initial_map()) {
750 initial_map()->ShortPrint();
751 }
752 PrintF("\n - shared_info = ");
753 shared()->ShortPrint();
754 PrintF("\n - name = ");
755 shared()->name()->Print();
756 PrintF("\n - context = ");
757 unchecked_context()->ShortPrint();
758 PrintF("\n - code = ");
759 code()->ShortPrint();
760 PrintF("\n");
761
762 PrintProperties();
763 PrintElements();
764
765 PrintF("\n");
766}
767
768
769void JSFunction::JSFunctionVerify() {
770 CHECK(IsJSFunction());
771 VerifyObjectField(kPrototypeOrInitialMapOffset);
772}
773
774
775void SharedFunctionInfo::SharedFunctionInfoPrint() {
776 HeapObject::PrintHeader("SharedFunctionInfo");
777 PrintF(" - name: ");
778 name()->ShortPrint();
779 PrintF("\n - expected_nof_properties: %d", expected_nof_properties());
780 PrintF("\n - instance class name = ");
781 instance_class_name()->Print();
782 PrintF("\n - code = ");
783 code()->ShortPrint();
784 PrintF("\n - source code = ");
785 GetSourceCode()->ShortPrint();
786 // Script files are often large, hard to read.
787 // PrintF("\n - script =");
788 // script()->Print();
789 PrintF("\n - function token position = %d", function_token_position());
790 PrintF("\n - start position = %d", start_position());
791 PrintF("\n - end position = %d", end_position());
792 PrintF("\n - is expression = %d", is_expression());
793 PrintF("\n - debug info = ");
794 debug_info()->ShortPrint();
795 PrintF("\n - length = %d", length());
Steve Blocka7e24c12009-10-30 11:49:00 +0000796 PrintF("\n - has_only_simple_this_property_assignments = %d",
797 has_only_simple_this_property_assignments());
798 PrintF("\n - this_property_assignments = ");
799 this_property_assignments()->ShortPrint();
800 PrintF("\n");
801}
802
803void SharedFunctionInfo::SharedFunctionInfoVerify() {
804 CHECK(IsSharedFunctionInfo());
805 VerifyObjectField(kNameOffset);
806 VerifyObjectField(kCodeOffset);
Ben Murdoch3bec4d22010-07-22 14:51:16 +0100807 VerifyObjectField(kScopeInfoOffset);
Steve Blocka7e24c12009-10-30 11:49:00 +0000808 VerifyObjectField(kInstanceClassNameOffset);
Steve Block6ded16b2010-05-10 14:33:55 +0100809 VerifyObjectField(kFunctionDataOffset);
Steve Blocka7e24c12009-10-30 11:49:00 +0000810 VerifyObjectField(kScriptOffset);
811 VerifyObjectField(kDebugInfoOffset);
812}
813
814
815void JSGlobalProxy::JSGlobalProxyPrint() {
816 PrintF("global_proxy");
817 JSObjectPrint();
818 PrintF("context : ");
819 context()->ShortPrint();
820 PrintF("\n");
821}
822
823
824void JSGlobalProxy::JSGlobalProxyVerify() {
825 CHECK(IsJSGlobalProxy());
826 JSObjectVerify();
827 VerifyObjectField(JSGlobalProxy::kContextOffset);
828 // Make sure that this object has no properties, elements.
829 CHECK_EQ(0, properties()->length());
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100830 CHECK(HasFastElements());
831 CHECK_EQ(0, FixedArray::cast(elements())->length());
Steve Blocka7e24c12009-10-30 11:49:00 +0000832}
833
834
835void JSGlobalObject::JSGlobalObjectPrint() {
836 PrintF("global ");
837 JSObjectPrint();
838 PrintF("global context : ");
839 global_context()->ShortPrint();
840 PrintF("\n");
841}
842
843
844void JSGlobalObject::JSGlobalObjectVerify() {
845 CHECK(IsJSGlobalObject());
846 JSObjectVerify();
847 for (int i = GlobalObject::kBuiltinsOffset;
848 i < JSGlobalObject::kSize;
849 i += kPointerSize) {
850 VerifyObjectField(i);
851 }
852}
853
854
855void JSBuiltinsObject::JSBuiltinsObjectPrint() {
856 PrintF("builtins ");
857 JSObjectPrint();
858}
859
860
861void JSBuiltinsObject::JSBuiltinsObjectVerify() {
862 CHECK(IsJSBuiltinsObject());
863 JSObjectVerify();
864 for (int i = GlobalObject::kBuiltinsOffset;
865 i < JSBuiltinsObject::kSize;
866 i += kPointerSize) {
867 VerifyObjectField(i);
868 }
869}
870
871
872void Oddball::OddballVerify() {
873 CHECK(IsOddball());
874 VerifyHeapPointer(to_string());
875 Object* number = to_number();
876 if (number->IsHeapObject()) {
877 ASSERT(number == Heap::nan_value());
878 } else {
879 ASSERT(number->IsSmi());
880 int value = Smi::cast(number)->value();
881 ASSERT(value == 0 || value == 1 || value == -1 ||
882 value == -2 || value == -3);
883 }
884}
885
886
887void JSGlobalPropertyCell::JSGlobalPropertyCellVerify() {
888 CHECK(IsJSGlobalPropertyCell());
889 VerifyObjectField(kValueOffset);
890}
891
892
893void JSGlobalPropertyCell::JSGlobalPropertyCellPrint() {
894 HeapObject::PrintHeader("JSGlobalPropertyCell");
895}
896
897
898void Code::CodePrint() {
899 HeapObject::PrintHeader("Code");
900#ifdef ENABLE_DISASSEMBLER
901 Disassemble(NULL);
902#endif
903}
904
905
906void Code::CodeVerify() {
907 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()),
Kristian Monsen0d5e1162010-09-30 15:31:59 +0100908 kCodeAlignment));
Steve Blocka7e24c12009-10-30 11:49:00 +0000909 Address last_gc_pc = NULL;
910 for (RelocIterator it(this); !it.done(); it.next()) {
911 it.rinfo()->Verify();
912 // Ensure that GC will not iterate twice over the same pointer.
913 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) {
914 CHECK(it.rinfo()->pc() != last_gc_pc);
915 last_gc_pc = it.rinfo()->pc();
916 }
917 }
918}
919
920
921void JSArray::JSArrayVerify() {
922 JSObjectVerify();
923 ASSERT(length()->IsNumber() || length()->IsUndefined());
924 ASSERT(elements()->IsUndefined() || elements()->IsFixedArray());
925}
926
927
928void JSRegExp::JSRegExpVerify() {
929 JSObjectVerify();
930 ASSERT(data()->IsUndefined() || data()->IsFixedArray());
931 switch (TypeTag()) {
932 case JSRegExp::ATOM: {
933 FixedArray* arr = FixedArray::cast(data());
934 ASSERT(arr->get(JSRegExp::kAtomPatternIndex)->IsString());
935 break;
936 }
937 case JSRegExp::IRREGEXP: {
938 bool is_native = RegExpImpl::UsesNativeRegExp();
939
940 FixedArray* arr = FixedArray::cast(data());
941 Object* ascii_data = arr->get(JSRegExp::kIrregexpASCIICodeIndex);
942 // TheHole : Not compiled yet.
943 // JSObject: Compilation error.
944 // Code/ByteArray: Compiled code.
945 ASSERT(ascii_data->IsTheHole() || ascii_data->IsJSObject() ||
946 (is_native ? ascii_data->IsCode() : ascii_data->IsByteArray()));
947 Object* uc16_data = arr->get(JSRegExp::kIrregexpUC16CodeIndex);
948 ASSERT(uc16_data->IsTheHole() || ascii_data->IsJSObject() ||
949 (is_native ? uc16_data->IsCode() : uc16_data->IsByteArray()));
950 ASSERT(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi());
951 ASSERT(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi());
952 break;
953 }
954 default:
955 ASSERT_EQ(JSRegExp::NOT_COMPILED, TypeTag());
956 ASSERT(data()->IsUndefined());
957 break;
958 }
959}
960
961
962void Proxy::ProxyPrint() {
963 PrintF("proxy to %p", proxy());
964}
965
966
967void Proxy::ProxyVerify() {
968 ASSERT(IsProxy());
969}
970
971
972void AccessorInfo::AccessorInfoVerify() {
973 CHECK(IsAccessorInfo());
974 VerifyPointer(getter());
975 VerifyPointer(setter());
976 VerifyPointer(name());
977 VerifyPointer(data());
978 VerifyPointer(flag());
Steve Blockd0582a62009-12-15 09:54:21 +0000979 VerifyPointer(load_stub_cache());
Steve Blocka7e24c12009-10-30 11:49:00 +0000980}
981
982void AccessorInfo::AccessorInfoPrint() {
983 HeapObject::PrintHeader("AccessorInfo");
984 PrintF("\n - getter: ");
985 getter()->ShortPrint();
986 PrintF("\n - setter: ");
987 setter()->ShortPrint();
988 PrintF("\n - name: ");
989 name()->ShortPrint();
990 PrintF("\n - data: ");
991 data()->ShortPrint();
992 PrintF("\n - flag: ");
993 flag()->ShortPrint();
994}
995
996void AccessCheckInfo::AccessCheckInfoVerify() {
997 CHECK(IsAccessCheckInfo());
998 VerifyPointer(named_callback());
999 VerifyPointer(indexed_callback());
1000 VerifyPointer(data());
1001}
1002
1003void AccessCheckInfo::AccessCheckInfoPrint() {
1004 HeapObject::PrintHeader("AccessCheckInfo");
1005 PrintF("\n - named_callback: ");
1006 named_callback()->ShortPrint();
1007 PrintF("\n - indexed_callback: ");
1008 indexed_callback()->ShortPrint();
1009 PrintF("\n - data: ");
1010 data()->ShortPrint();
1011}
1012
1013void InterceptorInfo::InterceptorInfoVerify() {
1014 CHECK(IsInterceptorInfo());
1015 VerifyPointer(getter());
1016 VerifyPointer(setter());
1017 VerifyPointer(query());
1018 VerifyPointer(deleter());
1019 VerifyPointer(enumerator());
1020 VerifyPointer(data());
1021}
1022
1023void InterceptorInfo::InterceptorInfoPrint() {
1024 HeapObject::PrintHeader("InterceptorInfo");
1025 PrintF("\n - getter: ");
1026 getter()->ShortPrint();
1027 PrintF("\n - setter: ");
1028 setter()->ShortPrint();
1029 PrintF("\n - query: ");
1030 query()->ShortPrint();
1031 PrintF("\n - deleter: ");
1032 deleter()->ShortPrint();
1033 PrintF("\n - enumerator: ");
1034 enumerator()->ShortPrint();
1035 PrintF("\n - data: ");
1036 data()->ShortPrint();
1037}
1038
1039void CallHandlerInfo::CallHandlerInfoVerify() {
1040 CHECK(IsCallHandlerInfo());
1041 VerifyPointer(callback());
1042 VerifyPointer(data());
1043}
1044
1045void CallHandlerInfo::CallHandlerInfoPrint() {
1046 HeapObject::PrintHeader("CallHandlerInfo");
1047 PrintF("\n - callback: ");
1048 callback()->ShortPrint();
1049 PrintF("\n - data: ");
1050 data()->ShortPrint();
1051}
1052
1053void TemplateInfo::TemplateInfoVerify() {
1054 VerifyPointer(tag());
1055 VerifyPointer(property_list());
1056}
1057
1058void FunctionTemplateInfo::FunctionTemplateInfoVerify() {
1059 CHECK(IsFunctionTemplateInfo());
1060 TemplateInfoVerify();
1061 VerifyPointer(serial_number());
1062 VerifyPointer(call_code());
1063 VerifyPointer(property_accessors());
1064 VerifyPointer(prototype_template());
1065 VerifyPointer(parent_template());
1066 VerifyPointer(named_property_handler());
1067 VerifyPointer(indexed_property_handler());
1068 VerifyPointer(instance_template());
1069 VerifyPointer(signature());
1070 VerifyPointer(access_check_info());
1071}
1072
1073void FunctionTemplateInfo::FunctionTemplateInfoPrint() {
1074 HeapObject::PrintHeader("FunctionTemplateInfo");
Andrei Popescu402d9372010-02-26 13:31:12 +00001075 PrintF("\n - class name: ");
1076 class_name()->ShortPrint();
Steve Blocka7e24c12009-10-30 11:49:00 +00001077 PrintF("\n - tag: ");
1078 tag()->ShortPrint();
1079 PrintF("\n - property_list: ");
1080 property_list()->ShortPrint();
1081 PrintF("\n - serial_number: ");
1082 serial_number()->ShortPrint();
1083 PrintF("\n - call_code: ");
1084 call_code()->ShortPrint();
1085 PrintF("\n - property_accessors: ");
1086 property_accessors()->ShortPrint();
1087 PrintF("\n - prototype_template: ");
1088 prototype_template()->ShortPrint();
1089 PrintF("\n - parent_template: ");
1090 parent_template()->ShortPrint();
1091 PrintF("\n - named_property_handler: ");
1092 named_property_handler()->ShortPrint();
1093 PrintF("\n - indexed_property_handler: ");
1094 indexed_property_handler()->ShortPrint();
1095 PrintF("\n - instance_template: ");
1096 instance_template()->ShortPrint();
1097 PrintF("\n - signature: ");
1098 signature()->ShortPrint();
1099 PrintF("\n - access_check_info: ");
1100 access_check_info()->ShortPrint();
1101 PrintF("\n - hidden_prototype: %s", hidden_prototype() ? "true" : "false");
1102 PrintF("\n - undetectable: %s", undetectable() ? "true" : "false");
1103 PrintF("\n - need_access_check: %s", needs_access_check() ? "true" : "false");
1104}
1105
1106void ObjectTemplateInfo::ObjectTemplateInfoVerify() {
1107 CHECK(IsObjectTemplateInfo());
1108 TemplateInfoVerify();
1109 VerifyPointer(constructor());
1110 VerifyPointer(internal_field_count());
1111}
1112
1113void ObjectTemplateInfo::ObjectTemplateInfoPrint() {
1114 HeapObject::PrintHeader("ObjectTemplateInfo");
1115 PrintF("\n - constructor: ");
1116 constructor()->ShortPrint();
1117 PrintF("\n - internal_field_count: ");
1118 internal_field_count()->ShortPrint();
1119}
1120
1121void SignatureInfo::SignatureInfoVerify() {
1122 CHECK(IsSignatureInfo());
1123 VerifyPointer(receiver());
1124 VerifyPointer(args());
1125}
1126
1127void SignatureInfo::SignatureInfoPrint() {
1128 HeapObject::PrintHeader("SignatureInfo");
1129 PrintF("\n - receiver: ");
1130 receiver()->ShortPrint();
1131 PrintF("\n - args: ");
1132 args()->ShortPrint();
1133}
1134
1135void TypeSwitchInfo::TypeSwitchInfoVerify() {
1136 CHECK(IsTypeSwitchInfo());
1137 VerifyPointer(types());
1138}
1139
1140void TypeSwitchInfo::TypeSwitchInfoPrint() {
1141 HeapObject::PrintHeader("TypeSwitchInfo");
1142 PrintF("\n - types: ");
1143 types()->ShortPrint();
1144}
1145
1146
1147void Script::ScriptVerify() {
1148 CHECK(IsScript());
1149 VerifyPointer(source());
1150 VerifyPointer(name());
1151 line_offset()->SmiVerify();
1152 column_offset()->SmiVerify();
1153 VerifyPointer(data());
1154 VerifyPointer(wrapper());
1155 type()->SmiVerify();
1156 VerifyPointer(line_ends());
1157 VerifyPointer(id());
1158}
1159
1160
1161void Script::ScriptPrint() {
1162 HeapObject::PrintHeader("Script");
1163 PrintF("\n - source: ");
1164 source()->ShortPrint();
1165 PrintF("\n - name: ");
1166 name()->ShortPrint();
1167 PrintF("\n - line_offset: ");
1168 line_offset()->ShortPrint();
1169 PrintF("\n - column_offset: ");
1170 column_offset()->ShortPrint();
1171 PrintF("\n - type: ");
1172 type()->ShortPrint();
1173 PrintF("\n - id: ");
1174 id()->ShortPrint();
Steve Blockd0582a62009-12-15 09:54:21 +00001175 PrintF("\n - data: ");
1176 data()->ShortPrint();
1177 PrintF("\n - context data: ");
1178 context_data()->ShortPrint();
1179 PrintF("\n - wrapper: ");
1180 wrapper()->ShortPrint();
1181 PrintF("\n - compilation type: ");
1182 compilation_type()->ShortPrint();
1183 PrintF("\n - line ends: ");
1184 line_ends()->ShortPrint();
1185 PrintF("\n - eval from shared: ");
1186 eval_from_shared()->ShortPrint();
1187 PrintF("\n - eval from instructions offset: ");
1188 eval_from_instructions_offset()->ShortPrint();
Steve Blocka7e24c12009-10-30 11:49:00 +00001189 PrintF("\n");
1190}
1191
1192
1193#ifdef ENABLE_DEBUGGER_SUPPORT
1194void DebugInfo::DebugInfoVerify() {
1195 CHECK(IsDebugInfo());
1196 VerifyPointer(shared());
1197 VerifyPointer(original_code());
1198 VerifyPointer(code());
1199 VerifyPointer(break_points());
1200}
1201
1202
1203void DebugInfo::DebugInfoPrint() {
1204 HeapObject::PrintHeader("DebugInfo");
1205 PrintF("\n - shared: ");
1206 shared()->ShortPrint();
1207 PrintF("\n - original_code: ");
1208 original_code()->ShortPrint();
1209 PrintF("\n - code: ");
1210 code()->ShortPrint();
1211 PrintF("\n - break_points: ");
1212 break_points()->Print();
1213}
1214
1215
1216void BreakPointInfo::BreakPointInfoVerify() {
1217 CHECK(IsBreakPointInfo());
1218 code_position()->SmiVerify();
1219 source_position()->SmiVerify();
1220 statement_position()->SmiVerify();
1221 VerifyPointer(break_point_objects());
1222}
1223
1224
1225void BreakPointInfo::BreakPointInfoPrint() {
1226 HeapObject::PrintHeader("BreakPointInfo");
1227 PrintF("\n - code_position: %d", code_position());
1228 PrintF("\n - source_position: %d", source_position());
1229 PrintF("\n - statement_position: %d", statement_position());
1230 PrintF("\n - break_point_objects: ");
1231 break_point_objects()->ShortPrint();
1232}
1233#endif
1234
1235
1236void JSObject::IncrementSpillStatistics(SpillInformation* info) {
1237 info->number_of_objects_++;
1238 // Named properties
1239 if (HasFastProperties()) {
1240 info->number_of_objects_with_fast_properties_++;
1241 info->number_of_fast_used_fields_ += map()->NextFreePropertyIndex();
1242 info->number_of_fast_unused_fields_ += map()->unused_property_fields();
1243 } else {
1244 StringDictionary* dict = property_dictionary();
1245 info->number_of_slow_used_properties_ += dict->NumberOfElements();
1246 info->number_of_slow_unused_properties_ +=
1247 dict->Capacity() - dict->NumberOfElements();
1248 }
1249 // Indexed properties
1250 switch (GetElementsKind()) {
1251 case FAST_ELEMENTS: {
1252 info->number_of_objects_with_fast_elements_++;
1253 int holes = 0;
1254 FixedArray* e = FixedArray::cast(elements());
1255 int len = e->length();
1256 for (int i = 0; i < len; i++) {
1257 if (e->get(i) == Heap::the_hole_value()) holes++;
1258 }
1259 info->number_of_fast_used_elements_ += len - holes;
1260 info->number_of_fast_unused_elements_ += holes;
1261 break;
1262 }
1263 case PIXEL_ELEMENTS: {
1264 info->number_of_objects_with_fast_elements_++;
1265 PixelArray* e = PixelArray::cast(elements());
1266 info->number_of_fast_used_elements_ += e->length();
1267 break;
1268 }
1269 case DICTIONARY_ELEMENTS: {
1270 NumberDictionary* dict = element_dictionary();
1271 info->number_of_slow_used_elements_ += dict->NumberOfElements();
1272 info->number_of_slow_unused_elements_ +=
1273 dict->Capacity() - dict->NumberOfElements();
1274 break;
1275 }
1276 default:
1277 UNREACHABLE();
1278 break;
1279 }
1280}
1281
1282
1283void JSObject::SpillInformation::Clear() {
1284 number_of_objects_ = 0;
1285 number_of_objects_with_fast_properties_ = 0;
1286 number_of_objects_with_fast_elements_ = 0;
1287 number_of_fast_used_fields_ = 0;
1288 number_of_fast_unused_fields_ = 0;
1289 number_of_slow_used_properties_ = 0;
1290 number_of_slow_unused_properties_ = 0;
1291 number_of_fast_used_elements_ = 0;
1292 number_of_fast_unused_elements_ = 0;
1293 number_of_slow_used_elements_ = 0;
1294 number_of_slow_unused_elements_ = 0;
1295}
1296
1297void JSObject::SpillInformation::Print() {
1298 PrintF("\n JSObject Spill Statistics (#%d):\n", number_of_objects_);
1299
1300 PrintF(" - fast properties (#%d): %d (used) %d (unused)\n",
1301 number_of_objects_with_fast_properties_,
1302 number_of_fast_used_fields_, number_of_fast_unused_fields_);
1303
1304 PrintF(" - slow properties (#%d): %d (used) %d (unused)\n",
1305 number_of_objects_ - number_of_objects_with_fast_properties_,
1306 number_of_slow_used_properties_, number_of_slow_unused_properties_);
1307
1308 PrintF(" - fast elements (#%d): %d (used) %d (unused)\n",
1309 number_of_objects_with_fast_elements_,
1310 number_of_fast_used_elements_, number_of_fast_unused_elements_);
1311
1312 PrintF(" - slow elements (#%d): %d (used) %d (unused)\n",
1313 number_of_objects_ - number_of_objects_with_fast_elements_,
1314 number_of_slow_used_elements_, number_of_slow_unused_elements_);
1315
1316 PrintF("\n");
1317}
1318
1319
1320void DescriptorArray::PrintDescriptors() {
1321 PrintF("Descriptor array %d\n", number_of_descriptors());
1322 for (int i = 0; i < number_of_descriptors(); i++) {
1323 PrintF(" %d: ", i);
1324 Descriptor desc;
1325 Get(i, &desc);
1326 desc.Print();
1327 }
1328 PrintF("\n");
1329}
1330
1331
1332bool DescriptorArray::IsSortedNoDuplicates() {
1333 String* current_key = NULL;
1334 uint32_t current = 0;
1335 for (int i = 0; i < number_of_descriptors(); i++) {
1336 String* key = GetKey(i);
1337 if (key == current_key) {
1338 PrintDescriptors();
1339 return false;
1340 }
1341 current_key = key;
1342 uint32_t hash = GetKey(i)->Hash();
1343 if (hash < current) {
1344 PrintDescriptors();
1345 return false;
1346 }
1347 current = hash;
1348 }
1349 return true;
1350}
1351
1352
Steve Block6ded16b2010-05-10 14:33:55 +01001353void JSFunctionResultCache::JSFunctionResultCacheVerify() {
1354 JSFunction::cast(get(kFactoryIndex))->Verify();
1355
1356 int size = Smi::cast(get(kCacheSizeIndex))->value();
1357 ASSERT(kEntriesIndex <= size);
1358 ASSERT(size <= length());
1359 ASSERT_EQ(0, size % kEntrySize);
1360
1361 int finger = Smi::cast(get(kFingerIndex))->value();
1362 ASSERT(kEntriesIndex <= finger);
1363 ASSERT(finger < size || finger == kEntriesIndex);
1364 ASSERT_EQ(0, finger % kEntrySize);
1365
1366 if (FLAG_enable_slow_asserts) {
1367 for (int i = kEntriesIndex; i < size; i++) {
1368 ASSERT(!get(i)->IsTheHole());
1369 get(i)->Verify();
1370 }
1371 for (int i = size; i < length(); i++) {
1372 ASSERT(get(i)->IsTheHole());
1373 get(i)->Verify();
1374 }
1375 }
1376}
1377
1378
Kristian Monsen80d68ea2010-09-08 11:05:35 +01001379void NormalizedMapCache::NormalizedMapCacheVerify() {
1380 FixedArray::cast(this)->Verify();
1381 if (FLAG_enable_slow_asserts) {
1382 for (int i = 0; i < length(); i++) {
1383 Object* e = get(i);
1384 if (e->IsMap()) {
Kristian Monsen0d5e1162010-09-30 15:31:59 +01001385 Map::cast(e)->SharedMapVerify();
Kristian Monsen80d68ea2010-09-08 11:05:35 +01001386 } else {
1387 ASSERT(e->IsUndefined());
1388 }
1389 }
1390 }
1391}
1392
1393
Steve Blocka7e24c12009-10-30 11:49:00 +00001394#endif // DEBUG
1395
1396} } // namespace v8::internal