blob: ba07af7e0134cc0b70d09772fcd41e8b9c23dc96 [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;
118 case FILLER_TYPE:
119 PrintF("filler");
120 break;
121 case JS_OBJECT_TYPE: // fall through
ager@chromium.org32912102009-01-16 10:38:43 +0000122 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000123 case JS_ARRAY_TYPE:
ager@chromium.org236ad962008-09-25 09:45:57 +0000124 case JS_REGEXP_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000125 JSObject::cast(this)->JSObjectPrint();
126 break;
127 case ODDBALL_TYPE:
128 Oddball::cast(this)->to_string()->Print();
129 break;
130 case JS_FUNCTION_TYPE:
131 JSFunction::cast(this)->JSFunctionPrint();
132 break;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000133 case JS_GLOBAL_PROXY_TYPE:
134 JSGlobalProxy::cast(this)->JSGlobalProxyPrint();
135 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000136 case JS_GLOBAL_OBJECT_TYPE:
137 JSGlobalObject::cast(this)->JSGlobalObjectPrint();
138 break;
139 case JS_BUILTINS_OBJECT_TYPE:
140 JSBuiltinsObject::cast(this)->JSBuiltinsObjectPrint();
141 break;
142 case JS_VALUE_TYPE:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000143 PrintF("Value wrapper around:");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000144 JSValue::cast(this)->value()->Print();
145 break;
146 case CODE_TYPE:
147 Code::cast(this)->CodePrint();
148 break;
149 case PROXY_TYPE:
150 Proxy::cast(this)->ProxyPrint();
151 break;
152 case SHARED_FUNCTION_INFO_TYPE:
153 SharedFunctionInfo::cast(this)->SharedFunctionInfoPrint();
154 break;
155
156#define MAKE_STRUCT_CASE(NAME, Name, name) \
157 case NAME##_TYPE: \
158 Name::cast(this)->Name##Print(); \
159 break;
160 STRUCT_LIST(MAKE_STRUCT_CASE)
161#undef MAKE_STRUCT_CASE
162
163 default:
164 PrintF("UNKNOWN TYPE %d", map()->instance_type());
165 UNREACHABLE();
166 break;
167 }
168}
169
170
171void HeapObject::HeapObjectVerify() {
172 InstanceType instance_type = map()->instance_type();
173
174 if (instance_type < FIRST_NONSTRING_TYPE) {
175 String::cast(this)->StringVerify();
176 return;
177 }
178
179 switch (instance_type) {
180 case MAP_TYPE:
181 Map::cast(this)->MapVerify();
182 break;
183 case HEAP_NUMBER_TYPE:
184 HeapNumber::cast(this)->HeapNumberVerify();
185 break;
186 case FIXED_ARRAY_TYPE:
187 FixedArray::cast(this)->FixedArrayVerify();
188 break;
189 case BYTE_ARRAY_TYPE:
190 ByteArray::cast(this)->ByteArrayVerify();
191 break;
192 case CODE_TYPE:
193 Code::cast(this)->CodeVerify();
194 break;
195 case ODDBALL_TYPE:
196 Oddball::cast(this)->OddballVerify();
197 break;
198 case JS_OBJECT_TYPE:
ager@chromium.org32912102009-01-16 10:38:43 +0000199 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000200 JSObject::cast(this)->JSObjectVerify();
201 break;
202 case JS_VALUE_TYPE:
203 JSValue::cast(this)->JSValueVerify();
204 break;
205 case JS_FUNCTION_TYPE:
206 JSFunction::cast(this)->JSFunctionVerify();
207 break;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000208 case JS_GLOBAL_PROXY_TYPE:
209 JSGlobalProxy::cast(this)->JSGlobalProxyVerify();
210 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000211 case JS_GLOBAL_OBJECT_TYPE:
212 JSGlobalObject::cast(this)->JSGlobalObjectVerify();
213 break;
214 case JS_BUILTINS_OBJECT_TYPE:
215 JSBuiltinsObject::cast(this)->JSBuiltinsObjectVerify();
216 break;
217 case JS_ARRAY_TYPE:
218 JSArray::cast(this)->JSArrayVerify();
219 break;
ager@chromium.org236ad962008-09-25 09:45:57 +0000220 case JS_REGEXP_TYPE:
221 JSRegExp::cast(this)->JSRegExpVerify();
222 break;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000223 case FILLER_TYPE:
224 break;
225 case PROXY_TYPE:
226 Proxy::cast(this)->ProxyVerify();
227 break;
228 case SHARED_FUNCTION_INFO_TYPE:
229 SharedFunctionInfo::cast(this)->SharedFunctionInfoVerify();
230 break;
231
232#define MAKE_STRUCT_CASE(NAME, Name, name) \
233 case NAME##_TYPE: \
234 Name::cast(this)->Name##Verify(); \
235 break;
236 STRUCT_LIST(MAKE_STRUCT_CASE)
237#undef MAKE_STRUCT_CASE
238
239 default:
240 UNREACHABLE();
241 break;
242 }
243}
244
245
246void HeapObject::VerifyHeapPointer(Object* p) {
247 ASSERT(p->IsHeapObject());
248 ASSERT(Heap::Contains(HeapObject::cast(p)));
249}
250
251
252void HeapNumber::HeapNumberVerify() {
253 ASSERT(IsHeapNumber());
254}
255
256
257void ByteArray::ByteArrayPrint() {
258 PrintF("byte array, data starts at %p", GetDataStartAddress());
259}
260
261
262void ByteArray::ByteArrayVerify() {
263 ASSERT(IsByteArray());
264}
265
266
267void JSObject::PrintProperties() {
268 if (HasFastProperties()) {
269 for (DescriptorReader r(map()->instance_descriptors());
270 !r.eos();
271 r.advance()) {
272 PrintF(" ");
273 r.GetKey()->StringPrint();
274 PrintF(": ");
275 if (r.type() == FIELD) {
ager@chromium.org7c537e22008-10-16 08:43:32 +0000276 FastPropertyAt(r.GetFieldIndex())->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000277 PrintF(" (field at offset %d)\n", r.GetFieldIndex());
278 } else if (r.type() == CONSTANT_FUNCTION) {
279 r.GetConstantFunction()->ShortPrint();
280 PrintF(" (constant function)\n");
281 } else if (r.type() == CALLBACKS) {
282 r.GetCallbacksObject()->ShortPrint();
283 PrintF(" (callback)\n");
284 } else if (r.type() == MAP_TRANSITION) {
285 PrintF(" (map transition)\n");
ager@chromium.orgddb913d2009-01-27 10:01:48 +0000286 } else if (r.type() == CONSTANT_TRANSITION) {
287 PrintF(" (constant transition)\n");
288 } else if (r.type() == NULL_DESCRIPTOR) {
289 PrintF(" (null descriptor)\n");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000290 } else {
291 UNREACHABLE();
292 }
293 }
294 } else {
295 property_dictionary()->Print();
296 }
297}
298
299
300void JSObject::PrintElements() {
301 if (HasFastElements()) {
302 FixedArray* p = FixedArray::cast(elements());
303 for (int i = 0; i < p->length(); i++) {
304 PrintF(" %d: ", i);
305 p->get(i)->ShortPrint();
306 PrintF("\n");
307 }
308 } else {
309 elements()->Print();
310 }
311}
312
313
314void JSObject::JSObjectPrint() {
315 PrintF("%p: [JSObject]\n", this);
316 PrintF(" - map = %p\n", map());
317 PrintF(" - prototype = %p\n", GetPrototype());
318 PrintF(" {\n");
319 PrintProperties();
320 PrintElements();
321 PrintF(" }\n");
322}
323
324
325void JSObject::JSObjectVerify() {
326 VerifyHeapPointer(properties());
327 VerifyHeapPointer(elements());
328 if (HasFastProperties()) {
329 CHECK(map()->unused_property_fields() ==
ager@chromium.org7c537e22008-10-16 08:43:32 +0000330 (map()->inobject_properties() + properties()->length() -
331 map()->NextFreePropertyIndex()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000332 }
333}
334
335
336static const char* TypeToString(InstanceType type) {
337 switch (type) {
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +0000338 case INVALID_TYPE: return "INVALID";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000339 case MAP_TYPE: return "MAP";
340 case HEAP_NUMBER_TYPE: return "HEAP_NUMBER";
341 case SHORT_SYMBOL_TYPE:
342 case MEDIUM_SYMBOL_TYPE:
343 case LONG_SYMBOL_TYPE: return "SYMBOL";
344 case SHORT_ASCII_SYMBOL_TYPE:
345 case MEDIUM_ASCII_SYMBOL_TYPE:
346 case LONG_ASCII_SYMBOL_TYPE: return "ASCII_SYMBOL";
347 case SHORT_SLICED_SYMBOL_TYPE:
348 case MEDIUM_SLICED_SYMBOL_TYPE:
349 case LONG_SLICED_SYMBOL_TYPE: return "SLICED_SYMBOL";
350 case SHORT_SLICED_ASCII_SYMBOL_TYPE:
351 case MEDIUM_SLICED_ASCII_SYMBOL_TYPE:
352 case LONG_SLICED_ASCII_SYMBOL_TYPE: return "SLICED_ASCII_SYMBOL";
353 case SHORT_CONS_SYMBOL_TYPE:
354 case MEDIUM_CONS_SYMBOL_TYPE:
355 case LONG_CONS_SYMBOL_TYPE: return "CONS_SYMBOL";
356 case SHORT_CONS_ASCII_SYMBOL_TYPE:
357 case MEDIUM_CONS_ASCII_SYMBOL_TYPE:
358 case LONG_CONS_ASCII_SYMBOL_TYPE: return "CONS_ASCII_SYMBOL";
359 case SHORT_EXTERNAL_ASCII_SYMBOL_TYPE:
360 case MEDIUM_EXTERNAL_ASCII_SYMBOL_TYPE:
361 case LONG_EXTERNAL_ASCII_SYMBOL_TYPE:
362 case SHORT_EXTERNAL_SYMBOL_TYPE:
363 case MEDIUM_EXTERNAL_SYMBOL_TYPE:
364 case LONG_EXTERNAL_SYMBOL_TYPE: return "EXTERNAL_SYMBOL";
365 case SHORT_ASCII_STRING_TYPE:
366 case MEDIUM_ASCII_STRING_TYPE:
367 case LONG_ASCII_STRING_TYPE: return "ASCII_STRING";
368 case SHORT_STRING_TYPE:
369 case MEDIUM_STRING_TYPE:
370 case LONG_STRING_TYPE: return "TWO_BYTE_STRING";
371 case SHORT_CONS_STRING_TYPE:
372 case MEDIUM_CONS_STRING_TYPE:
373 case LONG_CONS_STRING_TYPE:
374 case SHORT_CONS_ASCII_STRING_TYPE:
375 case MEDIUM_CONS_ASCII_STRING_TYPE:
376 case LONG_CONS_ASCII_STRING_TYPE: return "CONS_STRING";
377 case SHORT_SLICED_STRING_TYPE:
378 case MEDIUM_SLICED_STRING_TYPE:
379 case LONG_SLICED_STRING_TYPE:
380 case SHORT_SLICED_ASCII_STRING_TYPE:
381 case MEDIUM_SLICED_ASCII_STRING_TYPE:
382 case LONG_SLICED_ASCII_STRING_TYPE: return "SLICED_STRING";
383 case SHORT_EXTERNAL_ASCII_STRING_TYPE:
384 case MEDIUM_EXTERNAL_ASCII_STRING_TYPE:
385 case LONG_EXTERNAL_ASCII_STRING_TYPE:
386 case SHORT_EXTERNAL_STRING_TYPE:
387 case MEDIUM_EXTERNAL_STRING_TYPE:
388 case LONG_EXTERNAL_STRING_TYPE: return "EXTERNAL_STRING";
389 case FIXED_ARRAY_TYPE: return "FIXED_ARRAY";
390 case BYTE_ARRAY_TYPE: return "BYTE_ARRAY";
391 case FILLER_TYPE: return "FILLER";
392 case JS_OBJECT_TYPE: return "JS_OBJECT";
ager@chromium.org32912102009-01-16 10:38:43 +0000393 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: return "JS_CONTEXT_EXTENSION_OBJECT";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000394 case ODDBALL_TYPE: return "ODDBALL";
395 case SHARED_FUNCTION_INFO_TYPE: return "SHARED_FUNCTION_INFO";
396 case JS_FUNCTION_TYPE: return "JS_FUNCTION";
397 case CODE_TYPE: return "CODE";
398 case JS_ARRAY_TYPE: return "JS_ARRAY";
ager@chromium.org236ad962008-09-25 09:45:57 +0000399 case JS_REGEXP_TYPE: return "JS_REGEXP";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000400 case JS_VALUE_TYPE: return "JS_VALUE";
401 case JS_GLOBAL_OBJECT_TYPE: return "JS_GLOBAL_OBJECT";
402 case JS_BUILTINS_OBJECT_TYPE: return "JS_BUILTINS_OBJECT";
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000403 case JS_GLOBAL_PROXY_TYPE: return "JS_GLOBAL_PROXY";
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000404 case PROXY_TYPE: return "PROXY";
405 case SMI_TYPE: return "SMI";
406#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return #NAME;
407 STRUCT_LIST(MAKE_STRUCT_CASE)
408#undef MAKE_STRUCT_CASE
409 }
410 return "UNKNOWN";
411}
412
413
414void Map::MapPrint() {
415 HeapObject::PrintHeader("Map");
416 PrintF(" - type: %s\n", TypeToString(instance_type()));
417 PrintF(" - instance size: %d\n", instance_size());
418 PrintF(" - unused property fields: %d\n", unused_property_fields());
ager@chromium.orgddb913d2009-01-27 10:01:48 +0000419 if (is_hidden_prototype()) {
420 PrintF(" - hidden_prototype\n");
421 }
422 if (has_named_interceptor()) {
423 PrintF(" - named_interceptor\n");
424 }
425 if (has_indexed_interceptor()) {
426 PrintF(" - indexed_interceptor\n");
427 }
428 if (is_undetectable()) {
429 PrintF(" - undetectable\n");
430 }
431 if (has_instance_call_handler()) {
432 PrintF(" - instance_call_handler\n");
433 }
434 if (is_access_check_needed()) {
435 PrintF(" - access_check_needed\n");
436 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000437 PrintF(" - instance descriptors: ");
438 instance_descriptors()->ShortPrint();
439 PrintF("\n - prototype: ");
440 prototype()->ShortPrint();
441 PrintF("\n - constructor: ");
442 constructor()->ShortPrint();
443 PrintF("\n");
444}
445
446
447void Map::MapVerify() {
448 ASSERT(!Heap::InNewSpace(this));
449 ASSERT(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE);
450 ASSERT(kPointerSize <= instance_size()
451 && instance_size() < Heap::Capacity());
452 VerifyHeapPointer(prototype());
453 VerifyHeapPointer(instance_descriptors());
454}
455
456
457void FixedArray::FixedArrayPrint() {
458 HeapObject::PrintHeader("FixedArray");
459 PrintF(" - length: %d", length());
460 for (int i = 0; i < length(); i++) {
461 PrintF("\n [%d]: ", i);
462 get(i)->ShortPrint();
463 }
464 PrintF("\n");
465}
466
467
468void FixedArray::FixedArrayVerify() {
469 for (int i = 0; i < length(); i++) {
470 Object* e = get(i);
471 if (e->IsHeapObject()) {
472 VerifyHeapPointer(e);
473 } else {
474 e->Verify();
475 }
476 }
477}
478
479
480void JSValue::JSValuePrint() {
481 HeapObject::PrintHeader("ValueObject");
482 value()->Print();
483}
484
485
486void JSValue::JSValueVerify() {
487 Object* v = value();
488 if (v->IsHeapObject()) {
489 VerifyHeapPointer(v);
490 }
491}
492
493
494void String::StringPrint() {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000495 if (StringShape(this).IsSymbol()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000496 PrintF("#");
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000497 } else if (StringShape(this).IsCons()) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000498 PrintF("c\"");
499 } else {
500 PrintF("\"");
501 }
502
503 for (int i = 0; i < length(); i++) {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000504 PrintF("%c", Get(i));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000505 }
506
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000507 if (!StringShape(this).IsSymbol()) PrintF("\"");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000508}
509
510
511void String::StringVerify() {
512 CHECK(IsString());
513 CHECK(length() >= 0 && length() <= Smi::kMaxValue);
514 if (IsSymbol()) {
515 CHECK(!Heap::InNewSpace(this));
516 }
517}
518
519
520void JSFunction::JSFunctionPrint() {
521 HeapObject::PrintHeader("Function");
522 PrintF(" - map = 0x%p\n", map());
523 PrintF(" - is boilerplate: %s\n", IsBoilerplate() ? "yes" : "no");
524 PrintF(" - initial_map = ");
525 if (has_initial_map()) {
526 initial_map()->ShortPrint();
527 }
528 PrintF("\n - shared_info = ");
529 shared()->ShortPrint();
530 PrintF("\n - name = ");
531 shared()->name()->Print();
532 PrintF("\n - context = ");
533 unchecked_context()->ShortPrint();
534 PrintF("\n - code = ");
535 code()->ShortPrint();
536 PrintF("\n");
537
538 PrintProperties();
539 PrintElements();
540
541 PrintF("\n");
542}
543
544
545void JSFunction::JSFunctionVerify() {
546 CHECK(IsJSFunction());
547 VerifyObjectField(kPrototypeOrInitialMapOffset);
548}
549
550
551void SharedFunctionInfo::SharedFunctionInfoPrint() {
552 HeapObject::PrintHeader("SharedFunctionInfo");
553 PrintF(" - name: ");
554 name()->ShortPrint();
555 PrintF("\n - expected_nof_properties: %d", expected_nof_properties());
ager@chromium.org381abbb2009-02-25 13:23:22 +0000556 PrintF("\n - instance class name = ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000557 instance_class_name()->Print();
ager@chromium.org381abbb2009-02-25 13:23:22 +0000558 PrintF("\n - code = ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000559 code()->ShortPrint();
ager@chromium.org381abbb2009-02-25 13:23:22 +0000560 PrintF("\n - source code = ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000561 GetSourceCode()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000562 // Script files are often large, hard to read.
563 // PrintF("\n - script =");
564 // script()->Print();
565 PrintF("\n - function token position = %d", function_token_position());
566 PrintF("\n - start position = %d", start_position());
567 PrintF("\n - end position = %d", end_position());
568 PrintF("\n - is expression = %d", is_expression());
569 PrintF("\n - debug info = ");
ager@chromium.org381abbb2009-02-25 13:23:22 +0000570 debug_info()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000571 PrintF("\n - length = %d", length());
572 PrintF("\n");
573}
574
575void SharedFunctionInfo::SharedFunctionInfoVerify() {
576 CHECK(IsSharedFunctionInfo());
577 VerifyObjectField(kNameOffset);
578 VerifyObjectField(kCodeOffset);
579 VerifyObjectField(kInstanceClassNameOffset);
580 VerifyObjectField(kExternalReferenceDataOffset);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000581 VerifyObjectField(kScriptOffset);
582 VerifyObjectField(kDebugInfoOffset);
583}
584
585
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000586void JSGlobalProxy::JSGlobalProxyPrint() {
587 PrintF("global_proxy");
588 JSObjectPrint();
589 PrintF("context : ");
590 context()->ShortPrint();
591 PrintF("\n");
592}
593
594
595void JSGlobalProxy::JSGlobalProxyVerify() {
596 CHECK(IsJSGlobalProxy());
597 JSObjectVerify();
598 VerifyObjectField(JSGlobalProxy::kContextOffset);
599 // Make sure that this object has no properties, elements.
600 CHECK_EQ(0, properties()->length());
601 CHECK_EQ(0, elements()->length());
602}
603
604
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000605void JSGlobalObject::JSGlobalObjectPrint() {
606 PrintF("global ");
607 JSObjectPrint();
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000608 PrintF("global context : ");
609 global_context()->ShortPrint();
610 PrintF("\n");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000611}
612
613
614void JSGlobalObject::JSGlobalObjectVerify() {
615 CHECK(IsJSGlobalObject());
616 JSObjectVerify();
617 for (int i = GlobalObject::kBuiltinsOffset;
618 i < JSGlobalObject::kSize;
619 i += kPointerSize) {
620 VerifyObjectField(i);
621 }
622}
623
624
625void JSBuiltinsObject::JSBuiltinsObjectPrint() {
626 PrintF("builtins ");
627 JSObjectPrint();
628}
629
630
631void JSBuiltinsObject::JSBuiltinsObjectVerify() {
632 CHECK(IsJSBuiltinsObject());
633 JSObjectVerify();
634 for (int i = GlobalObject::kBuiltinsOffset;
635 i < JSBuiltinsObject::kSize;
636 i += kPointerSize) {
637 VerifyObjectField(i);
638 }
639}
640
641
642void Oddball::OddballVerify() {
643 CHECK(IsOddball());
644 VerifyHeapPointer(to_string());
645 Object* number = to_number();
646 if (number->IsHeapObject()) {
647 ASSERT(number == Heap::nan_value());
648 } else {
649 ASSERT(number->IsSmi());
650 int value = Smi::cast(number)->value();
651 ASSERT(value == 0 || value == 1 || value == -1);
652 }
653}
654
655
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000656void Code::CodePrint() {
657 HeapObject::PrintHeader("Code");
mads.s.ager31e71382008-08-13 09:32:07 +0000658#ifdef ENABLE_DISASSEMBLER
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000659 Disassemble(NULL);
mads.s.ager31e71382008-08-13 09:32:07 +0000660#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000661}
662
663
664void Code::CodeVerify() {
kasper.lund7276f142008-07-30 08:49:36 +0000665 CHECK(ic_flag() == IC_TARGET_IS_ADDRESS);
kasperl@chromium.org061ef742009-02-27 12:16:20 +0000666 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()),
667 static_cast<intptr_t>(kCodeAlignment)));
kasper.lund7276f142008-07-30 08:49:36 +0000668 Address last_gc_pc = NULL;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000669 for (RelocIterator it(this); !it.done(); it.next()) {
670 it.rinfo()->Verify();
kasper.lund7276f142008-07-30 08:49:36 +0000671 // Ensure that GC will not iterate twice over the same pointer.
ager@chromium.org236ad962008-09-25 09:45:57 +0000672 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) {
kasper.lund7276f142008-07-30 08:49:36 +0000673 CHECK(it.rinfo()->pc() != last_gc_pc);
674 last_gc_pc = it.rinfo()->pc();
675 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000676 }
677}
678
679
680void JSArray::JSArrayVerify() {
681 JSObjectVerify();
682 ASSERT(length()->IsNumber() || length()->IsUndefined());
683 ASSERT(elements()->IsUndefined() || elements()->IsFixedArray());
684}
685
686
ager@chromium.org236ad962008-09-25 09:45:57 +0000687void JSRegExp::JSRegExpVerify() {
688 JSObjectVerify();
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +0000689 ASSERT(data()->IsUndefined() || data()->IsFixedArray());
690 switch (TypeTag()) {
691 case JSRegExp::ATOM: {
692 FixedArray* arr = FixedArray::cast(data());
693 ASSERT(arr->get(JSRegExp::kAtomPatternIndex)->IsString());
694 break;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000695 }
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000696 case JSRegExp::IRREGEXP: {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000697 bool is_native = RegExpImpl::UseNativeRegexp();
698
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000699 FixedArray* arr = FixedArray::cast(data());
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000700 Object* ascii_data = arr->get(JSRegExp::kIrregexpASCIICodeIndex);
701 ASSERT(ascii_data->IsTheHole()
702 || (is_native ? ascii_data->IsCode() : ascii_data->IsByteArray()));
703 Object* uc16_data = arr->get(JSRegExp::kIrregexpUC16CodeIndex);
704 ASSERT(uc16_data->IsTheHole()
705 || (is_native ? uc16_data->IsCode() : uc16_data->IsByteArray()));
706 ASSERT(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi());
707 ASSERT(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi());
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +0000708 break;
709 }
710 default:
711 ASSERT_EQ(JSRegExp::NOT_COMPILED, TypeTag());
712 ASSERT(data()->IsUndefined());
713 break;
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000714 }
ager@chromium.org236ad962008-09-25 09:45:57 +0000715}
716
717
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000718void Proxy::ProxyPrint() {
719 PrintF("proxy to %p", proxy());
720}
721
722
723void Proxy::ProxyVerify() {
724 ASSERT(IsProxy());
725}
726
727
728void Dictionary::Print() {
729 int capacity = Capacity();
730 for (int i = 0; i < capacity; i++) {
731 Object* k = KeyAt(i);
732 if (IsKey(k)) {
733 PrintF(" ");
734 if (k->IsString()) {
735 String::cast(k)->StringPrint();
736 } else {
737 k->ShortPrint();
738 }
739 PrintF(": ");
740 ValueAt(i)->ShortPrint();
741 PrintF("\n");
742 }
743 }
744}
745
746
747void AccessorInfo::AccessorInfoVerify() {
748 CHECK(IsAccessorInfo());
749 VerifyPointer(getter());
750 VerifyPointer(setter());
751 VerifyPointer(name());
752 VerifyPointer(data());
753 VerifyPointer(flag());
754}
755
756void AccessorInfo::AccessorInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000757 HeapObject::PrintHeader("AccessorInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000758 PrintF("\n - getter: ");
759 getter()->ShortPrint();
760 PrintF("\n - setter: ");
761 setter()->ShortPrint();
762 PrintF("\n - name: ");
763 name()->ShortPrint();
764 PrintF("\n - data: ");
765 data()->ShortPrint();
766 PrintF("\n - flag: ");
767 flag()->ShortPrint();
768}
769
770void AccessCheckInfo::AccessCheckInfoVerify() {
771 CHECK(IsAccessCheckInfo());
772 VerifyPointer(named_callback());
773 VerifyPointer(indexed_callback());
774 VerifyPointer(data());
775}
776
777void AccessCheckInfo::AccessCheckInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000778 HeapObject::PrintHeader("AccessCheckInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000779 PrintF("\n - named_callback: ");
780 named_callback()->ShortPrint();
781 PrintF("\n - indexed_callback: ");
782 indexed_callback()->ShortPrint();
783 PrintF("\n - data: ");
784 data()->ShortPrint();
785}
786
787void InterceptorInfo::InterceptorInfoVerify() {
788 CHECK(IsInterceptorInfo());
789 VerifyPointer(getter());
790 VerifyPointer(setter());
791 VerifyPointer(query());
792 VerifyPointer(deleter());
793 VerifyPointer(enumerator());
794 VerifyPointer(data());
795}
796
797void InterceptorInfo::InterceptorInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000798 HeapObject::PrintHeader("InterceptorInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000799 PrintF("\n - getter: ");
800 getter()->ShortPrint();
801 PrintF("\n - setter: ");
802 setter()->ShortPrint();
803 PrintF("\n - query: ");
804 query()->ShortPrint();
805 PrintF("\n - deleter: ");
806 deleter()->ShortPrint();
807 PrintF("\n - enumerator: ");
808 enumerator()->ShortPrint();
809 PrintF("\n - data: ");
810 data()->ShortPrint();
811}
812
813void CallHandlerInfo::CallHandlerInfoVerify() {
814 CHECK(IsCallHandlerInfo());
815 VerifyPointer(callback());
816 VerifyPointer(data());
817}
818
819void CallHandlerInfo::CallHandlerInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000820 HeapObject::PrintHeader("CallHandlerInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000821 PrintF("\n - callback: ");
822 callback()->ShortPrint();
823 PrintF("\n - data: ");
824 data()->ShortPrint();
825}
826
827void TemplateInfo::TemplateInfoVerify() {
828 VerifyPointer(tag());
829 VerifyPointer(property_list());
830}
831
832void FunctionTemplateInfo::FunctionTemplateInfoVerify() {
833 CHECK(IsFunctionTemplateInfo());
834 TemplateInfoVerify();
835 VerifyPointer(serial_number());
836 VerifyPointer(call_code());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000837 VerifyPointer(property_accessors());
838 VerifyPointer(prototype_template());
839 VerifyPointer(parent_template());
840 VerifyPointer(named_property_handler());
841 VerifyPointer(indexed_property_handler());
842 VerifyPointer(instance_template());
843 VerifyPointer(signature());
844 VerifyPointer(access_check_info());
845}
846
847void FunctionTemplateInfo::FunctionTemplateInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000848 HeapObject::PrintHeader("FunctionTemplateInfo");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000849 PrintF("\n - tag: ");
850 tag()->ShortPrint();
851 PrintF("\n - property_list: ");
852 property_list()->ShortPrint();
853 PrintF("\n - serial_number: ");
854 serial_number()->ShortPrint();
855 PrintF("\n - call_code: ");
856 call_code()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000857 PrintF("\n - property_accessors: ");
858 property_accessors()->ShortPrint();
859 PrintF("\n - prototype_template: ");
860 prototype_template()->ShortPrint();
861 PrintF("\n - parent_template: ");
862 parent_template()->ShortPrint();
863 PrintF("\n - named_property_handler: ");
864 named_property_handler()->ShortPrint();
865 PrintF("\n - indexed_property_handler: ");
866 indexed_property_handler()->ShortPrint();
867 PrintF("\n - instance_template: ");
868 instance_template()->ShortPrint();
869 PrintF("\n - signature: ");
870 signature()->ShortPrint();
871 PrintF("\n - access_check_info: ");
872 access_check_info()->ShortPrint();
873 PrintF("\n - hidden_prototype: %s", hidden_prototype() ? "true" : "false");
874 PrintF("\n - undetectable: %s", undetectable() ? "true" : "false");
875 PrintF("\n - need_access_check: %s", needs_access_check() ? "true" : "false");
876}
877
878void ObjectTemplateInfo::ObjectTemplateInfoVerify() {
879 CHECK(IsObjectTemplateInfo());
880 TemplateInfoVerify();
881 VerifyPointer(constructor());
kasper.lund212ac232008-07-16 07:07:30 +0000882 VerifyPointer(internal_field_count());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000883}
884
885void ObjectTemplateInfo::ObjectTemplateInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000886 HeapObject::PrintHeader("ObjectTemplateInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000887 PrintF("\n - constructor: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000888 constructor()->ShortPrint();
kasper.lund212ac232008-07-16 07:07:30 +0000889 PrintF("\n - internal_field_count: ");
890 internal_field_count()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000891}
892
893void SignatureInfo::SignatureInfoVerify() {
894 CHECK(IsSignatureInfo());
895 VerifyPointer(receiver());
896 VerifyPointer(args());
897}
898
899void SignatureInfo::SignatureInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000900 HeapObject::PrintHeader("SignatureInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000901 PrintF("\n - receiver: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000902 receiver()->ShortPrint();
kasper.lund212ac232008-07-16 07:07:30 +0000903 PrintF("\n - args: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000904 args()->ShortPrint();
905}
906
907void TypeSwitchInfo::TypeSwitchInfoVerify() {
908 CHECK(IsTypeSwitchInfo());
909 VerifyPointer(types());
910}
911
912void TypeSwitchInfo::TypeSwitchInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000913 HeapObject::PrintHeader("TypeSwitchInfo");
kasper.lund212ac232008-07-16 07:07:30 +0000914 PrintF("\n - types: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000915 types()->ShortPrint();
916}
917
918
919void Script::ScriptVerify() {
920 CHECK(IsScript());
921 VerifyPointer(source());
922 VerifyPointer(name());
923 line_offset()->SmiVerify();
924 column_offset()->SmiVerify();
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000925 VerifyPointer(data());
926 VerifyPointer(wrapper());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000927 type()->SmiVerify();
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000928 VerifyPointer(line_ends());
929 VerifyPointer(id());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000930}
931
932
933void Script::ScriptPrint() {
934 HeapObject::PrintHeader("Script");
935 PrintF("\n - source: ");
936 source()->ShortPrint();
937 PrintF("\n - name: ");
938 name()->ShortPrint();
939 PrintF("\n - line_offset: ");
940 line_offset()->ShortPrint();
941 PrintF("\n - column_offset: ");
942 column_offset()->ShortPrint();
943 PrintF("\n - type: ");
944 type()->ShortPrint();
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000945 PrintF("\n - id: ");
946 id()->ShortPrint();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000947 PrintF("\n");
948}
949
950
951void DebugInfo::DebugInfoVerify() {
952 CHECK(IsDebugInfo());
953 VerifyPointer(shared());
954 VerifyPointer(original_code());
955 VerifyPointer(code());
956 VerifyPointer(break_points());
957}
958
959
960void DebugInfo::DebugInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000961 HeapObject::PrintHeader("DebugInfo");
962 PrintF("\n - shared: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000963 shared()->ShortPrint();
ager@chromium.org381abbb2009-02-25 13:23:22 +0000964 PrintF("\n - original_code: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000965 original_code()->ShortPrint();
ager@chromium.org381abbb2009-02-25 13:23:22 +0000966 PrintF("\n - code: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000967 code()->ShortPrint();
ager@chromium.org381abbb2009-02-25 13:23:22 +0000968 PrintF("\n - break_points: ");
969 break_points()->Print();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000970}
971
972
973void BreakPointInfo::BreakPointInfoVerify() {
974 CHECK(IsBreakPointInfo());
975 code_position()->SmiVerify();
976 source_position()->SmiVerify();
977 statement_position()->SmiVerify();
978 VerifyPointer(break_point_objects());
979}
980
981
982void BreakPointInfo::BreakPointInfoPrint() {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000983 HeapObject::PrintHeader("BreakPointInfo");
984 PrintF("\n - code_position: %d", code_position());
985 PrintF("\n - source_position: %d", source_position());
986 PrintF("\n - statement_position: %d", statement_position());
987 PrintF("\n - break_point_objects: ");
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000988 break_point_objects()->ShortPrint();
989}
990
991
992void JSObject::IncrementSpillStatistics(SpillInformation* info) {
993 info->number_of_objects_++;
994 // Named properties
995 if (HasFastProperties()) {
996 info->number_of_objects_with_fast_properties_++;
997 info->number_of_fast_used_fields_ += map()->NextFreePropertyIndex();
998 info->number_of_fast_unused_fields_ += map()->unused_property_fields();
999 } else {
1000 Dictionary* dict = property_dictionary();
1001 info->number_of_slow_used_properties_ += dict->NumberOfElements();
1002 info->number_of_slow_unused_properties_ +=
1003 dict->Capacity() - dict->NumberOfElements();
1004 }
1005 // Indexed properties
1006 if (HasFastElements()) {
1007 info->number_of_objects_with_fast_elements_++;
1008 int holes = 0;
1009 FixedArray* e = FixedArray::cast(elements());
1010 int len = e->length();
1011 for (int i = 0; i < len; i++) {
1012 if (e->get(i) == Heap::the_hole_value()) holes++;
1013 }
1014 info->number_of_fast_used_elements_ += len - holes;
1015 info->number_of_fast_unused_elements_ += holes;
1016 } else {
1017 Dictionary* dict = element_dictionary();
1018 info->number_of_slow_used_elements_ += dict->NumberOfElements();
1019 info->number_of_slow_unused_elements_ +=
1020 dict->Capacity() - dict->NumberOfElements();
1021 }
1022}
1023
1024
1025void JSObject::SpillInformation::Clear() {
1026 number_of_objects_ = 0;
1027 number_of_objects_with_fast_properties_ = 0;
1028 number_of_objects_with_fast_elements_ = 0;
1029 number_of_fast_used_fields_ = 0;
1030 number_of_fast_unused_fields_ = 0;
1031 number_of_slow_used_properties_ = 0;
1032 number_of_slow_unused_properties_ = 0;
1033 number_of_fast_used_elements_ = 0;
1034 number_of_fast_unused_elements_ = 0;
1035 number_of_slow_used_elements_ = 0;
1036 number_of_slow_unused_elements_ = 0;
1037}
1038
1039void JSObject::SpillInformation::Print() {
1040 PrintF("\n JSObject Spill Statistics (#%d):\n", number_of_objects_);
1041
1042 PrintF(" - fast properties (#%d): %d (used) %d (unused)\n",
1043 number_of_objects_with_fast_properties_,
1044 number_of_fast_used_fields_, number_of_fast_unused_fields_);
1045
1046 PrintF(" - slow properties (#%d): %d (used) %d (unused)\n",
1047 number_of_objects_ - number_of_objects_with_fast_properties_,
1048 number_of_slow_used_properties_, number_of_slow_unused_properties_);
1049
1050 PrintF(" - fast elements (#%d): %d (used) %d (unused)\n",
1051 number_of_objects_with_fast_elements_,
1052 number_of_fast_used_elements_, number_of_fast_unused_elements_);
1053
1054 PrintF(" - slow elements (#%d): %d (used) %d (unused)\n",
1055 number_of_objects_ - number_of_objects_with_fast_elements_,
1056 number_of_slow_used_elements_, number_of_slow_unused_elements_);
1057
1058 PrintF("\n");
1059}
1060
1061
1062void DescriptorArray::PrintDescriptors() {
1063 PrintF("Descriptor array %d\n", number_of_descriptors());
1064 int number = 0;
1065 for (DescriptorReader r(this); !r.eos(); r.advance()) {
1066 Descriptor desc;
1067 r.Get(&desc);
1068 PrintF(" %d: ", number++);
1069 desc.Print();
1070 }
1071 PrintF("\n");
1072}
1073
1074
mads.s.ager@gmail.com769cc962008-08-06 10:02:49 +00001075bool DescriptorArray::IsSortedNoDuplicates() {
1076 String* current_key = NULL;
1077 uint32_t current = 0;
1078 for (DescriptorReader r(this); !r.eos(); r.advance()) {
1079 String* key = r.GetKey();
1080 if (key == current_key) {
1081 PrintDescriptors();
1082 return false;
1083 }
1084 current_key = key;
1085 uint32_t hash = r.GetKey()->Hash();
1086 if (hash < current) {
1087 PrintDescriptors();
1088 return false;
1089 }
1090 current = hash;
1091 }
1092 return true;
1093}
1094
1095
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001096#endif // DEBUG
1097
1098} } // namespace v8::internal