diff options
Diffstat (limited to 'src/3rdparty/v8/src/objects-debug.cc')
-rw-r--r-- | src/3rdparty/v8/src/objects-debug.cc | 346 |
1 files changed, 169 insertions, 177 deletions
diff --git a/src/3rdparty/v8/src/objects-debug.cc b/src/3rdparty/v8/src/objects-debug.cc index 9006abd..c2f64d4 100644 --- a/src/3rdparty/v8/src/objects-debug.cc +++ b/src/3rdparty/v8/src/objects-debug.cc @@ -35,7 +35,7 @@ namespace v8 { namespace internal { -#ifdef DEBUG +#ifdef VERIFY_HEAP void MaybeObject::Verify() { Object* this_as_object; @@ -55,18 +55,18 @@ void Object::VerifyPointer(Object* p) { if (p->IsHeapObject()) { HeapObject::VerifyHeapPointer(p); } else { - ASSERT(p->IsSmi()); + CHECK(p->IsSmi()); } } void Smi::SmiVerify() { - ASSERT(IsSmi()); + CHECK(IsSmi()); } void Failure::FailureVerify() { - ASSERT(IsFailure()); + CHECK(IsFailure()); } @@ -207,68 +207,68 @@ void HeapObject::HeapObjectVerify() { void HeapObject::VerifyHeapPointer(Object* p) { - ASSERT(p->IsHeapObject()); - ASSERT(HEAP->Contains(HeapObject::cast(p))); + CHECK(p->IsHeapObject()); + CHECK(HEAP->Contains(HeapObject::cast(p))); } void HeapNumber::HeapNumberVerify() { - ASSERT(IsHeapNumber()); + CHECK(IsHeapNumber()); } void ByteArray::ByteArrayVerify() { - ASSERT(IsByteArray()); + CHECK(IsByteArray()); } void FreeSpace::FreeSpaceVerify() { - ASSERT(IsFreeSpace()); + CHECK(IsFreeSpace()); } void ExternalPixelArray::ExternalPixelArrayVerify() { - ASSERT(IsExternalPixelArray()); + CHECK(IsExternalPixelArray()); } void ExternalByteArray::ExternalByteArrayVerify() { - ASSERT(IsExternalByteArray()); + CHECK(IsExternalByteArray()); } void ExternalUnsignedByteArray::ExternalUnsignedByteArrayVerify() { - ASSERT(IsExternalUnsignedByteArray()); + CHECK(IsExternalUnsignedByteArray()); } void ExternalShortArray::ExternalShortArrayVerify() { - ASSERT(IsExternalShortArray()); + CHECK(IsExternalShortArray()); } void ExternalUnsignedShortArray::ExternalUnsignedShortArrayVerify() { - ASSERT(IsExternalUnsignedShortArray()); + CHECK(IsExternalUnsignedShortArray()); } void ExternalIntArray::ExternalIntArrayVerify() { - ASSERT(IsExternalIntArray()); + CHECK(IsExternalIntArray()); } void ExternalUnsignedIntArray::ExternalUnsignedIntArrayVerify() { - ASSERT(IsExternalUnsignedIntArray()); + CHECK(IsExternalUnsignedIntArray()); } void ExternalFloatArray::ExternalFloatArrayVerify() { - ASSERT(IsExternalFloatArray()); + CHECK(IsExternalFloatArray()); } void ExternalDoubleArray::ExternalDoubleArrayVerify() { - ASSERT(IsExternalDoubleArray()); + CHECK(IsExternalDoubleArray()); } @@ -277,8 +277,8 @@ void JSObject::JSObjectVerify() { VerifyHeapPointer(elements()); if (GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS) { - ASSERT(this->elements()->IsFixedArray()); - ASSERT(this->elements()->length() >= 2); + CHECK(this->elements()->IsFixedArray()); + CHECK_GE(this->elements()->length(), 2); } if (HasFastProperties()) { @@ -286,35 +286,41 @@ void JSObject::JSObjectVerify() { (map()->inobject_properties() + properties()->length() - map()->NextFreePropertyIndex())); } - ASSERT_EQ((map()->has_fast_elements() || - map()->has_fast_smi_only_elements() || + CHECK_EQ((map()->has_fast_smi_or_object_elements() || (elements() == GetHeap()->empty_fixed_array())), (elements()->map() == GetHeap()->fixed_array_map() || elements()->map() == GetHeap()->fixed_cow_array_map())); - ASSERT(map()->has_fast_elements() == HasFastElements()); + CHECK(map()->has_fast_object_elements() == HasFastObjectElements()); } void Map::MapVerify() { - ASSERT(!HEAP->InNewSpace(this)); - ASSERT(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE); - ASSERT(instance_size() == kVariableSizeSentinel || + CHECK(!HEAP->InNewSpace(this)); + CHECK(FIRST_TYPE <= instance_type() && instance_type() <= LAST_TYPE); + CHECK(instance_size() == kVariableSizeSentinel || (kPointerSize <= instance_size() && instance_size() < HEAP->Capacity())); VerifyHeapPointer(prototype()); VerifyHeapPointer(instance_descriptors()); + DescriptorArray* descriptors = instance_descriptors(); + for (int i = 0; i < NumberOfOwnDescriptors(); ++i) { + CHECK_EQ(i, descriptors->GetDetails(i).descriptor_index() - 1); + } SLOW_ASSERT(instance_descriptors()->IsSortedNoDuplicates()); - SLOW_ASSERT(instance_descriptors()->IsConsistentWithBackPointers(this)); + if (HasTransitionArray()) { + SLOW_ASSERT(transitions()->IsSortedNoDuplicates()); + SLOW_ASSERT(transitions()->IsConsistentWithBackPointers(this)); + } } void Map::SharedMapVerify() { MapVerify(); - ASSERT(is_shared()); - ASSERT(instance_descriptors()->IsEmpty()); - ASSERT_EQ(0, pre_allocated_property_fields()); - ASSERT_EQ(0, unused_property_fields()); - ASSERT_EQ(StaticVisitorBase::GetVisitorId(instance_type(), instance_size()), + CHECK(is_shared()); + CHECK(instance_descriptors()->IsEmpty()); + CHECK_EQ(0, pre_allocated_property_fields()); + CHECK_EQ(0, unused_property_fields()); + CHECK_EQ(StaticVisitorBase::GetVisitorId(instance_type(), instance_size()), visitor_id()); } @@ -322,21 +328,21 @@ void Map::SharedMapVerify() { void CodeCache::CodeCacheVerify() { VerifyHeapPointer(default_cache()); VerifyHeapPointer(normal_type_cache()); - ASSERT(default_cache()->IsFixedArray()); - ASSERT(normal_type_cache()->IsUndefined() + CHECK(default_cache()->IsFixedArray()); + CHECK(normal_type_cache()->IsUndefined() || normal_type_cache()->IsCodeCacheHashTable()); } void PolymorphicCodeCache::PolymorphicCodeCacheVerify() { VerifyHeapPointer(cache()); - ASSERT(cache()->IsUndefined() || cache()->IsPolymorphicCodeCacheHashTable()); + CHECK(cache()->IsUndefined() || cache()->IsPolymorphicCodeCacheHashTable()); } void TypeFeedbackInfo::TypeFeedbackInfoVerify() { - VerifyObjectField(kIcTotalCountOffset); - VerifyObjectField(kIcWithTypeinfoCountOffset); + VerifyObjectField(kStorage1Offset); + VerifyObjectField(kStorage2Offset); VerifyHeapPointer(type_feedback_cells()); } @@ -362,7 +368,7 @@ void FixedDoubleArray::FixedDoubleArrayVerify() { for (int i = 0; i < length(); i++) { if (!is_the_hole(i)) { double value = get_scalar(i); - ASSERT(!isnan(value) || + CHECK(!isnan(value) || (BitCast<uint64_t>(value) == BitCast<uint64_t>(canonical_not_the_hole_nan_as_double())) || ((BitCast<uint64_t>(value) & Double::kSignMask) != 0)); @@ -372,11 +378,10 @@ void FixedDoubleArray::FixedDoubleArrayVerify() { void JSModule::JSModuleVerify() { - Object* v = context(); - if (v->IsHeapObject()) { - VerifyHeapPointer(v); - } - CHECK(v->IsUndefined() || v->IsModuleContext()); + VerifyObjectField(kContextOffset); + VerifyObjectField(kScopeInfoOffset); + CHECK(context()->IsUndefined() || + Context::cast(context())->IsModuleContext()); } @@ -458,10 +463,17 @@ void String::StringVerify() { ConsString::cast(this)->ConsStringVerify(); } else if (IsSlicedString()) { SlicedString::cast(this)->SlicedStringVerify(); + } else if (IsSeqAsciiString()) { + SeqAsciiString::cast(this)->SeqAsciiStringVerify(); } } +void SeqAsciiString::SeqAsciiStringVerify() { + CHECK(String::IsAscii(GetChars(), length())); +} + + void ConsString::ConsStringVerify() { CHECK(this->first()->IsString()); CHECK(this->second() == GetHeap()->empty_string() || @@ -487,7 +499,8 @@ void JSFunction::JSFunctionVerify() { VerifyObjectField(kPrototypeOrInitialMapOffset); VerifyObjectField(kNextFunctionLinkOffset); CHECK(code()->IsCode()); - CHECK(next_function_link()->IsUndefined() || + CHECK(next_function_link() == NULL || + next_function_link()->IsUndefined() || next_function_link()->IsJSFunction()); } @@ -496,6 +509,7 @@ void SharedFunctionInfo::SharedFunctionInfoVerify() { CHECK(IsSharedFunctionInfo()); VerifyObjectField(kNameOffset); VerifyObjectField(kCodeOffset); + VerifyObjectField(kOptimizedCodeMapOffset); VerifyObjectField(kScopeInfoOffset); VerifyObjectField(kInstanceClassNameOffset); VerifyObjectField(kFunctionDataOffset); @@ -507,10 +521,10 @@ void SharedFunctionInfo::SharedFunctionInfoVerify() { void JSGlobalProxy::JSGlobalProxyVerify() { CHECK(IsJSGlobalProxy()); JSObjectVerify(); - VerifyObjectField(JSGlobalProxy::kContextOffset); + VerifyObjectField(JSGlobalProxy::kNativeContextOffset); // Make sure that this object has no properties, elements. CHECK_EQ(0, properties()->length()); - CHECK(HasFastElements()); + CHECK(HasFastObjectElements()); CHECK_EQ(0, FixedArray::cast(elements())->length()); } @@ -542,14 +556,14 @@ void Oddball::OddballVerify() { VerifyHeapPointer(to_string()); Object* number = to_number(); if (number->IsHeapObject()) { - ASSERT(number == HEAP->nan_value()); + CHECK(number == HEAP->nan_value()); } else { - ASSERT(number->IsSmi()); + CHECK(number->IsSmi()); int value = Smi::cast(number)->value(); // Hidden oddballs have negative smis. const int kLeastHiddenOddballNumber = -4; - ASSERT(value <= 1); - ASSERT(value >= kLeastHiddenOddballNumber); + CHECK_LE(value, 1); + CHECK(value >= kLeastHiddenOddballNumber); } } @@ -578,8 +592,8 @@ void Code::CodeVerify() { void JSArray::JSArrayVerify() { JSObjectVerify(); - ASSERT(length()->IsNumber() || length()->IsUndefined()); - ASSERT(elements()->IsUndefined() || + CHECK(length()->IsNumber() || length()->IsUndefined()); + CHECK(elements()->IsUndefined() || elements()->IsFixedArray() || elements()->IsFixedDoubleArray()); } @@ -589,7 +603,7 @@ void JSSet::JSSetVerify() { CHECK(IsJSSet()); JSObjectVerify(); VerifyHeapPointer(table()); - ASSERT(table()->IsHashTable() || table()->IsUndefined()); + CHECK(table()->IsHashTable() || table()->IsUndefined()); } @@ -597,7 +611,7 @@ void JSMap::JSMapVerify() { CHECK(IsJSMap()); JSObjectVerify(); VerifyHeapPointer(table()); - ASSERT(table()->IsHashTable() || table()->IsUndefined()); + CHECK(table()->IsHashTable() || table()->IsUndefined()); } @@ -605,17 +619,17 @@ void JSWeakMap::JSWeakMapVerify() { CHECK(IsJSWeakMap()); JSObjectVerify(); VerifyHeapPointer(table()); - ASSERT(table()->IsHashTable() || table()->IsUndefined()); + CHECK(table()->IsHashTable() || table()->IsUndefined()); } void JSRegExp::JSRegExpVerify() { JSObjectVerify(); - ASSERT(data()->IsUndefined() || data()->IsFixedArray()); + CHECK(data()->IsUndefined() || data()->IsFixedArray()); switch (TypeTag()) { case JSRegExp::ATOM: { FixedArray* arr = FixedArray::cast(data()); - ASSERT(arr->get(JSRegExp::kAtomPatternIndex)->IsString()); + CHECK(arr->get(JSRegExp::kAtomPatternIndex)->IsString()); break; } case JSRegExp::IRREGEXP: { @@ -626,26 +640,26 @@ void JSRegExp::JSRegExpVerify() { // Smi : Not compiled yet (-1) or code prepared for flushing. // JSObject: Compilation error. // Code/ByteArray: Compiled code. - ASSERT(ascii_data->IsSmi() || + CHECK(ascii_data->IsSmi() || (is_native ? ascii_data->IsCode() : ascii_data->IsByteArray())); Object* uc16_data = arr->get(JSRegExp::kIrregexpUC16CodeIndex); - ASSERT(uc16_data->IsSmi() || + CHECK(uc16_data->IsSmi() || (is_native ? uc16_data->IsCode() : uc16_data->IsByteArray())); Object* ascii_saved = arr->get(JSRegExp::kIrregexpASCIICodeSavedIndex); - ASSERT(ascii_saved->IsSmi() || ascii_saved->IsString() || + CHECK(ascii_saved->IsSmi() || ascii_saved->IsString() || ascii_saved->IsCode()); Object* uc16_saved = arr->get(JSRegExp::kIrregexpUC16CodeSavedIndex); - ASSERT(uc16_saved->IsSmi() || uc16_saved->IsString() || + CHECK(uc16_saved->IsSmi() || uc16_saved->IsString() || uc16_saved->IsCode()); - ASSERT(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi()); - ASSERT(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi()); + CHECK(arr->get(JSRegExp::kIrregexpCaptureCountIndex)->IsSmi()); + CHECK(arr->get(JSRegExp::kIrregexpMaxRegisterCountIndex)->IsSmi()); break; } default: - ASSERT_EQ(JSRegExp::NOT_COMPILED, TypeTag()); - ASSERT(data()->IsUndefined()); + CHECK_EQ(JSRegExp::NOT_COMPILED, TypeTag()); + CHECK(data()->IsUndefined()); break; } } @@ -654,7 +668,7 @@ void JSRegExp::JSRegExpVerify() { void JSProxy::JSProxyVerify() { CHECK(IsJSProxy()); VerifyPointer(handler()); - ASSERT(hash()->IsSmi() || hash()->IsUndefined()); + CHECK(hash()->IsSmi() || hash()->IsUndefined()); } @@ -667,7 +681,7 @@ void JSFunctionProxy::JSFunctionProxyVerify() { void Foreign::ForeignVerify() { - ASSERT(IsForeign()); + CHECK(IsForeign()); } @@ -678,6 +692,7 @@ void AccessorInfo::AccessorInfoVerify() { VerifyPointer(name()); VerifyPointer(data()); VerifyPointer(flag()); + VerifyPointer(expected_receiver_type()); } @@ -770,6 +785,47 @@ void Script::ScriptVerify() { } +void JSFunctionResultCache::JSFunctionResultCacheVerify() { + JSFunction::cast(get(kFactoryIndex))->Verify(); + + int size = Smi::cast(get(kCacheSizeIndex))->value(); + CHECK(kEntriesIndex <= size); + CHECK(size <= length()); + CHECK_EQ(0, size % kEntrySize); + + int finger = Smi::cast(get(kFingerIndex))->value(); + CHECK(kEntriesIndex <= finger); + CHECK((finger < size) || (finger == kEntriesIndex && finger == size)); + CHECK_EQ(0, finger % kEntrySize); + + if (FLAG_enable_slow_asserts) { + for (int i = kEntriesIndex; i < size; i++) { + CHECK(!get(i)->IsTheHole()); + get(i)->Verify(); + } + for (int i = size; i < length(); i++) { + CHECK(get(i)->IsTheHole()); + get(i)->Verify(); + } + } +} + + +void NormalizedMapCache::NormalizedMapCacheVerify() { + FixedArray::cast(this)->Verify(); + if (FLAG_enable_slow_asserts) { + for (int i = 0; i < length(); i++) { + Object* e = get(i); + if (e->IsMap()) { + Map::cast(e)->SharedMapVerify(); + } else { + CHECK(e->IsUndefined()); + } + } + } +} + + #ifdef ENABLE_DEBUGGER_SUPPORT void DebugInfo::DebugInfoVerify() { CHECK(IsDebugInfo()); @@ -788,7 +844,9 @@ void BreakPointInfo::BreakPointInfoVerify() { VerifyPointer(break_point_objects()); } #endif // ENABLE_DEBUGGER_SUPPORT +#endif // VERIFY_HEAP +#ifdef DEBUG void JSObject::IncrementSpillStatistics(SpillInformation* info) { info->number_of_objects_++; @@ -805,6 +863,11 @@ void JSObject::IncrementSpillStatistics(SpillInformation* info) { } // Indexed properties switch (GetElementsKind()) { + case FAST_HOLEY_SMI_ELEMENTS: + case FAST_SMI_ELEMENTS: + case FAST_HOLEY_DOUBLE_ELEMENTS: + case FAST_DOUBLE_ELEMENTS: + case FAST_HOLEY_ELEMENTS: case FAST_ELEMENTS: { info->number_of_objects_with_fast_elements_++; int holes = 0; @@ -818,6 +881,14 @@ void JSObject::IncrementSpillStatistics(SpillInformation* info) { info->number_of_fast_unused_elements_ += holes; break; } + case EXTERNAL_BYTE_ELEMENTS: + case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: + case EXTERNAL_SHORT_ELEMENTS: + case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: + case EXTERNAL_INT_ELEMENTS: + case EXTERNAL_UNSIGNED_INT_ELEMENTS: + case EXTERNAL_FLOAT_ELEMENTS: + case EXTERNAL_DOUBLE_ELEMENTS: case EXTERNAL_PIXEL_ELEMENTS: { info->number_of_objects_with_fast_elements_++; ExternalPixelArray* e = ExternalPixelArray::cast(elements()); @@ -831,8 +902,7 @@ void JSObject::IncrementSpillStatistics(SpillInformation* info) { dict->Capacity() - dict->NumberOfElements(); break; } - default: - UNREACHABLE(); + case NON_STRICT_ARGUMENTS_ELEMENTS: break; } } @@ -875,17 +945,18 @@ void JSObject::SpillInformation::Print() { } -bool DescriptorArray::IsSortedNoDuplicates() { +bool DescriptorArray::IsSortedNoDuplicates(int valid_entries) { + if (valid_entries == -1) valid_entries = number_of_descriptors(); String* current_key = NULL; uint32_t current = 0; for (int i = 0; i < number_of_descriptors(); i++) { - String* key = GetKey(i); + String* key = GetSortedKey(i); if (key == current_key) { PrintDescriptors(); return false; } current_key = key; - uint32_t hash = GetKey(i)->Hash(); + uint32_t hash = GetSortedKey(i)->Hash(); if (hash < current) { PrintDescriptors(); return false; @@ -896,121 +967,42 @@ bool DescriptorArray::IsSortedNoDuplicates() { } -static bool CheckOneBackPointer(Map* current_map, Object* target) { - return !target->IsMap() || Map::cast(target)->GetBackPointer() == current_map; -} - - -bool DescriptorArray::IsConsistentWithBackPointers(Map* current_map) { - for (int i = 0; i < number_of_descriptors(); ++i) { - switch (GetType(i)) { - case MAP_TRANSITION: - case CONSTANT_TRANSITION: - if (!CheckOneBackPointer(current_map, GetValue(i))) { - return false; - } - break; - case ELEMENTS_TRANSITION: { - Object* object = GetValue(i); - if (!CheckOneBackPointer(current_map, object)) { - return false; - } - if (object->IsFixedArray()) { - FixedArray* array = FixedArray::cast(object); - for (int i = 0; i < array->length(); ++i) { - if (!CheckOneBackPointer(current_map, array->get(i))) { - return false; - } - } - } - break; - } - case CALLBACKS: { - Object* object = GetValue(i); - if (object->IsAccessorPair()) { - AccessorPair* accessors = AccessorPair::cast(object); - if (!CheckOneBackPointer(current_map, accessors->getter())) { - return false; - } - if (!CheckOneBackPointer(current_map, accessors->setter())) { - return false; - } - } - break; - } - case NORMAL: - case FIELD: - case CONSTANT_FUNCTION: - case HANDLER: - case INTERCEPTOR: - case NULL_DESCRIPTOR: - break; +bool TransitionArray::IsSortedNoDuplicates(int valid_entries) { + ASSERT(valid_entries == -1); + String* current_key = NULL; + uint32_t current = 0; + for (int i = 0; i < number_of_transitions(); i++) { + String* key = GetSortedKey(i); + if (key == current_key) { + PrintTransitions(); + return false; + } + current_key = key; + uint32_t hash = GetSortedKey(i)->Hash(); + if (hash < current) { + PrintTransitions(); + return false; } + current = hash; } return true; } -void JSFunctionResultCache::JSFunctionResultCacheVerify() { - JSFunction::cast(get(kFactoryIndex))->Verify(); - - int size = Smi::cast(get(kCacheSizeIndex))->value(); - ASSERT(kEntriesIndex <= size); - ASSERT(size <= length()); - ASSERT_EQ(0, size % kEntrySize); - - int finger = Smi::cast(get(kFingerIndex))->value(); - ASSERT(kEntriesIndex <= finger); - ASSERT((finger < size) || (finger == kEntriesIndex && finger == size)); - ASSERT_EQ(0, finger % kEntrySize); - - if (FLAG_enable_slow_asserts) { - for (int i = kEntriesIndex; i < size; i++) { - ASSERT(!get(i)->IsTheHole()); - get(i)->Verify(); - } - for (int i = size; i < length(); i++) { - ASSERT(get(i)->IsTheHole()); - get(i)->Verify(); - } - } +static bool CheckOneBackPointer(Map* current_map, Object* target) { + return !target->IsMap() || Map::cast(target)->GetBackPointer() == current_map; } -void NormalizedMapCache::NormalizedMapCacheVerify() { - FixedArray::cast(this)->Verify(); - if (FLAG_enable_slow_asserts) { - for (int i = 0; i < length(); i++) { - Object* e = get(i); - if (e->IsMap()) { - Map::cast(e)->SharedMapVerify(); - } else { - ASSERT(e->IsUndefined()); - } - } +bool TransitionArray::IsConsistentWithBackPointers(Map* current_map) { + if (HasElementsTransition() && + !CheckOneBackPointer(current_map, elements_transition())) { + return false; } -} - - -void Map::ZapInstanceDescriptors() { - DescriptorArray* descriptors = instance_descriptors(); - if (descriptors == GetHeap()->empty_descriptor_array()) return; - FixedArray* contents = FixedArray::cast( - descriptors->get(DescriptorArray::kContentArrayIndex)); - MemsetPointer(descriptors->data_start(), - GetHeap()->the_hole_value(), - descriptors->length()); - MemsetPointer(contents->data_start(), - GetHeap()->the_hole_value(), - contents->length()); -} - - -void Map::ZapPrototypeTransitions() { - FixedArray* proto_transitions = prototype_transitions(); - MemsetPointer(proto_transitions->data_start(), - GetHeap()->the_hole_value(), - proto_transitions->length()); + for (int i = 0; i < number_of_transitions(); ++i) { + if (!CheckOneBackPointer(current_map, GetTarget(i))) return false; + } + return true; } |