blob: e97b207bac0a0848b664f3eec7c5d27b3407a817 [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"
ager@chromium.orgbb29dc92009-03-24 13:25:23 +000033#include "jsregexp.h"
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000034
kasperl@chromium.org71affb52009-05-26 05:44:31 +000035namespace v8 {
36namespace internal {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000037
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;
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000118 case PIXEL_ARRAY_TYPE:
119 PixelArray::cast(this)->PixelArrayPrint();
120 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000121 case FILLER_TYPE:
122 PrintF("filler");
123 break;
124 case JS_OBJECT_TYPE: // fall through
ager@chromium.org32912102009-01-16 10:38:43 +0000125 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000126 case JS_ARRAY_TYPE:
ager@chromium.org236ad962008-09-25 09:45:57 +0000127 case JS_REGEXP_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000128 JSObject::cast(this)->JSObjectPrint();
129 break;
130 case ODDBALL_TYPE:
131 Oddball::cast(this)->to_string()->Print();
132 break;
133 case JS_FUNCTION_TYPE:
134 JSFunction::cast(this)->JSFunctionPrint();
135 break;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000136 case JS_GLOBAL_PROXY_TYPE:
137 JSGlobalProxy::cast(this)->JSGlobalProxyPrint();
138 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000139 case JS_GLOBAL_OBJECT_TYPE:
140 JSGlobalObject::cast(this)->JSGlobalObjectPrint();
141 break;
142 case JS_BUILTINS_OBJECT_TYPE:
143 JSBuiltinsObject::cast(this)->JSBuiltinsObjectPrint();
144 break;
145 case JS_VALUE_TYPE:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000146 PrintF("Value wrapper around:");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000147 JSValue::cast(this)->value()->Print();
148 break;
149 case CODE_TYPE:
150 Code::cast(this)->CodePrint();
151 break;
152 case PROXY_TYPE:
153 Proxy::cast(this)->ProxyPrint();
154 break;
155 case SHARED_FUNCTION_INFO_TYPE:
156 SharedFunctionInfo::cast(this)->SharedFunctionInfoPrint();
157 break;
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000158 case JS_GLOBAL_PROPERTY_CELL_TYPE:
159 JSGlobalPropertyCell::cast(this)->JSGlobalPropertyCellPrint();
160 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000161#define MAKE_STRUCT_CASE(NAME, Name, name) \
162 case NAME##_TYPE: \
163 Name::cast(this)->Name##Print(); \
164 break;
165 STRUCT_LIST(MAKE_STRUCT_CASE)
166#undef MAKE_STRUCT_CASE
167
168 default:
169 PrintF("UNKNOWN TYPE %d", map()->instance_type());
170 UNREACHABLE();
171 break;
172 }
173}
174
175
176void HeapObject::HeapObjectVerify() {
177 InstanceType instance_type = map()->instance_type();
178
179 if (instance_type < FIRST_NONSTRING_TYPE) {
180 String::cast(this)->StringVerify();
181 return;
182 }
183
184 switch (instance_type) {
185 case MAP_TYPE:
186 Map::cast(this)->MapVerify();
187 break;
188 case HEAP_NUMBER_TYPE:
189 HeapNumber::cast(this)->HeapNumberVerify();
190 break;
191 case FIXED_ARRAY_TYPE:
192 FixedArray::cast(this)->FixedArrayVerify();
193 break;
194 case BYTE_ARRAY_TYPE:
195 ByteArray::cast(this)->ByteArrayVerify();
196 break;
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000197 case PIXEL_ARRAY_TYPE:
198 PixelArray::cast(this)->PixelArrayVerify();
199 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000200 case CODE_TYPE:
201 Code::cast(this)->CodeVerify();
202 break;
203 case ODDBALL_TYPE:
204 Oddball::cast(this)->OddballVerify();
205 break;
206 case JS_OBJECT_TYPE:
ager@chromium.org32912102009-01-16 10:38:43 +0000207 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000208 JSObject::cast(this)->JSObjectVerify();
209 break;
210 case JS_VALUE_TYPE:
211 JSValue::cast(this)->JSValueVerify();
212 break;
213 case JS_FUNCTION_TYPE:
214 JSFunction::cast(this)->JSFunctionVerify();
215 break;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000216 case JS_GLOBAL_PROXY_TYPE:
217 JSGlobalProxy::cast(this)->JSGlobalProxyVerify();
218 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000219 case JS_GLOBAL_OBJECT_TYPE:
220 JSGlobalObject::cast(this)->JSGlobalObjectVerify();
221 break;
222 case JS_BUILTINS_OBJECT_TYPE:
223 JSBuiltinsObject::cast(this)->JSBuiltinsObjectVerify();
224 break;
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000225 case JS_GLOBAL_PROPERTY_CELL_TYPE:
226 JSGlobalPropertyCell::cast(this)->JSGlobalPropertyCellVerify();
227 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000228 case JS_ARRAY_TYPE:
229 JSArray::cast(this)->JSArrayVerify();
230 break;
ager@chromium.org236ad962008-09-25 09:45:57 +0000231 case JS_REGEXP_TYPE:
232 JSRegExp::cast(this)->JSRegExpVerify();
233 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000234 case FILLER_TYPE:
235 break;
236 case PROXY_TYPE:
237 Proxy::cast(this)->ProxyVerify();
238 break;
239 case SHARED_FUNCTION_INFO_TYPE:
240 SharedFunctionInfo::cast(this)->SharedFunctionInfoVerify();
241 break;
242
243#define MAKE_STRUCT_CASE(NAME, Name, name) \
244 case NAME##_TYPE: \
245 Name::cast(this)->Name##Verify(); \
246 break;
247 STRUCT_LIST(MAKE_STRUCT_CASE)
248#undef MAKE_STRUCT_CASE
249
250 default:
251 UNREACHABLE();
252 break;
253 }
254}
255
256
257void HeapObject::VerifyHeapPointer(Object* p) {
258 ASSERT(p->IsHeapObject());
259 ASSERT(Heap::Contains(HeapObject::cast(p)));
260}
261
262
263void HeapNumber::HeapNumberVerify() {
264 ASSERT(IsHeapNumber());
265}
266
267
268void ByteArray::ByteArrayPrint() {
269 PrintF("byte array, data starts at %p", GetDataStartAddress());
270}
271
272
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000273void PixelArray::PixelArrayPrint() {
274 PrintF("pixel array");
275}
276
277
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000278void ByteArray::ByteArrayVerify() {
279 ASSERT(IsByteArray());
280}
281
282
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000283void PixelArray::PixelArrayVerify() {
284 ASSERT(IsPixelArray());
285}
286
287
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000288void JSObject::PrintProperties() {
289 if (HasFastProperties()) {
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +0000290 DescriptorArray* descs = map()->instance_descriptors();
291 for (int i = 0; i < descs->number_of_descriptors(); i++) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000292 PrintF(" ");
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +0000293 descs->GetKey(i)->StringPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000294 PrintF(": ");
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +0000295 switch (descs->GetType(i)) {
296 case FIELD: {
297 int index = descs->GetFieldIndex(i);
298 FastPropertyAt(index)->ShortPrint();
299 PrintF(" (field at offset %d)\n", index);
300 break;
301 }
302 case CONSTANT_FUNCTION:
303 descs->GetConstantFunction(i)->ShortPrint();
304 PrintF(" (constant function)\n");
305 break;
306 case CALLBACKS:
307 descs->GetCallbacksObject(i)->ShortPrint();
308 PrintF(" (callback)\n");
309 break;
310 case MAP_TRANSITION:
311 PrintF(" (map transition)\n");
312 break;
313 case CONSTANT_TRANSITION:
314 PrintF(" (constant transition)\n");
315 break;
316 case NULL_DESCRIPTOR:
317 PrintF(" (null descriptor)\n");
318 break;
319 default:
320 UNREACHABLE();
321 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000322 }
323 }
324 } else {
325 property_dictionary()->Print();
326 }
327}
328
329
330void JSObject::PrintElements() {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000331 switch (GetElementsKind()) {
332 case FAST_ELEMENTS: {
333 // Print in array notation for non-sparse arrays.
334 FixedArray* p = FixedArray::cast(elements());
335 for (int i = 0; i < p->length(); i++) {
336 PrintF(" %d: ", i);
337 p->get(i)->ShortPrint();
338 PrintF("\n");
339 }
340 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000341 }
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000342 case PIXEL_ELEMENTS: {
343 PixelArray* p = PixelArray::cast(elements());
344 for (int i = 0; i < p->length(); i++) {
345 PrintF(" %d: %d\n", i, p->get(i));
346 }
347 break;
348 }
349 case DICTIONARY_ELEMENTS:
350 elements()->Print();
351 break;
352 default:
353 UNREACHABLE();
354 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000355 }
356}
357
358
359void JSObject::JSObjectPrint() {
360 PrintF("%p: [JSObject]\n", this);
361 PrintF(" - map = %p\n", map());
362 PrintF(" - prototype = %p\n", GetPrototype());
363 PrintF(" {\n");
364 PrintProperties();
365 PrintElements();
366 PrintF(" }\n");
367}
368
369
370void JSObject::JSObjectVerify() {
371 VerifyHeapPointer(properties());
372 VerifyHeapPointer(elements());
373 if (HasFastProperties()) {
sgjesse@chromium.org911335c2009-08-19 12:59:44 +0000374 CHECK_EQ(map()->unused_property_fields(),
375 (map()->inobject_properties() + properties()->length() -
376 map()->NextFreePropertyIndex()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000377 }
378}
379
380
381static const char* TypeToString(InstanceType type) {
382 switch (type) {
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +0000383 case INVALID_TYPE: return "INVALID";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000384 case MAP_TYPE: return "MAP";
385 case HEAP_NUMBER_TYPE: return "HEAP_NUMBER";
386 case SHORT_SYMBOL_TYPE:
387 case MEDIUM_SYMBOL_TYPE:
388 case LONG_SYMBOL_TYPE: return "SYMBOL";
389 case SHORT_ASCII_SYMBOL_TYPE:
390 case MEDIUM_ASCII_SYMBOL_TYPE:
391 case LONG_ASCII_SYMBOL_TYPE: return "ASCII_SYMBOL";
392 case SHORT_SLICED_SYMBOL_TYPE:
393 case MEDIUM_SLICED_SYMBOL_TYPE:
394 case LONG_SLICED_SYMBOL_TYPE: return "SLICED_SYMBOL";
395 case SHORT_SLICED_ASCII_SYMBOL_TYPE:
396 case MEDIUM_SLICED_ASCII_SYMBOL_TYPE:
397 case LONG_SLICED_ASCII_SYMBOL_TYPE: return "SLICED_ASCII_SYMBOL";
398 case SHORT_CONS_SYMBOL_TYPE:
399 case MEDIUM_CONS_SYMBOL_TYPE:
400 case LONG_CONS_SYMBOL_TYPE: return "CONS_SYMBOL";
401 case SHORT_CONS_ASCII_SYMBOL_TYPE:
402 case MEDIUM_CONS_ASCII_SYMBOL_TYPE:
403 case LONG_CONS_ASCII_SYMBOL_TYPE: return "CONS_ASCII_SYMBOL";
404 case SHORT_EXTERNAL_ASCII_SYMBOL_TYPE:
405 case MEDIUM_EXTERNAL_ASCII_SYMBOL_TYPE:
406 case LONG_EXTERNAL_ASCII_SYMBOL_TYPE:
407 case SHORT_EXTERNAL_SYMBOL_TYPE:
408 case MEDIUM_EXTERNAL_SYMBOL_TYPE:
409 case LONG_EXTERNAL_SYMBOL_TYPE: return "EXTERNAL_SYMBOL";
410 case SHORT_ASCII_STRING_TYPE:
411 case MEDIUM_ASCII_STRING_TYPE:
412 case LONG_ASCII_STRING_TYPE: return "ASCII_STRING";
413 case SHORT_STRING_TYPE:
414 case MEDIUM_STRING_TYPE:
415 case LONG_STRING_TYPE: return "TWO_BYTE_STRING";
416 case SHORT_CONS_STRING_TYPE:
417 case MEDIUM_CONS_STRING_TYPE:
418 case LONG_CONS_STRING_TYPE:
419 case SHORT_CONS_ASCII_STRING_TYPE:
420 case MEDIUM_CONS_ASCII_STRING_TYPE:
421 case LONG_CONS_ASCII_STRING_TYPE: return "CONS_STRING";
422 case SHORT_SLICED_STRING_TYPE:
423 case MEDIUM_SLICED_STRING_TYPE:
424 case LONG_SLICED_STRING_TYPE:
425 case SHORT_SLICED_ASCII_STRING_TYPE:
426 case MEDIUM_SLICED_ASCII_STRING_TYPE:
427 case LONG_SLICED_ASCII_STRING_TYPE: return "SLICED_STRING";
428 case SHORT_EXTERNAL_ASCII_STRING_TYPE:
429 case MEDIUM_EXTERNAL_ASCII_STRING_TYPE:
430 case LONG_EXTERNAL_ASCII_STRING_TYPE:
431 case SHORT_EXTERNAL_STRING_TYPE:
432 case MEDIUM_EXTERNAL_STRING_TYPE:
433 case LONG_EXTERNAL_STRING_TYPE: return "EXTERNAL_STRING";
434 case FIXED_ARRAY_TYPE: return "FIXED_ARRAY";
435 case BYTE_ARRAY_TYPE: return "BYTE_ARRAY";
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000436 case PIXEL_ARRAY_TYPE: return "PIXEL_ARRAY";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000437 case FILLER_TYPE: return "FILLER";
438 case JS_OBJECT_TYPE: return "JS_OBJECT";
ager@chromium.org32912102009-01-16 10:38:43 +0000439 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: return "JS_CONTEXT_EXTENSION_OBJECT";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000440 case ODDBALL_TYPE: return "ODDBALL";
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000441 case JS_GLOBAL_PROPERTY_CELL_TYPE: return "JS_GLOBAL_PROPERTY_CELL";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000442 case SHARED_FUNCTION_INFO_TYPE: return "SHARED_FUNCTION_INFO";
443 case JS_FUNCTION_TYPE: return "JS_FUNCTION";
444 case CODE_TYPE: return "CODE";
445 case JS_ARRAY_TYPE: return "JS_ARRAY";
ager@chromium.org236ad962008-09-25 09:45:57 +0000446 case JS_REGEXP_TYPE: return "JS_REGEXP";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000447 case JS_VALUE_TYPE: return "JS_VALUE";
448 case JS_GLOBAL_OBJECT_TYPE: return "JS_GLOBAL_OBJECT";
449 case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT";
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000450 case JS_GLOBAL_PROXY_TYPE: return "JS_GLOBAL_PROXY";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000451 case PROXY_TYPE: return "PROXY";
452 case SMI_TYPE: return "SMI";
453#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME;
454 STRUCT_LIST(MAKE_STRUCT_CASE)
455#undef MAKE_STRUCT_CASE
456 }
457 return "UNKNOWN";
458}
459
460
461void Map::MapPrint() {
462 HeapObject::PrintHeader("Map");
463 PrintF(" - type: %s\n", TypeToString(instance_type()));
464 PrintF(" - instance size: %d\n", instance_size());
sgjesse@chromium.org911335c2009-08-19 12:59:44 +0000465 PrintF(" - inobject properties: %d\n", inobject_properties());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000466 PrintF(" - unused property fields: %d\n", unused_property_fields());
ager@chromium.orgddb913d2009-01-27 10:01:48 +0000467 if (is_hidden_prototype()) {
468 PrintF(" - hidden_prototype\n");
469 }
470 if (has_named_interceptor()) {
471 PrintF(" - named_interceptor\n");
472 }
473 if (has_indexed_interceptor()) {
474 PrintF(" - indexed_interceptor\n");
475 }
476 if (is_undetectable()) {
477 PrintF(" - undetectable\n");
478 }
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000479 if (needs_loading()) {
480 PrintF(" - needs_loading\n");
481 }
ager@chromium.orgddb913d2009-01-27 10:01:48 +0000482 if (has_instance_call_handler()) {
483 PrintF(" - instance_call_handler\n");
484 }
485 if (is_access_check_needed()) {
486 PrintF(" - access_check_needed\n");
487 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000488 PrintF(" - instance descriptors: ");
489 instance_descriptors()->ShortPrint();
490 PrintF("\n - prototype: ");
491 prototype()->ShortPrint();
492 PrintF("\n - constructor: ");
493 constructor()->ShortPrint();
494 PrintF("\n");
495}
496
497
498void Map::MapVerify() {
499 ASSERT(!Heap::InNewSpace(this));
500 ASSERT(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE);
501 ASSERT(kPointerSize <= instance_size()
502 && instance_size() < Heap::Capacity());
503 VerifyHeapPointer(prototype());
504 VerifyHeapPointer(instance_descriptors());
505}
506
507
508void FixedArray::FixedArrayPrint() {
509 HeapObject::PrintHeader("FixedArray");
510 PrintF(" - length: %d", length());
511 for (int i = 0; i < length(); i++) {
512 PrintF("\n [%d]: ", i);
513 get(i)->ShortPrint();
514 }
515 PrintF("\n");
516}
517
518
519void FixedArray::FixedArrayVerify() {
520 for (int i = 0; i < length(); i++) {
521 Object* e = get(i);
522 if (e->IsHeapObject()) {
523 VerifyHeapPointer(e);
524 } else {
525 e->Verify();
526 }
527 }
528}
529
530
531void JSValue::JSValuePrint() {
532 HeapObject::PrintHeader("ValueObject");
533 value()->Print();
534}
535
536
537void JSValue::JSValueVerify() {
538 Object* v = value();
539 if (v->IsHeapObject()) {
540 VerifyHeapPointer(v);
541 }
542}
543
544
545void String::StringPrint() {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000546 if (StringShape(this).IsSymbol()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000547 PrintF("#");
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000548 } else if (StringShape(this).IsCons()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000549 PrintF("c\"");
550 } else {
551 PrintF("\"");
552 }
553
554 for (int i = 0; i < length(); i++) {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000555 PrintF("%c", Get(i));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000556 }
557
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000558 if (!StringShape(this).IsSymbol()) PrintF("\"");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000559}
560
561
562void String::StringVerify() {
563 CHECK(IsString());
564 CHECK(length() >= 0 && length() <= Smi::kMaxValue);
565 if (IsSymbol()) {
566 CHECK(!Heap::InNewSpace(this));
567 }
568}
569
570
571void JSFunction::JSFunctionPrint() {
572 HeapObject::PrintHeader("Function");
573 PrintF(" - map = 0x%p\n", map());
574 PrintF(" - is boilerplate: %s\n", IsBoilerplate() ? "yes" : "no");
575 PrintF(" - initial_map = ");
576 if (has_initial_map()) {
577 initial_map()->ShortPrint();
578 }
579 PrintF("\n - shared_info = ");
580 shared()->ShortPrint();
581 PrintF("\n - name = ");
582 shared()->name()->Print();
583 PrintF("\n - context = ");
584 unchecked_context()->ShortPrint();
585 PrintF("\n - code = ");
586 code()->ShortPrint();
587 PrintF("\n");
588
589 PrintProperties();
590 PrintElements();
591
592 PrintF("\n");
593}
594
595
596void JSFunction::JSFunctionVerify() {
597 CHECK(IsJSFunction());
598 VerifyObjectField(kPrototypeOrInitialMapOffset);
599}
600
601
602void SharedFunctionInfo::SharedFunctionInfoPrint() {
603 HeapObject::PrintHeader("SharedFunctionInfo");
604 PrintF(" - name: ");
605 name()->ShortPrint();
606 PrintF("\n - expected_nof_properties: %d", expected_nof_properties());
ager@chromium.org381abbb2009-02-25 13:23:22 +0000607 PrintF("\n - instance class name = ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000608 instance_class_name()->Print();
ager@chromium.org381abbb2009-02-25 13:23:22 +0000609 PrintF("\n - code = ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000610 code()->ShortPrint();
ager@chromium.org381abbb2009-02-25 13:23:22 +0000611 PrintF("\n - source code = ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000612 GetSourceCode()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000613 // Script files are often large, hard to read.
614 // PrintF("\n - script =");
615 // script()->Print();
616 PrintF("\n - function token position = %d", function_token_position());
617 PrintF("\n - start position = %d", start_position());
618 PrintF("\n - end position = %d", end_position());
619 PrintF("\n - is expression = %d", is_expression());
620 PrintF("\n - debug info = ");
ager@chromium.org381abbb2009-02-25 13:23:22 +0000621 debug_info()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000622 PrintF("\n - length = %d", length());
sgjesse@chromium.org911335c2009-08-19 12:59:44 +0000623 PrintF("\n - has_only_this_property_assignments = %d",
624 has_only_this_property_assignments());
625 PrintF("\n - has_only_simple_this_property_assignments = %d",
626 has_only_simple_this_property_assignments());
627 PrintF("\n - this_property_assignments = ");
628 this_property_assignments()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000629 PrintF("\n");
630}
631
632void SharedFunctionInfo::SharedFunctionInfoVerify() {
633 CHECK(IsSharedFunctionInfo());
634 VerifyObjectField(kNameOffset);
635 VerifyObjectField(kCodeOffset);
636 VerifyObjectField(kInstanceClassNameOffset);
637 VerifyObjectField(kExternalReferenceDataOffset);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000638 VerifyObjectField(kScriptOffset);
639 VerifyObjectField(kDebugInfoOffset);
640}
641
642
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000643void JSGlobalProxy::JSGlobalProxyPrint() {
644 PrintF("global_proxy");
645 JSObjectPrint();
646 PrintF("context : ");
647 context()->ShortPrint();
648 PrintF("\n");
649}
650
651
652void JSGlobalProxy::JSGlobalProxyVerify() {
653 CHECK(IsJSGlobalProxy());
654 JSObjectVerify();
655 VerifyObjectField(JSGlobalProxy::kContextOffset);
656 // Make sure that this object has no properties, elements.
657 CHECK_EQ(0, properties()->length());
658 CHECK_EQ(0, elements()->length());
659}
660
661
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000662void JSGlobalObject::JSGlobalObjectPrint() {
663 PrintF("global ");
664 JSObjectPrint();
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000665 PrintF("global context : ");
666 global_context()->ShortPrint();
667 PrintF("\n");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000668}
669
670
671void JSGlobalObject::JSGlobalObjectVerify() {
672 CHECK(IsJSGlobalObject());
673 JSObjectVerify();
674 for (int i = GlobalObject::kBuiltinsOffset;
675 i < JSGlobalObject::kSize;
676 i += kPointerSize) {
677 VerifyObjectField(i);
678 }
679}
680
681
682void JSBuiltinsObject::JSBuiltinsObjectPrint() {
683 PrintF("builtins ");
684 JSObjectPrint();
685}
686
687
688void JSBuiltinsObject::JSBuiltinsObjectVerify() {
689 CHECK(IsJSBuiltinsObject());
690 JSObjectVerify();
691 for (int i = GlobalObject::kBuiltinsOffset;
692 i < JSBuiltinsObject::kSize;
693 i += kPointerSize) {
694 VerifyObjectField(i);
695 }
696}
697
698
699void Oddball::OddballVerify() {
700 CHECK(IsOddball());
701 VerifyHeapPointer(to_string());
702 Object* number = to_number();
703 if (number->IsHeapObject()) {
704 ASSERT(number == Heap::nan_value());
705 } else {
706 ASSERT(number->IsSmi());
707 int value = Smi::cast(number)->value();
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000708 ASSERT(value == 0 || value == 1 || value == -1 || value == -2);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000709 }
710}
711
712
kasperl@chromium.org2abc4502009-07-02 07:00:29 +0000713void JSGlobalPropertyCell::JSGlobalPropertyCellVerify() {
714 CHECK(IsJSGlobalPropertyCell());
715 VerifyObjectField(kValueOffset);
716}
717
718
719void JSGlobalPropertyCell::JSGlobalPropertyCellPrint() {
720 HeapObject::PrintHeader("JSGlobalPropertyCell");
721}
722
723
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000724void Code::CodePrint() {
725 HeapObject::PrintHeader("Code");
mads.s.ager31e71382008-08-13 09:32:07 +0000726#ifdef ENABLE_DISASSEMBLER
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000727 Disassemble(NULL);
mads.s.ager31e71382008-08-13 09:32:07 +0000728#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000729}
730
731
732void Code::CodeVerify() {
kasper.lund7276f142008-07-30 08:49:36 +0000733 CHECK(ic_flag() == IC_TARGET_IS_ADDRESS);
kasperl@chromium.org061ef742009-02-27 12:16:20 +0000734 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()),
735 static_cast<intptr_t>(kCodeAlignment)));
kasper.lund7276f142008-07-30 08:49:36 +0000736 Address last_gc_pc = NULL;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000737 for (RelocIterator it(this); !it.done(); it.next()) {
738 it.rinfo()->Verify();
kasper.lund7276f142008-07-30 08:49:36 +0000739 // Ensure that GC will not iterate twice over the same pointer.
ager@chromium.org236ad962008-09-25 09:45:57 +0000740 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) {
kasper.lund7276f142008-07-30 08:49:36 +0000741 CHECK(it.rinfo()->pc() != last_gc_pc);
742 last_gc_pc = it.rinfo()->pc();
743 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000744 }
745}
746
747
748void JSArray::JSArrayVerify() {
749 JSObjectVerify();
750 ASSERT(length()->IsNumber() || length()->IsUndefined());
751 ASSERT(elements()->IsUndefined() || elements()->IsFixedArray());
752}
753
754
ager@chromium.org236ad962008-09-25 09:45:57 +0000755void JSRegExp::JSRegExpVerify() {
756 JSObjectVerify();
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +0000757 ASSERT(data()->IsUndefined() || data()->IsFixedArray());
758 switch (TypeTag()) {
759 case JSRegExp::ATOM: {
760 FixedArray* arr = FixedArray::cast(data());
761 ASSERT(arr->get(JSRegExp::kAtomPatternIndex)->IsString());
762 break;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000763 }
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000764 case JSRegExp::IRREGEXP: {
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000765 bool is_native = RegExpImpl::UsesNativeRegExp();
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000766
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000767 FixedArray* arr = FixedArray::cast(data());
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000768 Object* ascii_data = arr->get(JSRegExp::kIrregexpASCIICodeIndex);
769 ASSERT(ascii_data->IsTheHole()
770 || (is_native ? ascii_data->IsCode() : ascii_data->IsByteArray()));
771 Object* uc16_data = arr->get(JSRegExp::kIrregexpUC16CodeIndex);
772 ASSERT(uc16_data->IsTheHole()
773 || (is_native ? uc16_data->IsCode() : uc16_data->IsByteArray()));
774 ASSERT(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi());
775 ASSERT(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi());
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +0000776 break;
777 }
778 default:
779 ASSERT_EQ(JSRegExp::NOT_COMPILED, TypeTag());
780 ASSERT(data()->IsUndefined());
781 break;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000782 }
ager@chromium.org236ad962008-09-25 09:45:57 +0000783}
784
785
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000786void Proxy::ProxyPrint() {
787 PrintF("proxy to %p", proxy());
788}
789
790
791void Proxy::ProxyVerify() {
792 ASSERT(IsProxy());
793}
794
795
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000796void AccessorInfo::AccessorInfoVerify() {
797 CHECK(IsAccessorInfo());
798 VerifyPointer(getter());
799 VerifyPointer(setter());
800 VerifyPointer(name());
801 VerifyPointer(data());
802 VerifyPointer(flag());
803}
804
805void AccessorInfo::AccessorInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000806 HeapObject::PrintHeader("AccessorInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000807 PrintF("\n - getter: ");
808 getter()->ShortPrint();
809 PrintF("\n - setter: ");
810 setter()->ShortPrint();
811 PrintF("\n - name: ");
812 name()->ShortPrint();
813 PrintF("\n - data: ");
814 data()->ShortPrint();
815 PrintF("\n - flag: ");
816 flag()->ShortPrint();
817}
818
819void AccessCheckInfo::AccessCheckInfoVerify() {
820 CHECK(IsAccessCheckInfo());
821 VerifyPointer(named_callback());
822 VerifyPointer(indexed_callback());
823 VerifyPointer(data());
824}
825
826void AccessCheckInfo::AccessCheckInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000827 HeapObject::PrintHeader("AccessCheckInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000828 PrintF("\n - named_callback: ");
829 named_callback()->ShortPrint();
830 PrintF("\n - indexed_callback: ");
831 indexed_callback()->ShortPrint();
832 PrintF("\n - data: ");
833 data()->ShortPrint();
834}
835
836void InterceptorInfo::InterceptorInfoVerify() {
837 CHECK(IsInterceptorInfo());
838 VerifyPointer(getter());
839 VerifyPointer(setter());
840 VerifyPointer(query());
841 VerifyPointer(deleter());
842 VerifyPointer(enumerator());
843 VerifyPointer(data());
844}
845
846void InterceptorInfo::InterceptorInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000847 HeapObject::PrintHeader("InterceptorInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000848 PrintF("\n - getter: ");
849 getter()->ShortPrint();
850 PrintF("\n - setter: ");
851 setter()->ShortPrint();
852 PrintF("\n - query: ");
853 query()->ShortPrint();
854 PrintF("\n - deleter: ");
855 deleter()->ShortPrint();
856 PrintF("\n - enumerator: ");
857 enumerator()->ShortPrint();
858 PrintF("\n - data: ");
859 data()->ShortPrint();
860}
861
862void CallHandlerInfo::CallHandlerInfoVerify() {
863 CHECK(IsCallHandlerInfo());
864 VerifyPointer(callback());
865 VerifyPointer(data());
866}
867
868void CallHandlerInfo::CallHandlerInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000869 HeapObject::PrintHeader("CallHandlerInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000870 PrintF("\n - callback: ");
871 callback()->ShortPrint();
872 PrintF("\n - data: ");
873 data()->ShortPrint();
874}
875
876void TemplateInfo::TemplateInfoVerify() {
877 VerifyPointer(tag());
878 VerifyPointer(property_list());
879}
880
881void FunctionTemplateInfo::FunctionTemplateInfoVerify() {
882 CHECK(IsFunctionTemplateInfo());
883 TemplateInfoVerify();
884 VerifyPointer(serial_number());
885 VerifyPointer(call_code());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000886 VerifyPointer(property_accessors());
887 VerifyPointer(prototype_template());
888 VerifyPointer(parent_template());
889 VerifyPointer(named_property_handler());
890 VerifyPointer(indexed_property_handler());
891 VerifyPointer(instance_template());
892 VerifyPointer(signature());
893 VerifyPointer(access_check_info());
894}
895
896void FunctionTemplateInfo::FunctionTemplateInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000897 HeapObject::PrintHeader("FunctionTemplateInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000898 PrintF("\n - tag: ");
899 tag()->ShortPrint();
900 PrintF("\n - property_list: ");
901 property_list()->ShortPrint();
902 PrintF("\n - serial_number: ");
903 serial_number()->ShortPrint();
904 PrintF("\n - call_code: ");
905 call_code()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000906 PrintF("\n - property_accessors: ");
907 property_accessors()->ShortPrint();
908 PrintF("\n - prototype_template: ");
909 prototype_template()->ShortPrint();
910 PrintF("\n - parent_template: ");
911 parent_template()->ShortPrint();
912 PrintF("\n - named_property_handler: ");
913 named_property_handler()->ShortPrint();
914 PrintF("\n - indexed_property_handler: ");
915 indexed_property_handler()->ShortPrint();
916 PrintF("\n - instance_template: ");
917 instance_template()->ShortPrint();
918 PrintF("\n - signature: ");
919 signature()->ShortPrint();
920 PrintF("\n - access_check_info: ");
921 access_check_info()->ShortPrint();
922 PrintF("\n - hidden_prototype: %s", hidden_prototype() ? "true" : "false");
923 PrintF("\n - undetectable: %s", undetectable() ? "true" : "false");
924 PrintF("\n - need_access_check: %s", needs_access_check() ? "true" : "false");
925}
926
927void ObjectTemplateInfo::ObjectTemplateInfoVerify() {
928 CHECK(IsObjectTemplateInfo());
929 TemplateInfoVerify();
930 VerifyPointer(constructor());
kasper.lund212ac232008-07-16 07:07:30 +0000931 VerifyPointer(internal_field_count());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000932}
933
934void ObjectTemplateInfo::ObjectTemplateInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000935 HeapObject::PrintHeader("ObjectTemplateInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000936 PrintF("\n - constructor: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000937 constructor()->ShortPrint();
kasper.lund212ac232008-07-16 07:07:30 +0000938 PrintF("\n - internal_field_count: ");
939 internal_field_count()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000940}
941
942void SignatureInfo::SignatureInfoVerify() {
943 CHECK(IsSignatureInfo());
944 VerifyPointer(receiver());
945 VerifyPointer(args());
946}
947
948void SignatureInfo::SignatureInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000949 HeapObject::PrintHeader("SignatureInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000950 PrintF("\n - receiver: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000951 receiver()->ShortPrint();
kasper.lund212ac232008-07-16 07:07:30 +0000952 PrintF("\n - args: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000953 args()->ShortPrint();
954}
955
956void TypeSwitchInfo::TypeSwitchInfoVerify() {
957 CHECK(IsTypeSwitchInfo());
958 VerifyPointer(types());
959}
960
961void TypeSwitchInfo::TypeSwitchInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000962 HeapObject::PrintHeader("TypeSwitchInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000963 PrintF("\n - types: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000964 types()->ShortPrint();
965}
966
967
968void Script::ScriptVerify() {
969 CHECK(IsScript());
970 VerifyPointer(source());
971 VerifyPointer(name());
972 line_offset()->SmiVerify();
973 column_offset()->SmiVerify();
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000974 VerifyPointer(data());
975 VerifyPointer(wrapper());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000976 type()->SmiVerify();
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000977 VerifyPointer(line_ends());
978 VerifyPointer(id());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000979}
980
981
982void Script::ScriptPrint() {
983 HeapObject::PrintHeader("Script");
984 PrintF("\n - source: ");
985 source()->ShortPrint();
986 PrintF("\n - name: ");
987 name()->ShortPrint();
988 PrintF("\n - line_offset: ");
989 line_offset()->ShortPrint();
990 PrintF("\n - column_offset: ");
991 column_offset()->ShortPrint();
992 PrintF("\n - type: ");
993 type()->ShortPrint();
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000994 PrintF("\n - id: ");
995 id()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000996 PrintF("\n");
997}
998
999
kasperl@chromium.orge959c182009-07-27 08:59:04 +00001000#ifdef ENABLE_DEBUGGER_SUPPORT
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001001void DebugInfo::DebugInfoVerify() {
1002 CHECK(IsDebugInfo());
1003 VerifyPointer(shared());
1004 VerifyPointer(original_code());
1005 VerifyPointer(code());
1006 VerifyPointer(break_points());
1007}
1008
1009
1010void DebugInfo::DebugInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +00001011 HeapObject::PrintHeader("DebugInfo");
1012 PrintF("\n - shared: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001013 shared()->ShortPrint();
ager@chromium.org381abbb2009-02-25 13:23:22 +00001014 PrintF("\n - original_code: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001015 original_code()->ShortPrint();
ager@chromium.org381abbb2009-02-25 13:23:22 +00001016 PrintF("\n - code: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001017 code()->ShortPrint();
ager@chromium.org381abbb2009-02-25 13:23:22 +00001018 PrintF("\n - break_points: ");
1019 break_points()->Print();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001020}
1021
1022
1023void BreakPointInfo::BreakPointInfoVerify() {
1024 CHECK(IsBreakPointInfo());
1025 code_position()->SmiVerify();
1026 source_position()->SmiVerify();
1027 statement_position()->SmiVerify();
1028 VerifyPointer(break_point_objects());
1029}
1030
1031
1032void BreakPointInfo::BreakPointInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +00001033 HeapObject::PrintHeader("BreakPointInfo");
1034 PrintF("\n - code_position: %d", code_position());
1035 PrintF("\n - source_position: %d", source_position());
1036 PrintF("\n - statement_position: %d", statement_position());
1037 PrintF("\n - break_point_objects: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001038 break_point_objects()->ShortPrint();
1039}
kasperl@chromium.orge959c182009-07-27 08:59:04 +00001040#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001041
1042
1043void JSObject::IncrementSpillStatistics(SpillInformation* info) {
1044 info->number_of_objects_++;
1045 // Named properties
1046 if (HasFastProperties()) {
1047 info->number_of_objects_with_fast_properties_++;
1048 info->number_of_fast_used_fields_ += map()->NextFreePropertyIndex();
1049 info->number_of_fast_unused_fields_ += map()->unused_property_fields();
1050 } else {
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00001051 StringDictionary* dict = property_dictionary();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001052 info->number_of_slow_used_properties_ += dict->NumberOfElements();
1053 info->number_of_slow_unused_properties_ +=
1054 dict->Capacity() - dict->NumberOfElements();
1055 }
1056 // Indexed properties
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001057 switch (GetElementsKind()) {
1058 case FAST_ELEMENTS: {
1059 info->number_of_objects_with_fast_elements_++;
1060 int holes = 0;
1061 FixedArray* e = FixedArray::cast(elements());
1062 int len = e->length();
1063 for (int i = 0; i < len; i++) {
1064 if (e->get(i) == Heap::the_hole_value()) holes++;
1065 }
1066 info->number_of_fast_used_elements_ += len - holes;
1067 info->number_of_fast_unused_elements_ += holes;
1068 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001069 }
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001070 case PIXEL_ELEMENTS: {
1071 info->number_of_objects_with_fast_elements_++;
1072 PixelArray* e = PixelArray::cast(elements());
1073 info->number_of_fast_used_elements_ += e->length();
1074 break;
1075 }
1076 case DICTIONARY_ELEMENTS: {
1077 NumberDictionary* dict = element_dictionary();
1078 info->number_of_slow_used_elements_ += dict->NumberOfElements();
1079 info->number_of_slow_unused_elements_ +=
1080 dict->Capacity() - dict->NumberOfElements();
1081 break;
1082 }
1083 default:
1084 UNREACHABLE();
1085 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001086 }
1087}
1088
1089
1090void JSObject::SpillInformation::Clear() {
1091 number_of_objects_ = 0;
1092 number_of_objects_with_fast_properties_ = 0;
1093 number_of_objects_with_fast_elements_ = 0;
1094 number_of_fast_used_fields_ = 0;
1095 number_of_fast_unused_fields_ = 0;
1096 number_of_slow_used_properties_ = 0;
1097 number_of_slow_unused_properties_ = 0;
1098 number_of_fast_used_elements_ = 0;
1099 number_of_fast_unused_elements_ = 0;
1100 number_of_slow_used_elements_ = 0;
1101 number_of_slow_unused_elements_ = 0;
1102}
1103
1104void JSObject::SpillInformation::Print() {
1105 PrintF("\n JSObject Spill Statistics (#%d):\n", number_of_objects_);
1106
1107 PrintF(" - fast properties (#%d): %d (used) %d (unused)\n",
1108 number_of_objects_with_fast_properties_,
1109 number_of_fast_used_fields_, number_of_fast_unused_fields_);
1110
1111 PrintF(" - slow properties (#%d): %d (used) %d (unused)\n",
1112 number_of_objects_ - number_of_objects_with_fast_properties_,
1113 number_of_slow_used_properties_, number_of_slow_unused_properties_);
1114
1115 PrintF(" - fast elements (#%d): %d (used) %d (unused)\n",
1116 number_of_objects_with_fast_elements_,
1117 number_of_fast_used_elements_, number_of_fast_unused_elements_);
1118
1119 PrintF(" - slow elements (#%d): %d (used) %d (unused)\n",
1120 number_of_objects_ - number_of_objects_with_fast_elements_,
1121 number_of_slow_used_elements_, number_of_slow_unused_elements_);
1122
1123 PrintF("\n");
1124}
1125
1126
1127void DescriptorArray::PrintDescriptors() {
1128 PrintF("Descriptor array %d\n", number_of_descriptors());
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00001129 for (int i = 0; i < number_of_descriptors(); i++) {
1130 PrintF(" %d: ", i);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001131 Descriptor desc;
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00001132 Get(i, &desc);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001133 desc.Print();
1134 }
1135 PrintF("\n");
1136}
1137
1138
mads.s.ager@gmail.com769cc962008-08-06 10:02:49 +00001139bool DescriptorArray::IsSortedNoDuplicates() {
1140 String* current_key = NULL;
1141 uint32_t current = 0;
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00001142 for (int i = 0; i < number_of_descriptors(); i++) {
1143 String* key = GetKey(i);
mads.s.ager@gmail.com769cc962008-08-06 10:02:49 +00001144 if (key == current_key) {
1145 PrintDescriptors();
1146 return false;
1147 }
1148 current_key = key;
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00001149 uint32_t hash = GetKey(i)->Hash();
mads.s.ager@gmail.com769cc962008-08-06 10:02:49 +00001150 if (hash < current) {
1151 PrintDescriptors();
1152 return false;
1153 }
1154 current = hash;
1155 }
1156 return true;
1157}
1158
1159
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001160#endif // DEBUG
1161
1162} } // namespace v8::internal