Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(423)

Side by Side Diff: src/objects-debug.cc

Issue 11118018: Enable --verify-heap in release mode (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.cc ('k') | src/objects-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 17 matching lines...) Expand all
28 #include "v8.h" 28 #include "v8.h"
29 29
30 #include "disassembler.h" 30 #include "disassembler.h"
31 #include "disasm.h" 31 #include "disasm.h"
32 #include "jsregexp.h" 32 #include "jsregexp.h"
33 #include "objects-visiting.h" 33 #include "objects-visiting.h"
34 34
35 namespace v8 { 35 namespace v8 {
36 namespace internal { 36 namespace internal {
37 37
38 #ifdef DEBUG 38 #ifdef VERIFY_HEAP
39 39
40 void MaybeObject::Verify() { 40 void MaybeObject::Verify() {
41 Object* this_as_object; 41 Object* this_as_object;
42 if (ToObject(&this_as_object)) { 42 if (ToObject(&this_as_object)) {
43 if (this_as_object->IsSmi()) { 43 if (this_as_object->IsSmi()) {
44 Smi::cast(this_as_object)->SmiVerify(); 44 Smi::cast(this_as_object)->SmiVerify();
45 } else { 45 } else {
46 HeapObject::cast(this_as_object)->HeapObjectVerify(); 46 HeapObject::cast(this_as_object)->HeapObjectVerify();
47 } 47 }
48 } else { 48 } else {
49 Failure::cast(this)->FailureVerify(); 49 Failure::cast(this)->FailureVerify();
50 } 50 }
51 } 51 }
52 52
53 53
54 void Object::VerifyPointer(Object* p) { 54 void Object::VerifyPointer(Object* p) {
55 if (p->IsHeapObject()) { 55 if (p->IsHeapObject()) {
56 HeapObject::VerifyHeapPointer(p); 56 HeapObject::VerifyHeapPointer(p);
57 } else { 57 } else {
58 ASSERT(p->IsSmi()); 58 CHECK(p->IsSmi());
59 } 59 }
60 } 60 }
61 61
62 62
63 void Smi::SmiVerify() { 63 void Smi::SmiVerify() {
64 ASSERT(IsSmi()); 64 CHECK(IsSmi());
65 } 65 }
66 66
67 67
68 void Failure::FailureVerify() { 68 void Failure::FailureVerify() {
69 ASSERT(IsFailure()); 69 CHECK(IsFailure());
70 } 70 }
71 71
72 72
73 void HeapObject::HeapObjectVerify() { 73 void HeapObject::HeapObjectVerify() {
74 InstanceType instance_type = map()->instance_type(); 74 InstanceType instance_type = map()->instance_type();
75 75
76 if (instance_type < FIRST_NONSTRING_TYPE) { 76 if (instance_type < FIRST_NONSTRING_TYPE) {
77 String::cast(this)->StringVerify(); 77 String::cast(this)->StringVerify();
78 return; 78 return;
79 } 79 }
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 #undef MAKE_STRUCT_CASE 200 #undef MAKE_STRUCT_CASE
201 201
202 default: 202 default:
203 UNREACHABLE(); 203 UNREACHABLE();
204 break; 204 break;
205 } 205 }
206 } 206 }
207 207
208 208
209 void HeapObject::VerifyHeapPointer(Object* p) { 209 void HeapObject::VerifyHeapPointer(Object* p) {
210 ASSERT(p->IsHeapObject()); 210 CHECK(p->IsHeapObject());
211 ASSERT(HEAP->Contains(HeapObject::cast(p))); 211 CHECK(HEAP->Contains(HeapObject::cast(p)));
212 } 212 }
213 213
214 214
215 void HeapNumber::HeapNumberVerify() { 215 void HeapNumber::HeapNumberVerify() {
216 ASSERT(IsHeapNumber()); 216 CHECK(IsHeapNumber());
217 } 217 }
218 218
219 219
220 void ByteArray::ByteArrayVerify() { 220 void ByteArray::ByteArrayVerify() {
221 ASSERT(IsByteArray()); 221 CHECK(IsByteArray());
222 } 222 }
223 223
224 224
225 void FreeSpace::FreeSpaceVerify() { 225 void FreeSpace::FreeSpaceVerify() {
226 ASSERT(IsFreeSpace()); 226 CHECK(IsFreeSpace());
227 } 227 }
228 228
229 229
230 void ExternalPixelArray::ExternalPixelArrayVerify() { 230 void ExternalPixelArray::ExternalPixelArrayVerify() {
231 ASSERT(IsExternalPixelArray()); 231 CHECK(IsExternalPixelArray());
232 } 232 }
233 233
234 234
235 void ExternalByteArray::ExternalByteArrayVerify() { 235 void ExternalByteArray::ExternalByteArrayVerify() {
236 ASSERT(IsExternalByteArray()); 236 CHECK(IsExternalByteArray());
237 } 237 }
238 238
239 239
240 void ExternalUnsignedByteArray::ExternalUnsignedByteArrayVerify() { 240 void ExternalUnsignedByteArray::ExternalUnsignedByteArrayVerify() {
241 ASSERT(IsExternalUnsignedByteArray()); 241 CHECK(IsExternalUnsignedByteArray());
242 } 242 }
243 243
244 244
245 void ExternalShortArray::ExternalShortArrayVerify() { 245 void ExternalShortArray::ExternalShortArrayVerify() {
246 ASSERT(IsExternalShortArray()); 246 CHECK(IsExternalShortArray());
247 } 247 }
248 248
249 249
250 void ExternalUnsignedShortArray::ExternalUnsignedShortArrayVerify() { 250 void ExternalUnsignedShortArray::ExternalUnsignedShortArrayVerify() {
251 ASSERT(IsExternalUnsignedShortArray()); 251 CHECK(IsExternalUnsignedShortArray());
252 } 252 }
253 253
254 254
255 void ExternalIntArray::ExternalIntArrayVerify() { 255 void ExternalIntArray::ExternalIntArrayVerify() {
256 ASSERT(IsExternalIntArray()); 256 CHECK(IsExternalIntArray());
257 } 257 }
258 258
259 259
260 void ExternalUnsignedIntArray::ExternalUnsignedIntArrayVerify() { 260 void ExternalUnsignedIntArray::ExternalUnsignedIntArrayVerify() {
261 ASSERT(IsExternalUnsignedIntArray()); 261 CHECK(IsExternalUnsignedIntArray());
262 } 262 }
263 263
264 264
265 void ExternalFloatArray::ExternalFloatArrayVerify() { 265 void ExternalFloatArray::ExternalFloatArrayVerify() {
266 ASSERT(IsExternalFloatArray()); 266 CHECK(IsExternalFloatArray());
267 } 267 }
268 268
269 269
270 void ExternalDoubleArray::ExternalDoubleArrayVerify() { 270 void ExternalDoubleArray::ExternalDoubleArrayVerify() {
271 ASSERT(IsExternalDoubleArray()); 271 CHECK(IsExternalDoubleArray());
272 } 272 }
273 273
274 274
275 void JSObject::JSObjectVerify() { 275 void JSObject::JSObjectVerify() {
276 VerifyHeapPointer(properties()); 276 VerifyHeapPointer(properties());
277 VerifyHeapPointer(elements()); 277 VerifyHeapPointer(elements());
278 278
279 if (GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS) { 279 if (GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS) {
280 ASSERT(this->elements()->IsFixedArray()); 280 CHECK(this->elements()->IsFixedArray());
281 ASSERT(this->elements()->length() >= 2); 281 CHECK_GE(this->elements()->length(), 2);
282 } 282 }
283 283
284 if (HasFastProperties()) { 284 if (HasFastProperties()) {
285 CHECK_EQ(map()->unused_property_fields(), 285 CHECK_EQ(map()->unused_property_fields(),
286 (map()->inobject_properties() + properties()->length() - 286 (map()->inobject_properties() + properties()->length() -
287 map()->NextFreePropertyIndex())); 287 map()->NextFreePropertyIndex()));
288 } 288 }
289 ASSERT_EQ((map()->has_fast_smi_or_object_elements() || 289 CHECK_EQ((map()->has_fast_smi_or_object_elements() ||
290 (elements() == GetHeap()->empty_fixed_array())), 290 (elements() == GetHeap()->empty_fixed_array())),
291 (elements()->map() == GetHeap()->fixed_array_map() || 291 (elements()->map() == GetHeap()->fixed_array_map() ||
292 elements()->map() == GetHeap()->fixed_cow_array_map())); 292 elements()->map() == GetHeap()->fixed_cow_array_map()));
293 ASSERT(map()->has_fast_object_elements() == HasFastObjectElements()); 293 CHECK(map()->has_fast_object_elements() == HasFastObjectElements());
294 } 294 }
295 295
296 296
297 void Map::MapVerify() { 297 void Map::MapVerify() {
298 ASSERT(!HEAP->InNewSpace(this)); 298 CHECK(!HEAP->InNewSpace(this));
299 ASSERT(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE); 299 CHECK(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE);
300 ASSERT(instance_size() == kVariableSizeSentinel || 300 CHECK(instance_size() == kVariableSizeSentinel ||
301 (kPointerSize <= instance_size() && 301 (kPointerSize <= instance_size() &&
302 instance_size() < HEAP->Capacity())); 302 instance_size() < HEAP->Capacity()));
303 VerifyHeapPointer(prototype()); 303 VerifyHeapPointer(prototype());
304 VerifyHeapPointer(instance_descriptors()); 304 VerifyHeapPointer(instance_descriptors());
305 DescriptorArray* descriptors = instance_descriptors(); 305 DescriptorArray* descriptors = instance_descriptors();
306 for (int i = 0; i < NumberOfOwnDescriptors(); ++i) { 306 for (int i = 0; i < NumberOfOwnDescriptors(); ++i) {
307 ASSERT_EQ(i, descriptors->GetDetails(i).descriptor_index() - 1); 307 CHECK_EQ(i, descriptors->GetDetails(i).descriptor_index() - 1);
308 } 308 }
309 SLOW_ASSERT(instance_descriptors()->IsSortedNoDuplicates()); 309 SLOW_ASSERT(instance_descriptors()->IsSortedNoDuplicates());
310 if (HasTransitionArray()) { 310 if (HasTransitionArray()) {
311 SLOW_ASSERT(transitions()->IsSortedNoDuplicates()); 311 SLOW_ASSERT(transitions()->IsSortedNoDuplicates());
312 SLOW_ASSERT(transitions()->IsConsistentWithBackPointers(this)); 312 SLOW_ASSERT(transitions()->IsConsistentWithBackPointers(this));
313 } 313 }
314 } 314 }
315 315
316 316
317 void Map::SharedMapVerify() { 317 void Map::SharedMapVerify() {
318 MapVerify(); 318 MapVerify();
319 ASSERT(is_shared()); 319 CHECK(is_shared());
320 ASSERT(instance_descriptors()->IsEmpty()); 320 CHECK(instance_descriptors()->IsEmpty());
321 ASSERT_EQ(0, pre_allocated_property_fields()); 321 CHECK_EQ(0, pre_allocated_property_fields());
322 ASSERT_EQ(0, unused_property_fields()); 322 CHECK_EQ(0, unused_property_fields());
323 ASSERT_EQ(StaticVisitorBase::GetVisitorId(instance_type(), instance_size()), 323 CHECK_EQ(StaticVisitorBase::GetVisitorId(instance_type(), instance_size()),
324 visitor_id()); 324 visitor_id());
325 } 325 }
326 326
327 327
328 void CodeCache::CodeCacheVerify() { 328 void CodeCache::CodeCacheVerify() {
329 VerifyHeapPointer(default_cache()); 329 VerifyHeapPointer(default_cache());
330 VerifyHeapPointer(normal_type_cache()); 330 VerifyHeapPointer(normal_type_cache());
331 ASSERT(default_cache()->IsFixedArray()); 331 CHECK(default_cache()->IsFixedArray());
332 ASSERT(normal_type_cache()->IsUndefined() 332 CHECK(normal_type_cache()->IsUndefined()
333 || normal_type_cache()->IsCodeCacheHashTable()); 333 || normal_type_cache()->IsCodeCacheHashTable());
334 } 334 }
335 335
336 336
337 void PolymorphicCodeCache::PolymorphicCodeCacheVerify() { 337 void PolymorphicCodeCache::PolymorphicCodeCacheVerify() {
338 VerifyHeapPointer(cache()); 338 VerifyHeapPointer(cache());
339 ASSERT(cache()->IsUndefined() || cache()->IsPolymorphicCodeCacheHashTable()); 339 CHECK(cache()->IsUndefined() || cache()->IsPolymorphicCodeCacheHashTable());
340 } 340 }
341 341
342 342
343 void TypeFeedbackInfo::TypeFeedbackInfoVerify() { 343 void TypeFeedbackInfo::TypeFeedbackInfoVerify() {
344 VerifyObjectField(kStorage1Offset); 344 VerifyObjectField(kStorage1Offset);
345 VerifyObjectField(kStorage2Offset); 345 VerifyObjectField(kStorage2Offset);
346 VerifyHeapPointer(type_feedback_cells()); 346 VerifyHeapPointer(type_feedback_cells());
347 } 347 }
348 348
349 349
(...skipping 11 matching lines...) Expand all
361 e->Verify(); 361 e->Verify();
362 } 362 }
363 } 363 }
364 } 364 }
365 365
366 366
367 void FixedDoubleArray::FixedDoubleArrayVerify() { 367 void FixedDoubleArray::FixedDoubleArrayVerify() {
368 for (int i = 0; i < length(); i++) { 368 for (int i = 0; i < length(); i++) {
369 if (!is_the_hole(i)) { 369 if (!is_the_hole(i)) {
370 double value = get_scalar(i); 370 double value = get_scalar(i);
371 ASSERT(!isnan(value) || 371 CHECK(!isnan(value) ||
372 (BitCast<uint64_t>(value) == 372 (BitCast<uint64_t>(value) ==
373 BitCast<uint64_t>(canonical_not_the_hole_nan_as_double())) || 373 BitCast<uint64_t>(canonical_not_the_hole_nan_as_double())) ||
374 ((BitCast<uint64_t>(value) & Double::kSignMask) != 0)); 374 ((BitCast<uint64_t>(value) & Double::kSignMask) != 0));
375 } 375 }
376 } 376 }
377 } 377 }
378 378
379 379
380 void JSModule::JSModuleVerify() { 380 void JSModule::JSModuleVerify() {
381 VerifyObjectField(kContextOffset); 381 VerifyObjectField(kContextOffset);
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 VerifyObjectField(i); 548 VerifyObjectField(i);
549 } 549 }
550 } 550 }
551 551
552 552
553 void Oddball::OddballVerify() { 553 void Oddball::OddballVerify() {
554 CHECK(IsOddball()); 554 CHECK(IsOddball());
555 VerifyHeapPointer(to_string()); 555 VerifyHeapPointer(to_string());
556 Object* number = to_number(); 556 Object* number = to_number();
557 if (number->IsHeapObject()) { 557 if (number->IsHeapObject()) {
558 ASSERT(number == HEAP->nan_value()); 558 CHECK(number == HEAP->nan_value());
559 } else { 559 } else {
560 ASSERT(number->IsSmi()); 560 CHECK(number->IsSmi());
561 int value = Smi::cast(number)->value(); 561 int value = Smi::cast(number)->value();
562 // Hidden oddballs have negative smis. 562 // Hidden oddballs have negative smis.
563 const int kLeastHiddenOddballNumber = -4; 563 const int kLeastHiddenOddballNumber = -4;
564 ASSERT(value <= 1); 564 CHECK_LE(value, 1);
565 ASSERT(value >= kLeastHiddenOddballNumber); 565 CHECK(value >= kLeastHiddenOddballNumber);
566 } 566 }
567 } 567 }
568 568
569 569
570 void JSGlobalPropertyCell::JSGlobalPropertyCellVerify() { 570 void JSGlobalPropertyCell::JSGlobalPropertyCellVerify() {
571 CHECK(IsJSGlobalPropertyCell()); 571 CHECK(IsJSGlobalPropertyCell());
572 VerifyObjectField(kValueOffset); 572 VerifyObjectField(kValueOffset);
573 } 573 }
574 574
575 575
576 void Code::CodeVerify() { 576 void Code::CodeVerify() {
577 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()), 577 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()),
578 kCodeAlignment)); 578 kCodeAlignment));
579 relocation_info()->Verify(); 579 relocation_info()->Verify();
580 Address last_gc_pc = NULL; 580 Address last_gc_pc = NULL;
581 for (RelocIterator it(this); !it.done(); it.next()) { 581 for (RelocIterator it(this); !it.done(); it.next()) {
582 it.rinfo()->Verify(); 582 it.rinfo()->Verify();
583 // Ensure that GC will not iterate twice over the same pointer. 583 // Ensure that GC will not iterate twice over the same pointer.
584 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) { 584 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) {
585 CHECK(it.rinfo()->pc() != last_gc_pc); 585 CHECK(it.rinfo()->pc() != last_gc_pc);
586 last_gc_pc = it.rinfo()->pc(); 586 last_gc_pc = it.rinfo()->pc();
587 } 587 }
588 } 588 }
589 } 589 }
590 590
591 591
592 void JSArray::JSArrayVerify() { 592 void JSArray::JSArrayVerify() {
593 JSObjectVerify(); 593 JSObjectVerify();
594 ASSERT(length()->IsNumber() || length()->IsUndefined()); 594 CHECK(length()->IsNumber() || length()->IsUndefined());
595 ASSERT(elements()->IsUndefined() || 595 CHECK(elements()->IsUndefined() ||
596 elements()->IsFixedArray() || 596 elements()->IsFixedArray() ||
597 elements()->IsFixedDoubleArray()); 597 elements()->IsFixedDoubleArray());
598 } 598 }
599 599
600 600
601 void JSSet::JSSetVerify() { 601 void JSSet::JSSetVerify() {
602 CHECK(IsJSSet()); 602 CHECK(IsJSSet());
603 JSObjectVerify(); 603 JSObjectVerify();
604 VerifyHeapPointer(table()); 604 VerifyHeapPointer(table());
605 ASSERT(table()->IsHashTable() || table()->IsUndefined()); 605 CHECK(table()->IsHashTable() || table()->IsUndefined());
606 } 606 }
607 607
608 608
609 void JSMap::JSMapVerify() { 609 void JSMap::JSMapVerify() {
610 CHECK(IsJSMap()); 610 CHECK(IsJSMap());
611 JSObjectVerify(); 611 JSObjectVerify();
612 VerifyHeapPointer(table()); 612 VerifyHeapPointer(table());
613 ASSERT(table()->IsHashTable() || table()->IsUndefined()); 613 CHECK(table()->IsHashTable() || table()->IsUndefined());
614 } 614 }
615 615
616 616
617 void JSWeakMap::JSWeakMapVerify() { 617 void JSWeakMap::JSWeakMapVerify() {
618 CHECK(IsJSWeakMap()); 618 CHECK(IsJSWeakMap());
619 JSObjectVerify(); 619 JSObjectVerify();
620 VerifyHeapPointer(table()); 620 VerifyHeapPointer(table());
621 ASSERT(table()->IsHashTable() || table()->IsUndefined()); 621 CHECK(table()->IsHashTable() || table()->IsUndefined());
622 } 622 }
623 623
624 624
625 void JSRegExp::JSRegExpVerify() { 625 void JSRegExp::JSRegExpVerify() {
626 JSObjectVerify(); 626 JSObjectVerify();
627 ASSERT(data()->IsUndefined() || data()->IsFixedArray()); 627 CHECK(data()->IsUndefined() || data()->IsFixedArray());
628 switch (TypeTag()) { 628 switch (TypeTag()) {
629 case JSRegExp::ATOM: { 629 case JSRegExp::ATOM: {
630 FixedArray* arr = FixedArray::cast(data()); 630 FixedArray* arr = FixedArray::cast(data());
631 ASSERT(arr->get(JSRegExp::kAtomPatternIndex)->IsString()); 631 CHECK(arr->get(JSRegExp::kAtomPatternIndex)->IsString());
632 break; 632 break;
633 } 633 }
634 case JSRegExp::IRREGEXP: { 634 case JSRegExp::IRREGEXP: {
635 bool is_native = RegExpImpl::UsesNativeRegExp(); 635 bool is_native = RegExpImpl::UsesNativeRegExp();
636 636
637 FixedArray* arr = FixedArray::cast(data()); 637 FixedArray* arr = FixedArray::cast(data());
638 Object* ascii_data = arr->get(JSRegExp::kIrregexpASCIICodeIndex); 638 Object* ascii_data = arr->get(JSRegExp::kIrregexpASCIICodeIndex);
639 // Smi : Not compiled yet (-1) or code prepared for flushing. 639 // Smi : Not compiled yet (-1) or code prepared for flushing.
640 // JSObject: Compilation error. 640 // JSObject: Compilation error.
641 // Code/ByteArray: Compiled code. 641 // Code/ByteArray: Compiled code.
642 ASSERT(ascii_data->IsSmi() || 642 CHECK(ascii_data->IsSmi() ||
643 (is_native ? ascii_data->IsCode() : ascii_data->IsByteArray())); 643 (is_native ? ascii_data->IsCode() : ascii_data->IsByteArray()));
644 Object* uc16_data = arr->get(JSRegExp::kIrregexpUC16CodeIndex); 644 Object* uc16_data = arr->get(JSRegExp::kIrregexpUC16CodeIndex);
645 ASSERT(uc16_data->IsSmi() || 645 CHECK(uc16_data->IsSmi() ||
646 (is_native ? uc16_data->IsCode() : uc16_data->IsByteArray())); 646 (is_native ? uc16_data->IsCode() : uc16_data->IsByteArray()));
647 647
648 Object* ascii_saved = arr->get(JSRegExp::kIrregexpASCIICodeSavedIndex); 648 Object* ascii_saved = arr->get(JSRegExp::kIrregexpASCIICodeSavedIndex);
649 ASSERT(ascii_saved->IsSmi() || ascii_saved->IsString() || 649 CHECK(ascii_saved->IsSmi() || ascii_saved->IsString() ||
650 ascii_saved->IsCode()); 650 ascii_saved->IsCode());
651 Object* uc16_saved = arr->get(JSRegExp::kIrregexpUC16CodeSavedIndex); 651 Object* uc16_saved = arr->get(JSRegExp::kIrregexpUC16CodeSavedIndex);
652 ASSERT(uc16_saved->IsSmi() || uc16_saved->IsString() || 652 CHECK(uc16_saved->IsSmi() || uc16_saved->IsString() ||
653 uc16_saved->IsCode()); 653 uc16_saved->IsCode());
654 654
655 ASSERT(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi()); 655 CHECK(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi());
656 ASSERT(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi()); 656 CHECK(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi());
657 break; 657 break;
658 } 658 }
659 default: 659 default:
660 ASSERT_EQ(JSRegExp::NOT_COMPILED, TypeTag()); 660 CHECK_EQ(JSRegExp::NOT_COMPILED, TypeTag());
661 ASSERT(data()->IsUndefined()); 661 CHECK(data()->IsUndefined());
662 break; 662 break;
663 } 663 }
664 } 664 }
665 665
666 666
667 void JSProxy::JSProxyVerify() { 667 void JSProxy::JSProxyVerify() {
668 CHECK(IsJSProxy()); 668 CHECK(IsJSProxy());
669 VerifyPointer(handler()); 669 VerifyPointer(handler());
670 ASSERT(hash()->IsSmi() || hash()->IsUndefined()); 670 CHECK(hash()->IsSmi() || hash()->IsUndefined());
671 } 671 }
672 672
673 673
674 void JSFunctionProxy::JSFunctionProxyVerify() { 674 void JSFunctionProxy::JSFunctionProxyVerify() {
675 CHECK(IsJSFunctionProxy()); 675 CHECK(IsJSFunctionProxy());
676 JSProxyVerify(); 676 JSProxyVerify();
677 VerifyPointer(call_trap()); 677 VerifyPointer(call_trap());
678 VerifyPointer(construct_trap()); 678 VerifyPointer(construct_trap());
679 } 679 }
680 680
681 681
682 void Foreign::ForeignVerify() { 682 void Foreign::ForeignVerify() {
683 ASSERT(IsForeign()); 683 CHECK(IsForeign());
684 } 684 }
685 685
686 686
687 void AccessorInfo::AccessorInfoVerify() { 687 void AccessorInfo::AccessorInfoVerify() {
688 CHECK(IsAccessorInfo()); 688 CHECK(IsAccessorInfo());
689 VerifyPointer(getter()); 689 VerifyPointer(getter());
690 VerifyPointer(setter()); 690 VerifyPointer(setter());
691 VerifyPointer(name()); 691 VerifyPointer(name());
692 VerifyPointer(data()); 692 VerifyPointer(data());
693 VerifyPointer(flag()); 693 VerifyPointer(flag());
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
777 line_offset()->SmiVerify(); 777 line_offset()->SmiVerify();
778 column_offset()->SmiVerify(); 778 column_offset()->SmiVerify();
779 VerifyPointer(data()); 779 VerifyPointer(data());
780 VerifyPointer(wrapper()); 780 VerifyPointer(wrapper());
781 type()->SmiVerify(); 781 type()->SmiVerify();
782 VerifyPointer(line_ends()); 782 VerifyPointer(line_ends());
783 VerifyPointer(id()); 783 VerifyPointer(id());
784 } 784 }
785 785
786 786
787 void JSFunctionResultCache::JSFunctionResultCacheVerify() {
788 JSFunction::cast(get(kFactoryIndex))->Verify();
789
790 int size = Smi::cast(get(kCacheSizeIndex))->value();
791 CHECK(kEntriesIndex <= size);
792 CHECK(size <= length());
793 CHECK_EQ(0, size % kEntrySize);
794
795 int finger = Smi::cast(get(kFingerIndex))->value();
796 CHECK(kEntriesIndex <= finger);
797 CHECK((finger < size) || (finger == kEntriesIndex && finger == size));
798 CHECK_EQ(0, finger % kEntrySize);
799
800 if (FLAG_enable_slow_asserts) {
801 for (int i = kEntriesIndex; i < size; i++) {
802 CHECK(!get(i)->IsTheHole());
803 get(i)->Verify();
804 }
805 for (int i = size; i < length(); i++) {
806 CHECK(get(i)->IsTheHole());
807 get(i)->Verify();
808 }
809 }
810 }
811
812
813 void NormalizedMapCache::NormalizedMapCacheVerify() {
814 FixedArray::cast(this)->Verify();
815 if (FLAG_enable_slow_asserts) {
816 for (int i = 0; i < length(); i++) {
817 Object* e = get(i);
818 if (e->IsMap()) {
819 Map::cast(e)->SharedMapVerify();
820 } else {
821 CHECK(e->IsUndefined());
822 }
823 }
824 }
825 }
826
827
787 #ifdef ENABLE_DEBUGGER_SUPPORT 828 #ifdef ENABLE_DEBUGGER_SUPPORT
788 void DebugInfo::DebugInfoVerify() { 829 void DebugInfo::DebugInfoVerify() {
789 CHECK(IsDebugInfo()); 830 CHECK(IsDebugInfo());
790 VerifyPointer(shared()); 831 VerifyPointer(shared());
791 VerifyPointer(original_code()); 832 VerifyPointer(original_code());
792 VerifyPointer(code()); 833 VerifyPointer(code());
793 VerifyPointer(break_points()); 834 VerifyPointer(break_points());
794 } 835 }
795 836
796 837
797 void BreakPointInfo::BreakPointInfoVerify() { 838 void BreakPointInfo::BreakPointInfoVerify() {
798 CHECK(IsBreakPointInfo()); 839 CHECK(IsBreakPointInfo());
799 code_position()->SmiVerify(); 840 code_position()->SmiVerify();
800 source_position()->SmiVerify(); 841 source_position()->SmiVerify();
801 statement_position()->SmiVerify(); 842 statement_position()->SmiVerify();
802 VerifyPointer(break_point_objects()); 843 VerifyPointer(break_point_objects());
803 } 844 }
804 #endif // ENABLE_DEBUGGER_SUPPORT 845 #endif // ENABLE_DEBUGGER_SUPPORT
846 #endif // VERIFY_HEAP
805 847
848 #ifdef DEBUG
806 849
807 void JSObject::IncrementSpillStatistics(SpillInformation* info) { 850 void JSObject::IncrementSpillStatistics(SpillInformation* info) {
808 info->number_of_objects_++; 851 info->number_of_objects_++;
809 // Named properties 852 // Named properties
810 if (HasFastProperties()) { 853 if (HasFastProperties()) {
811 info->number_of_objects_with_fast_properties_++; 854 info->number_of_objects_with_fast_properties_++;
812 info->number_of_fast_used_fields_ += map()->NextFreePropertyIndex(); 855 info->number_of_fast_used_fields_ += map()->NextFreePropertyIndex();
813 info->number_of_fast_unused_fields_ += map()->unused_property_fields(); 856 info->number_of_fast_unused_fields_ += map()->unused_property_fields();
814 } else { 857 } else {
815 StringDictionary* dict = property_dictionary(); 858 StringDictionary* dict = property_dictionary();
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 !CheckOneBackPointer(current_map, elements_transition())) { 998 !CheckOneBackPointer(current_map, elements_transition())) {
956 return false; 999 return false;
957 } 1000 }
958 for (int i = 0; i < number_of_transitions(); ++i) { 1001 for (int i = 0; i < number_of_transitions(); ++i) {
959 if (!CheckOneBackPointer(current_map, GetTarget(i))) return false; 1002 if (!CheckOneBackPointer(current_map, GetTarget(i))) return false;
960 } 1003 }
961 return true; 1004 return true;
962 } 1005 }
963 1006
964 1007
965 void JSFunctionResultCache::JSFunctionResultCacheVerify() {
966 JSFunction::cast(get(kFactoryIndex))->Verify();
967
968 int size = Smi::cast(get(kCacheSizeIndex))->value();
969 ASSERT(kEntriesIndex <= size);
970 ASSERT(size <= length());
971 ASSERT_EQ(0, size % kEntrySize);
972
973 int finger = Smi::cast(get(kFingerIndex))->value();
974 ASSERT(kEntriesIndex <= finger);
975 ASSERT((finger < size) || (finger == kEntriesIndex && finger == size));
976 ASSERT_EQ(0, finger % kEntrySize);
977
978 if (FLAG_enable_slow_asserts) {
979 for (int i = kEntriesIndex; i < size; i++) {
980 ASSERT(!get(i)->IsTheHole());
981 get(i)->Verify();
982 }
983 for (int i = size; i < length(); i++) {
984 ASSERT(get(i)->IsTheHole());
985 get(i)->Verify();
986 }
987 }
988 }
989
990
991 void NormalizedMapCache::NormalizedMapCacheVerify() {
992 FixedArray::cast(this)->Verify();
993 if (FLAG_enable_slow_asserts) {
994 for (int i = 0; i < length(); i++) {
995 Object* e = get(i);
996 if (e->IsMap()) {
997 Map::cast(e)->SharedMapVerify();
998 } else {
999 ASSERT(e->IsUndefined());
1000 }
1001 }
1002 }
1003 }
1004
1005
1006 void Map::ZapTransitions() {
1007 TransitionArray* transition_array = transitions();
1008 MemsetPointer(transition_array->data_start(),
1009 GetHeap()->the_hole_value(),
1010 transition_array->length());
1011 }
1012
1013
1014 void Map::ZapPrototypeTransitions() {
1015 FixedArray* proto_transitions = GetPrototypeTransitions();
1016 MemsetPointer(proto_transitions->data_start(),
1017 GetHeap()->the_hole_value(),
1018 proto_transitions->length());
1019 }
1020
1021
1022 #endif // DEBUG 1008 #endif // DEBUG
1023 1009
1024 } } // namespace v8::internal 1010 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698