OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 break; | 87 break; |
88 case FIXED_ARRAY_TYPE: | 88 case FIXED_ARRAY_TYPE: |
89 FixedArray::cast(this)->FixedArrayVerify(); | 89 FixedArray::cast(this)->FixedArrayVerify(); |
90 break; | 90 break; |
91 case FIXED_DOUBLE_ARRAY_TYPE: | 91 case FIXED_DOUBLE_ARRAY_TYPE: |
92 FixedDoubleArray::cast(this)->FixedDoubleArrayVerify(); | 92 FixedDoubleArray::cast(this)->FixedDoubleArrayVerify(); |
93 break; | 93 break; |
94 case BYTE_ARRAY_TYPE: | 94 case BYTE_ARRAY_TYPE: |
95 ByteArray::cast(this)->ByteArrayVerify(); | 95 ByteArray::cast(this)->ByteArrayVerify(); |
96 break; | 96 break; |
| 97 case FREE_SPACE_TYPE: |
| 98 FreeSpace::cast(this)->FreeSpaceVerify(); |
| 99 break; |
97 case EXTERNAL_PIXEL_ARRAY_TYPE: | 100 case EXTERNAL_PIXEL_ARRAY_TYPE: |
98 ExternalPixelArray::cast(this)->ExternalPixelArrayVerify(); | 101 ExternalPixelArray::cast(this)->ExternalPixelArrayVerify(); |
99 break; | 102 break; |
100 case EXTERNAL_BYTE_ARRAY_TYPE: | 103 case EXTERNAL_BYTE_ARRAY_TYPE: |
101 ExternalByteArray::cast(this)->ExternalByteArrayVerify(); | 104 ExternalByteArray::cast(this)->ExternalByteArrayVerify(); |
102 break; | 105 break; |
103 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: | 106 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: |
104 ExternalUnsignedByteArray::cast(this)->ExternalUnsignedByteArrayVerify(); | 107 ExternalUnsignedByteArray::cast(this)->ExternalUnsignedByteArrayVerify(); |
105 break; | 108 break; |
106 case EXTERNAL_SHORT_ARRAY_TYPE: | 109 case EXTERNAL_SHORT_ARRAY_TYPE: |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 void HeapNumber::HeapNumberVerify() { | 203 void HeapNumber::HeapNumberVerify() { |
201 ASSERT(IsHeapNumber()); | 204 ASSERT(IsHeapNumber()); |
202 } | 205 } |
203 | 206 |
204 | 207 |
205 void ByteArray::ByteArrayVerify() { | 208 void ByteArray::ByteArrayVerify() { |
206 ASSERT(IsByteArray()); | 209 ASSERT(IsByteArray()); |
207 } | 210 } |
208 | 211 |
209 | 212 |
| 213 void FreeSpace::FreeSpaceVerify() { |
| 214 ASSERT(IsFreeSpace()); |
| 215 } |
| 216 |
| 217 |
210 void ExternalPixelArray::ExternalPixelArrayVerify() { | 218 void ExternalPixelArray::ExternalPixelArrayVerify() { |
211 ASSERT(IsExternalPixelArray()); | 219 ASSERT(IsExternalPixelArray()); |
212 } | 220 } |
213 | 221 |
214 | 222 |
215 void ExternalByteArray::ExternalByteArrayVerify() { | 223 void ExternalByteArray::ExternalByteArrayVerify() { |
216 ASSERT(IsExternalByteArray()); | 224 ASSERT(IsExternalByteArray()); |
217 } | 225 } |
218 | 226 |
219 | 227 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 | 261 |
254 | 262 |
255 void JSObject::JSObjectVerify() { | 263 void JSObject::JSObjectVerify() { |
256 VerifyHeapPointer(properties()); | 264 VerifyHeapPointer(properties()); |
257 VerifyHeapPointer(elements()); | 265 VerifyHeapPointer(elements()); |
258 if (HasFastProperties()) { | 266 if (HasFastProperties()) { |
259 CHECK_EQ(map()->unused_property_fields(), | 267 CHECK_EQ(map()->unused_property_fields(), |
260 (map()->inobject_properties() + properties()->length() - | 268 (map()->inobject_properties() + properties()->length() - |
261 map()->NextFreePropertyIndex())); | 269 map()->NextFreePropertyIndex())); |
262 } | 270 } |
263 ASSERT_EQ(map()->has_fast_elements(), | 271 ASSERT_EQ((map()->has_fast_elements() || map()->has_fast_smi_only_elements()), |
264 (elements()->map() == GetHeap()->fixed_array_map() || | 272 (elements()->map() == GetHeap()->fixed_array_map() || |
265 elements()->map() == GetHeap()->fixed_cow_array_map())); | 273 elements()->map() == GetHeap()->fixed_cow_array_map())); |
266 ASSERT(map()->has_fast_elements() == HasFastElements()); | 274 ASSERT(map()->has_fast_elements() == HasFastElements()); |
267 } | 275 } |
268 | 276 |
269 | 277 |
270 void Map::MapVerify() { | 278 void Map::MapVerify() { |
271 ASSERT(!HEAP->InNewSpace(this)); | 279 ASSERT(!HEAP->InNewSpace(this)); |
272 ASSERT(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE); | 280 ASSERT(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE); |
273 ASSERT(instance_size() == kVariableSizeSentinel || | 281 ASSERT(instance_size() == kVariableSizeSentinel || |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 } | 323 } |
316 } | 324 } |
317 | 325 |
318 | 326 |
319 void FixedDoubleArray::FixedDoubleArrayVerify() { | 327 void FixedDoubleArray::FixedDoubleArrayVerify() { |
320 for (int i = 0; i < length(); i++) { | 328 for (int i = 0; i < length(); i++) { |
321 if (!is_the_hole(i)) { | 329 if (!is_the_hole(i)) { |
322 double value = get_scalar(i); | 330 double value = get_scalar(i); |
323 ASSERT(!isnan(value) || | 331 ASSERT(!isnan(value) || |
324 (BitCast<uint64_t>(value) == | 332 (BitCast<uint64_t>(value) == |
325 BitCast<uint64_t>(canonical_not_the_hole_nan_as_double()))); | 333 BitCast<uint64_t>(canonical_not_the_hole_nan_as_double())) || |
| 334 ((BitCast<uint64_t>(value) & Double::kSignMask) != 0)); |
326 } | 335 } |
327 } | 336 } |
328 } | 337 } |
329 | 338 |
330 | 339 |
331 void JSValue::JSValueVerify() { | 340 void JSValue::JSValueVerify() { |
332 Object* v = value(); | 341 Object* v = value(); |
333 if (v->IsHeapObject()) { | 342 if (v->IsHeapObject()) { |
334 VerifyHeapPointer(v); | 343 VerifyHeapPointer(v); |
335 } | 344 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 CHECK(!this->parent()->IsConsString()); | 389 CHECK(!this->parent()->IsConsString()); |
381 CHECK(!this->parent()->IsSlicedString()); | 390 CHECK(!this->parent()->IsSlicedString()); |
382 CHECK(this->length() >= SlicedString::kMinLength); | 391 CHECK(this->length() >= SlicedString::kMinLength); |
383 } | 392 } |
384 | 393 |
385 | 394 |
386 void JSFunction::JSFunctionVerify() { | 395 void JSFunction::JSFunctionVerify() { |
387 CHECK(IsJSFunction()); | 396 CHECK(IsJSFunction()); |
388 VerifyObjectField(kPrototypeOrInitialMapOffset); | 397 VerifyObjectField(kPrototypeOrInitialMapOffset); |
389 VerifyObjectField(kNextFunctionLinkOffset); | 398 VerifyObjectField(kNextFunctionLinkOffset); |
| 399 CHECK(code()->IsCode()); |
390 CHECK(next_function_link()->IsUndefined() || | 400 CHECK(next_function_link()->IsUndefined() || |
391 next_function_link()->IsJSFunction()); | 401 next_function_link()->IsJSFunction()); |
392 } | 402 } |
393 | 403 |
394 | 404 |
395 void SharedFunctionInfo::SharedFunctionInfoVerify() { | 405 void SharedFunctionInfo::SharedFunctionInfoVerify() { |
396 CHECK(IsSharedFunctionInfo()); | 406 CHECK(IsSharedFunctionInfo()); |
397 VerifyObjectField(kNameOffset); | 407 VerifyObjectField(kNameOffset); |
398 VerifyObjectField(kCodeOffset); | 408 VerifyObjectField(kCodeOffset); |
399 VerifyObjectField(kScopeInfoOffset); | 409 VerifyObjectField(kScopeInfoOffset); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 | 449 |
440 void Oddball::OddballVerify() { | 450 void Oddball::OddballVerify() { |
441 CHECK(IsOddball()); | 451 CHECK(IsOddball()); |
442 VerifyHeapPointer(to_string()); | 452 VerifyHeapPointer(to_string()); |
443 Object* number = to_number(); | 453 Object* number = to_number(); |
444 if (number->IsHeapObject()) { | 454 if (number->IsHeapObject()) { |
445 ASSERT(number == HEAP->nan_value()); | 455 ASSERT(number == HEAP->nan_value()); |
446 } else { | 456 } else { |
447 ASSERT(number->IsSmi()); | 457 ASSERT(number->IsSmi()); |
448 int value = Smi::cast(number)->value(); | 458 int value = Smi::cast(number)->value(); |
| 459 ASSERT(value <= 1); |
449 // Hidden oddballs have negative smis. | 460 // Hidden oddballs have negative smis. |
450 const int kLeastHiddenOddballNumber = -4; | |
451 ASSERT(value <= 1); | |
452 ASSERT(value >= kLeastHiddenOddballNumber); | 461 ASSERT(value >= kLeastHiddenOddballNumber); |
453 } | 462 } |
454 } | 463 } |
455 | 464 |
456 | 465 |
457 void JSGlobalPropertyCell::JSGlobalPropertyCellVerify() { | 466 void JSGlobalPropertyCell::JSGlobalPropertyCellVerify() { |
458 CHECK(IsJSGlobalPropertyCell()); | 467 CHECK(IsJSGlobalPropertyCell()); |
459 VerifyObjectField(kValueOffset); | 468 VerifyObjectField(kValueOffset); |
460 } | 469 } |
461 | 470 |
462 | 471 |
463 void Code::CodeVerify() { | 472 void Code::CodeVerify() { |
464 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()), | 473 CHECK(IsAligned(reinterpret_cast<intptr_t>(instruction_start()), |
465 kCodeAlignment)); | 474 kCodeAlignment)); |
| 475 relocation_info()->Verify(); |
466 Address last_gc_pc = NULL; | 476 Address last_gc_pc = NULL; |
467 for (RelocIterator it(this); !it.done(); it.next()) { | 477 for (RelocIterator it(this); !it.done(); it.next()) { |
468 it.rinfo()->Verify(); | 478 it.rinfo()->Verify(); |
469 // Ensure that GC will not iterate twice over the same pointer. | 479 // Ensure that GC will not iterate twice over the same pointer. |
470 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) { | 480 if (RelocInfo::IsGCRelocMode(it.rinfo()->rmode())) { |
471 CHECK(it.rinfo()->pc() != last_gc_pc); | 481 CHECK(it.rinfo()->pc() != last_gc_pc); |
472 last_gc_pc = it.rinfo()->pc(); | 482 last_gc_pc = it.rinfo()->pc(); |
473 } | 483 } |
474 } | 484 } |
475 } | 485 } |
476 | 486 |
477 | 487 |
478 void JSArray::JSArrayVerify() { | 488 void JSArray::JSArrayVerify() { |
479 JSObjectVerify(); | 489 JSObjectVerify(); |
480 ASSERT(length()->IsNumber() || length()->IsUndefined()); | 490 ASSERT(length()->IsNumber() || length()->IsUndefined()); |
481 ASSERT(elements()->IsUndefined() || | 491 ASSERT(elements()->IsUndefined() || |
482 elements()->IsFixedArray() || | 492 elements()->IsFixedArray() || |
483 elements()->IsFixedDoubleArray()); | 493 elements()->IsFixedDoubleArray()); |
484 } | 494 } |
485 | 495 |
486 | 496 |
487 void JSWeakMap::JSWeakMapVerify() { | 497 void JSWeakMap::JSWeakMapVerify() { |
488 CHECK(IsJSWeakMap()); | 498 CHECK(IsJSWeakMap()); |
489 JSObjectVerify(); | 499 JSObjectVerify(); |
490 VerifyHeapPointer(table()); | 500 VerifyHeapPointer(table()); |
491 ASSERT(table()->IsHashTable()); | 501 ASSERT(table()->IsHashTable() || table()->IsUndefined()); |
492 } | 502 } |
493 | 503 |
494 | 504 |
495 void JSRegExp::JSRegExpVerify() { | 505 void JSRegExp::JSRegExpVerify() { |
496 JSObjectVerify(); | 506 JSObjectVerify(); |
497 ASSERT(data()->IsUndefined() || data()->IsFixedArray()); | 507 ASSERT(data()->IsUndefined() || data()->IsFixedArray()); |
498 switch (TypeTag()) { | 508 switch (TypeTag()) { |
499 case JSRegExp::ATOM: { | 509 case JSRegExp::ATOM: { |
500 FixedArray* arr = FixedArray::cast(data()); | 510 FixedArray* arr = FixedArray::cast(data()); |
501 ASSERT(arr->get(JSRegExp::kAtomPatternIndex)->IsString()); | 511 ASSERT(arr->get(JSRegExp::kAtomPatternIndex)->IsString()); |
(...skipping 26 matching lines...) Expand all Loading... |
528 } | 538 } |
529 default: | 539 default: |
530 ASSERT_EQ(JSRegExp::NOT_COMPILED, TypeTag()); | 540 ASSERT_EQ(JSRegExp::NOT_COMPILED, TypeTag()); |
531 ASSERT(data()->IsUndefined()); | 541 ASSERT(data()->IsUndefined()); |
532 break; | 542 break; |
533 } | 543 } |
534 } | 544 } |
535 | 545 |
536 | 546 |
537 void JSProxy::JSProxyVerify() { | 547 void JSProxy::JSProxyVerify() { |
538 ASSERT(IsJSProxy()); | 548 CHECK(IsJSProxy()); |
539 VerifyPointer(handler()); | 549 VerifyPointer(handler()); |
| 550 ASSERT(hash()->IsSmi() || hash()->IsUndefined()); |
540 } | 551 } |
541 | 552 |
542 | 553 |
543 void JSFunctionProxy::JSFunctionProxyVerify() { | 554 void JSFunctionProxy::JSFunctionProxyVerify() { |
544 ASSERT(IsJSFunctionProxy()); | 555 CHECK(IsJSFunctionProxy()); |
545 JSProxyVerify(); | 556 JSProxyVerify(); |
546 VerifyPointer(call_trap()); | 557 VerifyPointer(call_trap()); |
547 VerifyPointer(construct_trap()); | 558 VerifyPointer(construct_trap()); |
548 } | 559 } |
549 | 560 |
550 | 561 |
551 void Foreign::ForeignVerify() { | 562 void Foreign::ForeignVerify() { |
552 ASSERT(IsForeign()); | 563 ASSERT(IsForeign()); |
553 } | 564 } |
554 | 565 |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 ASSERT(e->IsUndefined()); | 819 ASSERT(e->IsUndefined()); |
809 } | 820 } |
810 } | 821 } |
811 } | 822 } |
812 } | 823 } |
813 | 824 |
814 | 825 |
815 #endif // DEBUG | 826 #endif // DEBUG |
816 | 827 |
817 } } // namespace v8::internal | 828 } } // namespace v8::internal |
OLD | NEW |