blob: 951575c2128c9f753c48e8ee634990607d7011cf [file] [log] [blame]
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001// Copyright 2006-2008 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28#include "v8.h"
29
30#include "disassembler.h"
31#include "disasm.h"
32#include "macro-assembler.h"
33
34namespace v8 { namespace internal {
35
36#ifdef DEBUG
37
38static const char* TypeToString(InstanceType type);
39
40
41void Object::Print() {
42 if (IsSmi()) {
43 Smi::cast(this)->SmiPrint();
44 } else if (IsFailure()) {
45 Failure::cast(this)->FailurePrint();
46 } else {
47 HeapObject::cast(this)->HeapObjectPrint();
48 }
49 Flush();
50}
51
52
53void Object::PrintLn() {
54 Print();
55 PrintF("\n");
56}
57
58
59void Object::Verify() {
60 if (IsSmi()) {
61 Smi::cast(this)->SmiVerify();
62 } else if (IsFailure()) {
63 Failure::cast(this)->FailureVerify();
64 } else {
65 HeapObject::cast(this)->HeapObjectVerify();
66 }
67}
68
69
70void Object::VerifyPointer(Object* p) {
71 if (p->IsHeapObject()) {
72 HeapObject::VerifyHeapPointer(p);
73 } else {
74 ASSERT(p->IsSmi());
75 }
76}
77
78
79void Smi::SmiVerify() {
80 ASSERT(IsSmi());
81}
82
83
84void Failure::FailureVerify() {
85 ASSERT(IsFailure());
86}
87
88
89void HeapObject::PrintHeader(const char* id) {
90 PrintF("%p: [%s]\n", this, id);
91}
92
93
94void HeapObject::HeapObjectPrint() {
95 InstanceType instance_type = map()->instance_type();
96
97 HandleScope scope;
98 if (instance_type < FIRST_NONSTRING_TYPE) {
99 String::cast(this)->StringPrint();
100 return;
101 }
102
103 switch (instance_type) {
104 case MAP_TYPE:
105 Map::cast(this)->MapPrint();
106 break;
107 case HEAP_NUMBER_TYPE:
108 HeapNumber::cast(this)->HeapNumberPrint();
109 break;
110 case FIXED_ARRAY_TYPE:
111 FixedArray::cast(this)->FixedArrayPrint();
112 break;
113 case BYTE_ARRAY_TYPE:
114 ByteArray::cast(this)->ByteArrayPrint();
115 break;
116 case FILLER_TYPE:
117 PrintF("filler");
118 break;
119 case JS_OBJECT_TYPE: // fall through
120 case JS_ARRAY_TYPE:
ager@chromium.org236ad962008-09-25 09:45:57 +0000121 case JS_REGEXP_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000122 JSObject::cast(this)->JSObjectPrint();
123 break;
124 case ODDBALL_TYPE:
125 Oddball::cast(this)->to_string()->Print();
126 break;
127 case JS_FUNCTION_TYPE:
128 JSFunction::cast(this)->JSFunctionPrint();
129 break;
130 case JS_GLOBAL_OBJECT_TYPE:
131 JSGlobalObject::cast(this)->JSGlobalObjectPrint();
132 break;
133 case JS_BUILTINS_OBJECT_TYPE:
134 JSBuiltinsObject::cast(this)->JSBuiltinsObjectPrint();
135 break;
136 case JS_VALUE_TYPE:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000137 PrintF("Value wrapper around:");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000138 JSValue::cast(this)->value()->Print();
139 break;
140 case CODE_TYPE:
141 Code::cast(this)->CodePrint();
142 break;
143 case PROXY_TYPE:
144 Proxy::cast(this)->ProxyPrint();
145 break;
146 case SHARED_FUNCTION_INFO_TYPE:
147 SharedFunctionInfo::cast(this)->SharedFunctionInfoPrint();
148 break;
149
150#define MAKE_STRUCT_CASE(NAME, Name, name) \
151 case NAME##_TYPE: \
152 Name::cast(this)->Name##Print(); \
153 break;
154 STRUCT_LIST(MAKE_STRUCT_CASE)
155#undef MAKE_STRUCT_CASE
156
157 default:
158 PrintF("UNKNOWN TYPE %d", map()->instance_type());
159 UNREACHABLE();
160 break;
161 }
162}
163
164
165void HeapObject::HeapObjectVerify() {
166 InstanceType instance_type = map()->instance_type();
167
168 if (instance_type < FIRST_NONSTRING_TYPE) {
169 String::cast(this)->StringVerify();
170 return;
171 }
172
173 switch (instance_type) {
174 case MAP_TYPE:
175 Map::cast(this)->MapVerify();
176 break;
177 case HEAP_NUMBER_TYPE:
178 HeapNumber::cast(this)->HeapNumberVerify();
179 break;
180 case FIXED_ARRAY_TYPE:
181 FixedArray::cast(this)->FixedArrayVerify();
182 break;
183 case BYTE_ARRAY_TYPE:
184 ByteArray::cast(this)->ByteArrayVerify();
185 break;
186 case CODE_TYPE:
187 Code::cast(this)->CodeVerify();
188 break;
189 case ODDBALL_TYPE:
190 Oddball::cast(this)->OddballVerify();
191 break;
192 case JS_OBJECT_TYPE:
193 JSObject::cast(this)->JSObjectVerify();
194 break;
195 case JS_VALUE_TYPE:
196 JSValue::cast(this)->JSValueVerify();
197 break;
198 case JS_FUNCTION_TYPE:
199 JSFunction::cast(this)->JSFunctionVerify();
200 break;
201 case JS_GLOBAL_OBJECT_TYPE:
202 JSGlobalObject::cast(this)->JSGlobalObjectVerify();
203 break;
204 case JS_BUILTINS_OBJECT_TYPE:
205 JSBuiltinsObject::cast(this)->JSBuiltinsObjectVerify();
206 break;
207 case JS_ARRAY_TYPE:
208 JSArray::cast(this)->JSArrayVerify();
209 break;
ager@chromium.org236ad962008-09-25 09:45:57 +0000210 case JS_REGEXP_TYPE:
211 JSRegExp::cast(this)->JSRegExpVerify();
212 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000213 case FILLER_TYPE:
214 break;
215 case PROXY_TYPE:
216 Proxy::cast(this)->ProxyVerify();
217 break;
218 case SHARED_FUNCTION_INFO_TYPE:
219 SharedFunctionInfo::cast(this)->SharedFunctionInfoVerify();
220 break;
221
222#define MAKE_STRUCT_CASE(NAME, Name, name) \
223 case NAME##_TYPE: \
224 Name::cast(this)->Name##Verify(); \
225 break;
226 STRUCT_LIST(MAKE_STRUCT_CASE)
227#undef MAKE_STRUCT_CASE
228
229 default:
230 UNREACHABLE();
231 break;
232 }
233}
234
235
236void HeapObject::VerifyHeapPointer(Object* p) {
237 ASSERT(p->IsHeapObject());
238 ASSERT(Heap::Contains(HeapObject::cast(p)));
239}
240
241
242void HeapNumber::HeapNumberVerify() {
243 ASSERT(IsHeapNumber());
244}
245
246
247void ByteArray::ByteArrayPrint() {
248 PrintF("byte array, data starts at %p", GetDataStartAddress());
249}
250
251
252void ByteArray::ByteArrayVerify() {
253 ASSERT(IsByteArray());
254}
255
256
257void JSObject::PrintProperties() {
258 if (HasFastProperties()) {
259 for (DescriptorReader r(map()->instance_descriptors());
260 !r.eos();
261 r.advance()) {
262 PrintF(" ");
263 r.GetKey()->StringPrint();
264 PrintF(": ");
265 if (r.type() == FIELD) {
266 properties()->get(r.GetFieldIndex())->ShortPrint();
267 PrintF(" (field at offset %d)\n", r.GetFieldIndex());
268 } else if (r.type() == CONSTANT_FUNCTION) {
269 r.GetConstantFunction()->ShortPrint();
270 PrintF(" (constant function)\n");
271 } else if (r.type() == CALLBACKS) {
272 r.GetCallbacksObject()->ShortPrint();
273 PrintF(" (callback)\n");
274 } else if (r.type() == MAP_TRANSITION) {
275 PrintF(" (map transition)\n");
276 } else {
277 UNREACHABLE();
278 }
279 }
280 } else {
281 property_dictionary()->Print();
282 }
283}
284
285
286void JSObject::PrintElements() {
287 if (HasFastElements()) {
288 FixedArray* p = FixedArray::cast(elements());
289 for (int i = 0; i < p->length(); i++) {
290 PrintF(" %d: ", i);
291 p->get(i)->ShortPrint();
292 PrintF("\n");
293 }
294 } else {
295 elements()->Print();
296 }
297}
298
299
300void JSObject::JSObjectPrint() {
301 PrintF("%p: [JSObject]\n", this);
302 PrintF(" - map = %p\n", map());
303 PrintF(" - prototype = %p\n", GetPrototype());
304 PrintF(" {\n");
305 PrintProperties();
306 PrintElements();
307 PrintF(" }\n");
308}
309
310
311void JSObject::JSObjectVerify() {
312 VerifyHeapPointer(properties());
313 VerifyHeapPointer(elements());
314 if (HasFastProperties()) {
315 CHECK(map()->unused_property_fields() ==
316 (properties()->length() - map()->NextFreePropertyIndex()));
317 }
318}
319
320
321static const char* TypeToString(InstanceType type) {
322 switch (type) {
323 case MAP_TYPE: return "MAP";
324 case HEAP_NUMBER_TYPE: return "HEAP_NUMBER";
325 case SHORT_SYMBOL_TYPE:
326 case MEDIUM_SYMBOL_TYPE:
327 case LONG_SYMBOL_TYPE: return "SYMBOL";
328 case SHORT_ASCII_SYMBOL_TYPE:
329 case MEDIUM_ASCII_SYMBOL_TYPE:
330 case LONG_ASCII_SYMBOL_TYPE: return "ASCII_SYMBOL";
331 case SHORT_SLICED_SYMBOL_TYPE:
332 case MEDIUM_SLICED_SYMBOL_TYPE:
333 case LONG_SLICED_SYMBOL_TYPE: return "SLICED_SYMBOL";
334 case SHORT_SLICED_ASCII_SYMBOL_TYPE:
335 case MEDIUM_SLICED_ASCII_SYMBOL_TYPE:
336 case LONG_SLICED_ASCII_SYMBOL_TYPE: return "SLICED_ASCII_SYMBOL";
337 case SHORT_CONS_SYMBOL_TYPE:
338 case MEDIUM_CONS_SYMBOL_TYPE:
339 case LONG_CONS_SYMBOL_TYPE: return "CONS_SYMBOL";
340 case SHORT_CONS_ASCII_SYMBOL_TYPE:
341 case MEDIUM_CONS_ASCII_SYMBOL_TYPE:
342 case LONG_CONS_ASCII_SYMBOL_TYPE: return "CONS_ASCII_SYMBOL";
343 case SHORT_EXTERNAL_ASCII_SYMBOL_TYPE:
344 case MEDIUM_EXTERNAL_ASCII_SYMBOL_TYPE:
345 case LONG_EXTERNAL_ASCII_SYMBOL_TYPE:
346 case SHORT_EXTERNAL_SYMBOL_TYPE:
347 case MEDIUM_EXTERNAL_SYMBOL_TYPE:
348 case LONG_EXTERNAL_SYMBOL_TYPE: return "EXTERNAL_SYMBOL";
349 case SHORT_ASCII_STRING_TYPE:
350 case MEDIUM_ASCII_STRING_TYPE:
351 case LONG_ASCII_STRING_TYPE: return "ASCII_STRING";
352 case SHORT_STRING_TYPE:
353 case MEDIUM_STRING_TYPE:
354 case LONG_STRING_TYPE: return "TWO_BYTE_STRING";
355 case SHORT_CONS_STRING_TYPE:
356 case MEDIUM_CONS_STRING_TYPE:
357 case LONG_CONS_STRING_TYPE:
358 case SHORT_CONS_ASCII_STRING_TYPE:
359 case MEDIUM_CONS_ASCII_STRING_TYPE:
360 case LONG_CONS_ASCII_STRING_TYPE: return "CONS_STRING";
361 case SHORT_SLICED_STRING_TYPE:
362 case MEDIUM_SLICED_STRING_TYPE:
363 case LONG_SLICED_STRING_TYPE:
364 case SHORT_SLICED_ASCII_STRING_TYPE:
365 case MEDIUM_SLICED_ASCII_STRING_TYPE:
366 case LONG_SLICED_ASCII_STRING_TYPE: return "SLICED_STRING";
367 case SHORT_EXTERNAL_ASCII_STRING_TYPE:
368 case MEDIUM_EXTERNAL_ASCII_STRING_TYPE:
369 case LONG_EXTERNAL_ASCII_STRING_TYPE:
370 case SHORT_EXTERNAL_STRING_TYPE:
371 case MEDIUM_EXTERNAL_STRING_TYPE:
372 case LONG_EXTERNAL_STRING_TYPE: return "EXTERNAL_STRING";
373 case FIXED_ARRAY_TYPE: return "FIXED_ARRAY";
374 case BYTE_ARRAY_TYPE: return "BYTE_ARRAY";
375 case FILLER_TYPE: return "FILLER";
376 case JS_OBJECT_TYPE: return "JS_OBJECT";
377 case ODDBALL_TYPE: return "ODDBALL";
378 case SHARED_FUNCTION_INFO_TYPE: return "SHARED_FUNCTION_INFO";
379 case JS_FUNCTION_TYPE: return "JS_FUNCTION";
380 case CODE_TYPE: return "CODE";
381 case JS_ARRAY_TYPE: return "JS_ARRAY";
ager@chromium.org236ad962008-09-25 09:45:57 +0000382 case JS_REGEXP_TYPE: return "JS_REGEXP";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000383 case JS_VALUE_TYPE: return "JS_VALUE";
384 case JS_GLOBAL_OBJECT_TYPE: return "JS_GLOBAL_OBJECT";
385 case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT";
386 case PROXY_TYPE: return "PROXY";
387 case SMI_TYPE: return "SMI";
388#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME;
389 STRUCT_LIST(MAKE_STRUCT_CASE)
390#undef MAKE_STRUCT_CASE
391 }
392 return "UNKNOWN";
393}
394
395
396void Map::MapPrint() {
397 HeapObject::PrintHeader("Map");
398 PrintF(" - type: %s\n", TypeToString(instance_type()));
399 PrintF(" - instance size: %d\n", instance_size());
400 PrintF(" - unused property fields: %d\n", unused_property_fields());
401 PrintF(" - instance descriptors: ");
402 instance_descriptors()->ShortPrint();
403 PrintF("\n - prototype: ");
404 prototype()->ShortPrint();
405 PrintF("\n - constructor: ");
406 constructor()->ShortPrint();
407 PrintF("\n");
408}
409
410
411void Map::MapVerify() {
412 ASSERT(!Heap::InNewSpace(this));
413 ASSERT(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE);
414 ASSERT(kPointerSize <= instance_size()
415 && instance_size() < Heap::Capacity());
416 VerifyHeapPointer(prototype());
417 VerifyHeapPointer(instance_descriptors());
418}
419
420
421void FixedArray::FixedArrayPrint() {
422 HeapObject::PrintHeader("FixedArray");
423 PrintF(" - length: %d", length());
424 for (int i = 0; i < length(); i++) {
425 PrintF("\n [%d]: ", i);
426 get(i)->ShortPrint();
427 }
428 PrintF("\n");
429}
430
431
432void FixedArray::FixedArrayVerify() {
433 for (int i = 0; i < length(); i++) {
434 Object* e = get(i);
435 if (e->IsHeapObject()) {
436 VerifyHeapPointer(e);
437 } else {
438 e->Verify();
439 }
440 }
441}
442
443
444void JSValue::JSValuePrint() {
445 HeapObject::PrintHeader("ValueObject");
446 value()->Print();
447}
448
449
450void JSValue::JSValueVerify() {
451 Object* v = value();
452 if (v->IsHeapObject()) {
453 VerifyHeapPointer(v);
454 }
455}
456
457
458void String::StringPrint() {
459 if (IsSymbol()) {
460 PrintF("#");
461 } else if (IsConsString()) {
462 PrintF("c\"");
463 } else {
464 PrintF("\"");
465 }
466
467 for (int i = 0; i < length(); i++) {
468 PrintF("%c", Get(i));
469 }
470
471 if (!IsSymbol()) PrintF("\"");
472}
473
474
475void String::StringVerify() {
476 CHECK(IsString());
477 CHECK(length() >= 0 && length() <= Smi::kMaxValue);
478 if (IsSymbol()) {
479 CHECK(!Heap::InNewSpace(this));
480 }
481}
482
483
484void JSFunction::JSFunctionPrint() {
485 HeapObject::PrintHeader("Function");
486 PrintF(" - map = 0x%p\n", map());
487 PrintF(" - is boilerplate: %s\n", IsBoilerplate() ? "yes" : "no");
488 PrintF(" - initial_map = ");
489 if (has_initial_map()) {
490 initial_map()->ShortPrint();
491 }
492 PrintF("\n - shared_info = ");
493 shared()->ShortPrint();
494 PrintF("\n - name = ");
495 shared()->name()->Print();
496 PrintF("\n - context = ");
497 unchecked_context()->ShortPrint();
498 PrintF("\n - code = ");
499 code()->ShortPrint();
500 PrintF("\n");
501
502 PrintProperties();
503 PrintElements();
504
505 PrintF("\n");
506}
507
508
509void JSFunction::JSFunctionVerify() {
510 CHECK(IsJSFunction());
511 VerifyObjectField(kPrototypeOrInitialMapOffset);
512}
513
514
515void SharedFunctionInfo::SharedFunctionInfoPrint() {
516 HeapObject::PrintHeader("SharedFunctionInfo");
517 PrintF(" - name: ");
518 name()->ShortPrint();
519 PrintF("\n - expected_nof_properties: %d", expected_nof_properties());
520 PrintF("\n - instance class name =");
521 instance_class_name()->Print();
522 PrintF("\n - code =");
523 code()->ShortPrint();
524 PrintF("\n - source code =");
525 GetSourceCode()->ShortPrint();
526 PrintF("\n - lazy load: %s",
527 lazy_load_data() == Heap::undefined_value() ? "no" : "yes");
528 // Script files are often large, hard to read.
529 // PrintF("\n - script =");
530 // script()->Print();
531 PrintF("\n - function token position = %d", function_token_position());
532 PrintF("\n - start position = %d", start_position());
533 PrintF("\n - end position = %d", end_position());
534 PrintF("\n - is expression = %d", is_expression());
535 PrintF("\n - debug info = ");
536 debug_info()->Print();
537 PrintF("\n - length = %d", length());
538 PrintF("\n");
539}
540
541void SharedFunctionInfo::SharedFunctionInfoVerify() {
542 CHECK(IsSharedFunctionInfo());
543 VerifyObjectField(kNameOffset);
544 VerifyObjectField(kCodeOffset);
545 VerifyObjectField(kInstanceClassNameOffset);
546 VerifyObjectField(kExternalReferenceDataOffset);
547 VerifyObjectField(kLazyLoadDataOffset);
548 VerifyObjectField(kScriptOffset);
549 VerifyObjectField(kDebugInfoOffset);
550}
551
552
553void JSGlobalObject::JSGlobalObjectPrint() {
554 PrintF("global ");
555 JSObjectPrint();
556}
557
558
559void JSGlobalObject::JSGlobalObjectVerify() {
560 CHECK(IsJSGlobalObject());
561 JSObjectVerify();
562 for (int i = GlobalObject::kBuiltinsOffset;
563 i < JSGlobalObject::kSize;
564 i += kPointerSize) {
565 VerifyObjectField(i);
566 }
567}
568
569
570void JSBuiltinsObject::JSBuiltinsObjectPrint() {
571 PrintF("builtins ");
572 JSObjectPrint();
573}
574
575
576void JSBuiltinsObject::JSBuiltinsObjectVerify() {
577 CHECK(IsJSBuiltinsObject());
578 JSObjectVerify();
579 for (int i = GlobalObject::kBuiltinsOffset;
580 i < JSBuiltinsObject::kSize;
581 i += kPointerSize) {
582 VerifyObjectField(i);
583 }
584}
585
586
587void Oddball::OddballVerify() {
588 CHECK(IsOddball());
589 VerifyHeapPointer(to_string());
590 Object* number = to_number();
591 if (number->IsHeapObject()) {
592 ASSERT(number == Heap::nan_value());
593 } else {
594 ASSERT(number->IsSmi());
595 int value = Smi::cast(number)->value();
596 ASSERT(value == 0 || value == 1 || value == -1);
597 }
598}
599
600
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000601void Code::CodePrint() {
602 HeapObject::PrintHeader("Code");
mads.s.ager31e71382008-08-13 09:32:07 +0000603#ifdef ENABLE_DISASSEMBLER
604 Disassemble();
605#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000606}
607
608
609void Code::CodeVerify() {
kasper.lund7276f142008-07-30 08:49:36 +0000610 CHECK(ic_flag() == IC_TARGET_IS_ADDRESS);
611 Address last_gc_pc = NULL;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000612 for (RelocIterator it(this); !it.done(); it.next()) {
613 it.rinfo()->Verify();
kasper.lund7276f142008-07-30 08:49:36 +0000614 // Ensure that GC will not iterate twice over the same pointer.
ager@chromium.org236ad962008-09-25 09:45:57 +0000615 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) {
kasper.lund7276f142008-07-30 08:49:36 +0000616 CHECK(it.rinfo()->pc() != last_gc_pc);
617 last_gc_pc = it.rinfo()->pc();
618 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000619 }
620}
621
622
623void JSArray::JSArrayVerify() {
624 JSObjectVerify();
625 ASSERT(length()->IsNumber() || length()->IsUndefined());
626 ASSERT(elements()->IsUndefined() || elements()->IsFixedArray());
627}
628
629
ager@chromium.org236ad962008-09-25 09:45:57 +0000630void JSRegExp::JSRegExpVerify() {
631 JSObjectVerify();
632 ASSERT(type()->IsSmi() || type()->IsUndefined());
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000633 if (type()->IsSmi()) {
634 switch (type_tag()) {
635 case JSRegExp::JSCRE:
636 ASSERT(data()->IsFixedArray());
637 break;
638 default:
639 ASSERT_EQ(JSRegExp::ATOM, type_tag());
640 ASSERT(data()->IsString());
641 break;
642 }
643 } else {
644 ASSERT(data()->IsUndefined());
645 }
ager@chromium.org236ad962008-09-25 09:45:57 +0000646}
647
648
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000649void Proxy::ProxyPrint() {
650 PrintF("proxy to %p", proxy());
651}
652
653
654void Proxy::ProxyVerify() {
655 ASSERT(IsProxy());
656}
657
658
659void Dictionary::Print() {
660 int capacity = Capacity();
661 for (int i = 0; i < capacity; i++) {
662 Object* k = KeyAt(i);
663 if (IsKey(k)) {
664 PrintF(" ");
665 if (k->IsString()) {
666 String::cast(k)->StringPrint();
667 } else {
668 k->ShortPrint();
669 }
670 PrintF(": ");
671 ValueAt(i)->ShortPrint();
672 PrintF("\n");
673 }
674 }
675}
676
677
678void AccessorInfo::AccessorInfoVerify() {
679 CHECK(IsAccessorInfo());
680 VerifyPointer(getter());
681 VerifyPointer(setter());
682 VerifyPointer(name());
683 VerifyPointer(data());
684 VerifyPointer(flag());
685}
686
687void AccessorInfo::AccessorInfoPrint() {
688 PrintF("AccessorInfo");
689 PrintF("\n - getter: ");
690 getter()->ShortPrint();
691 PrintF("\n - setter: ");
692 setter()->ShortPrint();
693 PrintF("\n - name: ");
694 name()->ShortPrint();
695 PrintF("\n - data: ");
696 data()->ShortPrint();
697 PrintF("\n - flag: ");
698 flag()->ShortPrint();
699}
700
701void AccessCheckInfo::AccessCheckInfoVerify() {
702 CHECK(IsAccessCheckInfo());
703 VerifyPointer(named_callback());
704 VerifyPointer(indexed_callback());
705 VerifyPointer(data());
706}
707
708void AccessCheckInfo::AccessCheckInfoPrint() {
709 PrintF("AccessCheckInfo");
710 PrintF("\n - named_callback: ");
711 named_callback()->ShortPrint();
712 PrintF("\n - indexed_callback: ");
713 indexed_callback()->ShortPrint();
714 PrintF("\n - data: ");
715 data()->ShortPrint();
716}
717
718void InterceptorInfo::InterceptorInfoVerify() {
719 CHECK(IsInterceptorInfo());
720 VerifyPointer(getter());
721 VerifyPointer(setter());
722 VerifyPointer(query());
723 VerifyPointer(deleter());
724 VerifyPointer(enumerator());
725 VerifyPointer(data());
726}
727
728void InterceptorInfo::InterceptorInfoPrint() {
729 PrintF("InterceptorInfo");
730 PrintF("\n - getter: ");
731 getter()->ShortPrint();
732 PrintF("\n - setter: ");
733 setter()->ShortPrint();
734 PrintF("\n - query: ");
735 query()->ShortPrint();
736 PrintF("\n - deleter: ");
737 deleter()->ShortPrint();
738 PrintF("\n - enumerator: ");
739 enumerator()->ShortPrint();
740 PrintF("\n - data: ");
741 data()->ShortPrint();
742}
743
744void CallHandlerInfo::CallHandlerInfoVerify() {
745 CHECK(IsCallHandlerInfo());
746 VerifyPointer(callback());
747 VerifyPointer(data());
748}
749
750void CallHandlerInfo::CallHandlerInfoPrint() {
751 PrintF("CallHandlerInfo");
752 PrintF("\n - callback: ");
753 callback()->ShortPrint();
754 PrintF("\n - data: ");
755 data()->ShortPrint();
756}
757
758void TemplateInfo::TemplateInfoVerify() {
759 VerifyPointer(tag());
760 VerifyPointer(property_list());
761}
762
763void FunctionTemplateInfo::FunctionTemplateInfoVerify() {
764 CHECK(IsFunctionTemplateInfo());
765 TemplateInfoVerify();
766 VerifyPointer(serial_number());
767 VerifyPointer(call_code());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000768 VerifyPointer(property_accessors());
769 VerifyPointer(prototype_template());
770 VerifyPointer(parent_template());
771 VerifyPointer(named_property_handler());
772 VerifyPointer(indexed_property_handler());
773 VerifyPointer(instance_template());
774 VerifyPointer(signature());
775 VerifyPointer(access_check_info());
776}
777
778void FunctionTemplateInfo::FunctionTemplateInfoPrint() {
779 PrintF("FunctionTemplateInfo");
780 PrintF("\n - tag: ");
781 tag()->ShortPrint();
782 PrintF("\n - property_list: ");
783 property_list()->ShortPrint();
784 PrintF("\n - serial_number: ");
785 serial_number()->ShortPrint();
786 PrintF("\n - call_code: ");
787 call_code()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000788 PrintF("\n - property_accessors: ");
789 property_accessors()->ShortPrint();
790 PrintF("\n - prototype_template: ");
791 prototype_template()->ShortPrint();
792 PrintF("\n - parent_template: ");
793 parent_template()->ShortPrint();
794 PrintF("\n - named_property_handler: ");
795 named_property_handler()->ShortPrint();
796 PrintF("\n - indexed_property_handler: ");
797 indexed_property_handler()->ShortPrint();
798 PrintF("\n - instance_template: ");
799 instance_template()->ShortPrint();
800 PrintF("\n - signature: ");
801 signature()->ShortPrint();
802 PrintF("\n - access_check_info: ");
803 access_check_info()->ShortPrint();
804 PrintF("\n - hidden_prototype: %s", hidden_prototype() ? "true" : "false");
805 PrintF("\n - undetectable: %s", undetectable() ? "true" : "false");
806 PrintF("\n - need_access_check: %s", needs_access_check() ? "true" : "false");
807}
808
809void ObjectTemplateInfo::ObjectTemplateInfoVerify() {
810 CHECK(IsObjectTemplateInfo());
811 TemplateInfoVerify();
812 VerifyPointer(constructor());
kasper.lund212ac232008-07-16 07:07:30 +0000813 VerifyPointer(internal_field_count());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000814}
815
816void ObjectTemplateInfo::ObjectTemplateInfoPrint() {
817 PrintF("ObjectTemplateInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000818 PrintF("\n - constructor: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000819 constructor()->ShortPrint();
kasper.lund212ac232008-07-16 07:07:30 +0000820 PrintF("\n - internal_field_count: ");
821 internal_field_count()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000822}
823
824void SignatureInfo::SignatureInfoVerify() {
825 CHECK(IsSignatureInfo());
826 VerifyPointer(receiver());
827 VerifyPointer(args());
828}
829
830void SignatureInfo::SignatureInfoPrint() {
831 PrintF("SignatureInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000832 PrintF("\n - receiver: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000833 receiver()->ShortPrint();
kasper.lund212ac232008-07-16 07:07:30 +0000834 PrintF("\n - args: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000835 args()->ShortPrint();
836}
837
838void TypeSwitchInfo::TypeSwitchInfoVerify() {
839 CHECK(IsTypeSwitchInfo());
840 VerifyPointer(types());
841}
842
843void TypeSwitchInfo::TypeSwitchInfoPrint() {
844 PrintF("TypeSwitchInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000845 PrintF("\n - types: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000846 types()->ShortPrint();
847}
848
849
850void Script::ScriptVerify() {
851 CHECK(IsScript());
852 VerifyPointer(source());
853 VerifyPointer(name());
854 line_offset()->SmiVerify();
855 column_offset()->SmiVerify();
856 type()->SmiVerify();
857}
858
859
860void Script::ScriptPrint() {
861 HeapObject::PrintHeader("Script");
862 PrintF("\n - source: ");
863 source()->ShortPrint();
864 PrintF("\n - name: ");
865 name()->ShortPrint();
866 PrintF("\n - line_offset: ");
867 line_offset()->ShortPrint();
868 PrintF("\n - column_offset: ");
869 column_offset()->ShortPrint();
870 PrintF("\n - type: ");
871 type()->ShortPrint();
872 PrintF("\n");
873}
874
875
876void DebugInfo::DebugInfoVerify() {
877 CHECK(IsDebugInfo());
878 VerifyPointer(shared());
879 VerifyPointer(original_code());
880 VerifyPointer(code());
881 VerifyPointer(break_points());
882}
883
884
885void DebugInfo::DebugInfoPrint() {
886 PrintF("DebugInfo");
887 PrintF("\n - shared");
888 shared()->ShortPrint();
889 PrintF("\n - original_code");
890 original_code()->ShortPrint();
891 PrintF("\n - code");
892 code()->ShortPrint();
893 PrintF("\n - break_points");
894 break_points()->ShortPrint();
895}
896
897
898void BreakPointInfo::BreakPointInfoVerify() {
899 CHECK(IsBreakPointInfo());
900 code_position()->SmiVerify();
901 source_position()->SmiVerify();
902 statement_position()->SmiVerify();
903 VerifyPointer(break_point_objects());
904}
905
906
907void BreakPointInfo::BreakPointInfoPrint() {
908 PrintF("BreakPointInfo");
909 PrintF("\n - code_position %d", code_position());
910 PrintF("\n - source_position %d", source_position());
911 PrintF("\n - statement_position %d", statement_position());
912 PrintF("\n - break_point_objects ");
913 break_point_objects()->ShortPrint();
914}
915
916
917void JSObject::IncrementSpillStatistics(SpillInformation* info) {
918 info->number_of_objects_++;
919 // Named properties
920 if (HasFastProperties()) {
921 info->number_of_objects_with_fast_properties_++;
922 info->number_of_fast_used_fields_ += map()->NextFreePropertyIndex();
923 info->number_of_fast_unused_fields_ += map()->unused_property_fields();
924 } else {
925 Dictionary* dict = property_dictionary();
926 info->number_of_slow_used_properties_ += dict->NumberOfElements();
927 info->number_of_slow_unused_properties_ +=
928 dict->Capacity() - dict->NumberOfElements();
929 }
930 // Indexed properties
931 if (HasFastElements()) {
932 info->number_of_objects_with_fast_elements_++;
933 int holes = 0;
934 FixedArray* e = FixedArray::cast(elements());
935 int len = e->length();
936 for (int i = 0; i < len; i++) {
937 if (e->get(i) == Heap::the_hole_value()) holes++;
938 }
939 info->number_of_fast_used_elements_ += len - holes;
940 info->number_of_fast_unused_elements_ += holes;
941 } else {
942 Dictionary* dict = element_dictionary();
943 info->number_of_slow_used_elements_ += dict->NumberOfElements();
944 info->number_of_slow_unused_elements_ +=
945 dict->Capacity() - dict->NumberOfElements();
946 }
947}
948
949
950void JSObject::SpillInformation::Clear() {
951 number_of_objects_ = 0;
952 number_of_objects_with_fast_properties_ = 0;
953 number_of_objects_with_fast_elements_ = 0;
954 number_of_fast_used_fields_ = 0;
955 number_of_fast_unused_fields_ = 0;
956 number_of_slow_used_properties_ = 0;
957 number_of_slow_unused_properties_ = 0;
958 number_of_fast_used_elements_ = 0;
959 number_of_fast_unused_elements_ = 0;
960 number_of_slow_used_elements_ = 0;
961 number_of_slow_unused_elements_ = 0;
962}
963
964void JSObject::SpillInformation::Print() {
965 PrintF("\n JSObject Spill Statistics (#%d):\n", number_of_objects_);
966
967 PrintF(" - fast properties (#%d): %d (used) %d (unused)\n",
968 number_of_objects_with_fast_properties_,
969 number_of_fast_used_fields_, number_of_fast_unused_fields_);
970
971 PrintF(" - slow properties (#%d): %d (used) %d (unused)\n",
972 number_of_objects_ - number_of_objects_with_fast_properties_,
973 number_of_slow_used_properties_, number_of_slow_unused_properties_);
974
975 PrintF(" - fast elements (#%d): %d (used) %d (unused)\n",
976 number_of_objects_with_fast_elements_,
977 number_of_fast_used_elements_, number_of_fast_unused_elements_);
978
979 PrintF(" - slow elements (#%d): %d (used) %d (unused)\n",
980 number_of_objects_ - number_of_objects_with_fast_elements_,
981 number_of_slow_used_elements_, number_of_slow_unused_elements_);
982
983 PrintF("\n");
984}
985
986
987void DescriptorArray::PrintDescriptors() {
988 PrintF("Descriptor array %d\n", number_of_descriptors());
989 int number = 0;
990 for (DescriptorReader r(this); !r.eos(); r.advance()) {
991 Descriptor desc;
992 r.Get(&desc);
993 PrintF(" %d: ", number++);
994 desc.Print();
995 }
996 PrintF("\n");
997}
998
999
mads.s.ager@gmail.com769cc962008-08-06 10:02:49 +00001000bool DescriptorArray::IsSortedNoDuplicates() {
1001 String* current_key = NULL;
1002 uint32_t current = 0;
1003 for (DescriptorReader r(this); !r.eos(); r.advance()) {
1004 String* key = r.GetKey();
1005 if (key == current_key) {
1006 PrintDescriptors();
1007 return false;
1008 }
1009 current_key = key;
1010 uint32_t hash = r.GetKey()->Hash();
1011 if (hash < current) {
1012 PrintDescriptors();
1013 return false;
1014 }
1015 current = hash;
1016 }
1017 return true;
1018}
1019
1020
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001021#endif // DEBUG
1022
1023} } // namespace v8::internal