| OLD | NEW |
| 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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 break; | 97 break; |
| 98 case CONSTANT_POOL_ARRAY_TYPE: | 98 case CONSTANT_POOL_ARRAY_TYPE: |
| 99 ConstantPoolArray::cast(this)->ConstantPoolArrayVerify(); | 99 ConstantPoolArray::cast(this)->ConstantPoolArrayVerify(); |
| 100 break; | 100 break; |
| 101 case BYTE_ARRAY_TYPE: | 101 case BYTE_ARRAY_TYPE: |
| 102 ByteArray::cast(this)->ByteArrayVerify(); | 102 ByteArray::cast(this)->ByteArrayVerify(); |
| 103 break; | 103 break; |
| 104 case FREE_SPACE_TYPE: | 104 case FREE_SPACE_TYPE: |
| 105 FreeSpace::cast(this)->FreeSpaceVerify(); | 105 FreeSpace::cast(this)->FreeSpaceVerify(); |
| 106 break; | 106 break; |
| 107 case EXTERNAL_PIXEL_ARRAY_TYPE: | 107 |
| 108 ExternalPixelArray::cast(this)->ExternalPixelArrayVerify(); | 108 #define VERIFY_TYPED_ARRAY(Type, type, TYPE, ctype, size) \ |
| 109 case EXTERNAL_##TYPE##_ARRAY_TYPE: \ |
| 110 External##Type##Array::cast(this)->External##Type##ArrayVerify(); \ |
| 111 break; \ |
| 112 case FIXED_##TYPE##_ARRAY_TYPE: \ |
| 113 Fixed##Type##Array::cast(this)->FixedTypedArrayVerify(); \ |
| 109 break; | 114 break; |
| 110 case EXTERNAL_BYTE_ARRAY_TYPE: | 115 |
| 111 ExternalByteArray::cast(this)->ExternalByteArrayVerify(); | 116 TYPED_ARRAYS(VERIFY_TYPED_ARRAY) |
| 112 break; | 117 #undef VERIFY_TYPED_ARRAY |
| 113 case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: | 118 |
| 114 ExternalUnsignedByteArray::cast(this)->ExternalUnsignedByteArrayVerify(); | |
| 115 break; | |
| 116 case EXTERNAL_SHORT_ARRAY_TYPE: | |
| 117 ExternalShortArray::cast(this)->ExternalShortArrayVerify(); | |
| 118 break; | |
| 119 case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: | |
| 120 ExternalUnsignedShortArray::cast(this)-> | |
| 121 ExternalUnsignedShortArrayVerify(); | |
| 122 break; | |
| 123 case EXTERNAL_INT_ARRAY_TYPE: | |
| 124 ExternalIntArray::cast(this)->ExternalIntArrayVerify(); | |
| 125 break; | |
| 126 case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: | |
| 127 ExternalUnsignedIntArray::cast(this)->ExternalUnsignedIntArrayVerify(); | |
| 128 break; | |
| 129 case EXTERNAL_FLOAT_ARRAY_TYPE: | |
| 130 ExternalFloatArray::cast(this)->ExternalFloatArrayVerify(); | |
| 131 break; | |
| 132 case EXTERNAL_DOUBLE_ARRAY_TYPE: | |
| 133 ExternalDoubleArray::cast(this)->ExternalDoubleArrayVerify(); | |
| 134 break; | |
| 135 case FIXED_UINT8_ARRAY_TYPE: | |
| 136 FixedUint8Array::cast(this)->FixedTypedArrayVerify(); | |
| 137 break; | |
| 138 case FIXED_INT8_ARRAY_TYPE: | |
| 139 FixedInt8Array::cast(this)->FixedTypedArrayVerify(); | |
| 140 break; | |
| 141 case FIXED_UINT16_ARRAY_TYPE: | |
| 142 FixedUint16Array::cast(this)->FixedTypedArrayVerify(); | |
| 143 break; | |
| 144 case FIXED_INT16_ARRAY_TYPE: | |
| 145 FixedInt16Array::cast(this)->FixedTypedArrayVerify(); | |
| 146 break; | |
| 147 case FIXED_UINT32_ARRAY_TYPE: | |
| 148 FixedUint32Array::cast(this)->FixedTypedArrayVerify(); | |
| 149 break; | |
| 150 case FIXED_INT32_ARRAY_TYPE: | |
| 151 FixedInt32Array::cast(this)->FixedTypedArrayVerify(); | |
| 152 break; | |
| 153 case FIXED_FLOAT32_ARRAY_TYPE: | |
| 154 FixedFloat32Array::cast(this)->FixedTypedArrayVerify(); | |
| 155 break; | |
| 156 case FIXED_FLOAT64_ARRAY_TYPE: | |
| 157 FixedFloat64Array::cast(this)->FixedTypedArrayVerify(); | |
| 158 break; | |
| 159 case FIXED_UINT8_CLAMPED_ARRAY_TYPE: | |
| 160 FixedUint8ClampedArray::cast(this)->FixedTypedArrayVerify(); | |
| 161 break; | |
| 162 case CODE_TYPE: | 119 case CODE_TYPE: |
| 163 Code::cast(this)->CodeVerify(); | 120 Code::cast(this)->CodeVerify(); |
| 164 break; | 121 break; |
| 165 case ODDBALL_TYPE: | 122 case ODDBALL_TYPE: |
| 166 Oddball::cast(this)->OddballVerify(); | 123 Oddball::cast(this)->OddballVerify(); |
| 167 break; | 124 break; |
| 168 case JS_OBJECT_TYPE: | 125 case JS_OBJECT_TYPE: |
| 169 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: | 126 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: |
| 170 JSObject::cast(this)->JSObjectVerify(); | 127 JSObject::cast(this)->JSObjectVerify(); |
| 171 break; | 128 break; |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 void ByteArray::ByteArrayVerify() { | 239 void ByteArray::ByteArrayVerify() { |
| 283 CHECK(IsByteArray()); | 240 CHECK(IsByteArray()); |
| 284 } | 241 } |
| 285 | 242 |
| 286 | 243 |
| 287 void FreeSpace::FreeSpaceVerify() { | 244 void FreeSpace::FreeSpaceVerify() { |
| 288 CHECK(IsFreeSpace()); | 245 CHECK(IsFreeSpace()); |
| 289 } | 246 } |
| 290 | 247 |
| 291 | 248 |
| 292 void ExternalPixelArray::ExternalPixelArrayVerify() { | 249 #define EXTERNAL_ARRAY_VERIFY(Type, type, TYPE, ctype, size) \ |
| 293 CHECK(IsExternalPixelArray()); | 250 void External##Type##Array::External##Type##ArrayVerify() { \ |
| 294 } | 251 CHECK(IsExternal##Type##Array()); \ |
| 252 } |
| 295 | 253 |
| 296 | 254 TYPED_ARRAYS(EXTERNAL_ARRAY_VERIFY) |
| 297 void ExternalByteArray::ExternalByteArrayVerify() { | 255 #undef EXTERNAL_ARRAY_VERIFY |
| 298 CHECK(IsExternalByteArray()); | |
| 299 } | |
| 300 | |
| 301 | |
| 302 void ExternalUnsignedByteArray::ExternalUnsignedByteArrayVerify() { | |
| 303 CHECK(IsExternalUnsignedByteArray()); | |
| 304 } | |
| 305 | |
| 306 | |
| 307 void ExternalShortArray::ExternalShortArrayVerify() { | |
| 308 CHECK(IsExternalShortArray()); | |
| 309 } | |
| 310 | |
| 311 | |
| 312 void ExternalUnsignedShortArray::ExternalUnsignedShortArrayVerify() { | |
| 313 CHECK(IsExternalUnsignedShortArray()); | |
| 314 } | |
| 315 | |
| 316 | |
| 317 void ExternalIntArray::ExternalIntArrayVerify() { | |
| 318 CHECK(IsExternalIntArray()); | |
| 319 } | |
| 320 | |
| 321 | |
| 322 void ExternalUnsignedIntArray::ExternalUnsignedIntArrayVerify() { | |
| 323 CHECK(IsExternalUnsignedIntArray()); | |
| 324 } | |
| 325 | |
| 326 | |
| 327 void ExternalFloatArray::ExternalFloatArrayVerify() { | |
| 328 CHECK(IsExternalFloatArray()); | |
| 329 } | |
| 330 | |
| 331 | |
| 332 void ExternalDoubleArray::ExternalDoubleArrayVerify() { | |
| 333 CHECK(IsExternalDoubleArray()); | |
| 334 } | |
| 335 | 256 |
| 336 | 257 |
| 337 template <class Traits> | 258 template <class Traits> |
| 338 void FixedTypedArray<Traits>::FixedTypedArrayVerify() { | 259 void FixedTypedArray<Traits>::FixedTypedArrayVerify() { |
| 339 CHECK(IsHeapObject() && | 260 CHECK(IsHeapObject() && |
| 340 HeapObject::cast(this)->map()->instance_type() == | 261 HeapObject::cast(this)->map()->instance_type() == |
| 341 Traits::kInstanceType); | 262 Traits::kInstanceType); |
| 342 } | 263 } |
| 343 | 264 |
| 344 | 265 |
| 345 bool JSObject::ElementsAreSafeToExamine() { | 266 bool JSObject::ElementsAreSafeToExamine() { |
| 346 return (FLAG_use_gvn && FLAG_use_allocation_folding) || | 267 // If a GC was caused while constructing this object, the elements |
| 347 reinterpret_cast<Map*>(elements()) != | 268 // pointer may point to a one pointer filler map. |
| 269 return reinterpret_cast<Map*>(elements()) != |
| 348 GetHeap()->one_pointer_filler_map(); | 270 GetHeap()->one_pointer_filler_map(); |
| 349 } | 271 } |
| 350 | 272 |
| 351 | 273 |
| 352 void JSObject::JSObjectVerify() { | 274 void JSObject::JSObjectVerify() { |
| 353 VerifyHeapPointer(properties()); | 275 VerifyHeapPointer(properties()); |
| 354 VerifyHeapPointer(elements()); | 276 VerifyHeapPointer(elements()); |
| 355 | 277 |
| 356 if (GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS) { | 278 if (GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS) { |
| 357 CHECK(this->elements()->IsFixedArray()); | 279 CHECK(this->elements()->IsFixedArray()); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 | 361 |
| 440 void PolymorphicCodeCache::PolymorphicCodeCacheVerify() { | 362 void PolymorphicCodeCache::PolymorphicCodeCacheVerify() { |
| 441 VerifyHeapPointer(cache()); | 363 VerifyHeapPointer(cache()); |
| 442 CHECK(cache()->IsUndefined() || cache()->IsPolymorphicCodeCacheHashTable()); | 364 CHECK(cache()->IsUndefined() || cache()->IsPolymorphicCodeCacheHashTable()); |
| 443 } | 365 } |
| 444 | 366 |
| 445 | 367 |
| 446 void TypeFeedbackInfo::TypeFeedbackInfoVerify() { | 368 void TypeFeedbackInfo::TypeFeedbackInfoVerify() { |
| 447 VerifyObjectField(kStorage1Offset); | 369 VerifyObjectField(kStorage1Offset); |
| 448 VerifyObjectField(kStorage2Offset); | 370 VerifyObjectField(kStorage2Offset); |
| 449 VerifyHeapPointer(type_feedback_cells()); | 371 VerifyHeapPointer(feedback_vector()); |
| 450 } | 372 } |
| 451 | 373 |
| 452 | 374 |
| 453 void AliasedArgumentsEntry::AliasedArgumentsEntryVerify() { | 375 void AliasedArgumentsEntry::AliasedArgumentsEntryVerify() { |
| 454 VerifySmiField(kAliasedContextSlot); | 376 VerifySmiField(kAliasedContextSlot); |
| 455 } | 377 } |
| 456 | 378 |
| 457 | 379 |
| 458 void FixedArray::FixedArrayVerify() { | 380 void FixedArray::FixedArrayVerify() { |
| 459 for (int i = 0; i < length(); i++) { | 381 for (int i = 0; i < length(); i++) { |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 | 484 |
| 563 | 485 |
| 564 void JSMessageObject::JSMessageObjectVerify() { | 486 void JSMessageObject::JSMessageObjectVerify() { |
| 565 CHECK(IsJSMessageObject()); | 487 CHECK(IsJSMessageObject()); |
| 566 CHECK(type()->IsString()); | 488 CHECK(type()->IsString()); |
| 567 CHECK(arguments()->IsJSArray()); | 489 CHECK(arguments()->IsJSArray()); |
| 568 VerifyObjectField(kStartPositionOffset); | 490 VerifyObjectField(kStartPositionOffset); |
| 569 VerifyObjectField(kEndPositionOffset); | 491 VerifyObjectField(kEndPositionOffset); |
| 570 VerifyObjectField(kArgumentsOffset); | 492 VerifyObjectField(kArgumentsOffset); |
| 571 VerifyObjectField(kScriptOffset); | 493 VerifyObjectField(kScriptOffset); |
| 572 VerifyObjectField(kStackTraceOffset); | |
| 573 VerifyObjectField(kStackFramesOffset); | 494 VerifyObjectField(kStackFramesOffset); |
| 574 } | 495 } |
| 575 | 496 |
| 576 | 497 |
| 577 void String::StringVerify() { | 498 void String::StringVerify() { |
| 578 CHECK(IsString()); | 499 CHECK(IsString()); |
| 579 CHECK(length() >= 0 && length() <= Smi::kMaxValue); | 500 CHECK(length() >= 0 && length() <= Smi::kMaxValue); |
| 580 if (IsInternalizedString()) { | 501 if (IsInternalizedString()) { |
| 581 CHECK(!GetHeap()->InNewSpace(this)); | 502 CHECK(!GetHeap()->InNewSpace(this)); |
| 582 } | 503 } |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 708 last_gc_pc = it.rinfo()->pc(); | 629 last_gc_pc = it.rinfo()->pc(); |
| 709 } | 630 } |
| 710 } | 631 } |
| 711 } | 632 } |
| 712 | 633 |
| 713 | 634 |
| 714 void Code::VerifyEmbeddedObjectsDependency() { | 635 void Code::VerifyEmbeddedObjectsDependency() { |
| 715 int mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); | 636 int mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); |
| 716 for (RelocIterator it(this, mode_mask); !it.done(); it.next()) { | 637 for (RelocIterator it(this, mode_mask); !it.done(); it.next()) { |
| 717 Object* obj = it.rinfo()->target_object(); | 638 Object* obj = it.rinfo()->target_object(); |
| 718 if (IsWeakEmbeddedObject(kind(), obj)) { | 639 if (IsWeakObject(obj)) { |
| 719 if (obj->IsMap()) { | 640 if (obj->IsMap()) { |
| 720 Map* map = Map::cast(obj); | 641 Map* map = Map::cast(obj); |
| 721 CHECK(map->dependent_code()->Contains( | 642 CHECK(map->dependent_code()->Contains( |
| 722 DependentCode::kWeaklyEmbeddedGroup, this)); | 643 DependentCode::kWeaklyEmbeddedGroup, this)); |
| 723 } else if (obj->IsJSObject()) { | 644 } else if (obj->IsJSObject()) { |
| 724 Object* raw_table = GetIsolate()->heap()->weak_object_to_code_table(); | 645 Object* raw_table = GetIsolate()->heap()->weak_object_to_code_table(); |
| 725 WeakHashTable* table = WeakHashTable::cast(raw_table); | 646 WeakHashTable* table = WeakHashTable::cast(raw_table); |
| 726 CHECK(DependentCode::cast(table->Lookup(obj))->Contains( | 647 CHECK(DependentCode::cast(table->Lookup(obj))->Contains( |
| 727 DependentCode::kWeaklyEmbeddedGroup, this)); | 648 DependentCode::kWeaklyEmbeddedGroup, this)); |
| 728 } | 649 } |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1107 FixedArray* e = FixedArray::cast(elements()); | 1028 FixedArray* e = FixedArray::cast(elements()); |
| 1108 int len = e->length(); | 1029 int len = e->length(); |
| 1109 Heap* heap = GetHeap(); | 1030 Heap* heap = GetHeap(); |
| 1110 for (int i = 0; i < len; i++) { | 1031 for (int i = 0; i < len; i++) { |
| 1111 if (e->get(i) == heap->the_hole_value()) holes++; | 1032 if (e->get(i) == heap->the_hole_value()) holes++; |
| 1112 } | 1033 } |
| 1113 info->number_of_fast_used_elements_ += len - holes; | 1034 info->number_of_fast_used_elements_ += len - holes; |
| 1114 info->number_of_fast_unused_elements_ += holes; | 1035 info->number_of_fast_unused_elements_ += holes; |
| 1115 break; | 1036 break; |
| 1116 } | 1037 } |
| 1117 case EXTERNAL_BYTE_ELEMENTS: | 1038 |
| 1118 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: | 1039 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
| 1119 case EXTERNAL_SHORT_ELEMENTS: | 1040 case EXTERNAL_##TYPE##_ELEMENTS: \ |
| 1120 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: | 1041 case TYPE##_ELEMENTS: |
| 1121 case EXTERNAL_INT_ELEMENTS: | 1042 |
| 1122 case EXTERNAL_UNSIGNED_INT_ELEMENTS: | 1043 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
| 1123 case EXTERNAL_FLOAT_ELEMENTS: | 1044 #undef TYPED_ARRAY_CASE |
| 1124 case EXTERNAL_DOUBLE_ELEMENTS: | 1045 { info->number_of_objects_with_fast_elements_++; |
| 1125 case EXTERNAL_PIXEL_ELEMENTS: | |
| 1126 case UINT8_ELEMENTS: | |
| 1127 case INT8_ELEMENTS: | |
| 1128 case UINT16_ELEMENTS: | |
| 1129 case INT16_ELEMENTS: | |
| 1130 case UINT32_ELEMENTS: | |
| 1131 case INT32_ELEMENTS: | |
| 1132 case FLOAT32_ELEMENTS: | |
| 1133 case FLOAT64_ELEMENTS: | |
| 1134 case UINT8_CLAMPED_ELEMENTS: { | |
| 1135 info->number_of_objects_with_fast_elements_++; | |
| 1136 FixedArrayBase* e = FixedArrayBase::cast(elements()); | 1046 FixedArrayBase* e = FixedArrayBase::cast(elements()); |
| 1137 info->number_of_fast_used_elements_ += e->length(); | 1047 info->number_of_fast_used_elements_ += e->length(); |
| 1138 break; | 1048 break; |
| 1139 } | 1049 } |
| 1140 case DICTIONARY_ELEMENTS: { | 1050 case DICTIONARY_ELEMENTS: { |
| 1141 SeededNumberDictionary* dict = element_dictionary(); | 1051 SeededNumberDictionary* dict = element_dictionary(); |
| 1142 info->number_of_slow_used_elements_ += dict->NumberOfElements(); | 1052 info->number_of_slow_used_elements_ += dict->NumberOfElements(); |
| 1143 info->number_of_slow_unused_elements_ += | 1053 info->number_of_slow_unused_elements_ += |
| 1144 dict->Capacity() - dict->NumberOfElements(); | 1054 dict->Capacity() - dict->NumberOfElements(); |
| 1145 break; | 1055 break; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1241 for (int i = 0; i < number_of_transitions(); ++i) { | 1151 for (int i = 0; i < number_of_transitions(); ++i) { |
| 1242 if (!CheckOneBackPointer(current_map, GetTarget(i))) return false; | 1152 if (!CheckOneBackPointer(current_map, GetTarget(i))) return false; |
| 1243 } | 1153 } |
| 1244 return true; | 1154 return true; |
| 1245 } | 1155 } |
| 1246 | 1156 |
| 1247 | 1157 |
| 1248 #endif // DEBUG | 1158 #endif // DEBUG |
| 1249 | 1159 |
| 1250 } } // namespace v8::internal | 1160 } } // namespace v8::internal |
| OLD | NEW |