| Index: src/objects-inl.h
|
| diff --git a/src/objects-inl.h b/src/objects-inl.h
|
| index 961041c05dd22d13be79a10564fd8f17bae0005f..991c6c6f06d7f29d1be20d10f6734f4a137f9932 100644
|
| --- a/src/objects-inl.h
|
| +++ b/src/objects-inl.h
|
| @@ -59,7 +59,7 @@ PropertyDetails::PropertyDetails(Smi* smi) {
|
| }
|
|
|
|
|
| -Smi* PropertyDetails::AsSmi() {
|
| +Smi* PropertyDetails::AsSmi() const {
|
| // Ensure the upper 2 bits have the same value by sign extending it. This is
|
| // necessary to be able to use the 31st bit of the property details.
|
| int value = value_ << 1;
|
| @@ -67,7 +67,7 @@ Smi* PropertyDetails::AsSmi() {
|
| }
|
|
|
|
|
| -PropertyDetails PropertyDetails::AsDeleted() {
|
| +PropertyDetails PropertyDetails::AsDeleted() const {
|
| Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
|
| return PropertyDetails(smi);
|
| }
|
| @@ -611,9 +611,6 @@ bool Object::IsFiller() {
|
| }
|
|
|
|
|
| -TYPE_CHECKER(ExternalPixelArray, EXTERNAL_PIXEL_ARRAY_TYPE)
|
| -
|
| -
|
| bool Object::IsExternalArray() {
|
| if (!Object::IsHeapObject())
|
| return false;
|
| @@ -624,14 +621,12 @@ bool Object::IsExternalArray() {
|
| }
|
|
|
|
|
| -TYPE_CHECKER(ExternalByteArray, EXTERNAL_BYTE_ARRAY_TYPE)
|
| -TYPE_CHECKER(ExternalUnsignedByteArray, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
|
| -TYPE_CHECKER(ExternalShortArray, EXTERNAL_SHORT_ARRAY_TYPE)
|
| -TYPE_CHECKER(ExternalUnsignedShortArray, EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
|
| -TYPE_CHECKER(ExternalIntArray, EXTERNAL_INT_ARRAY_TYPE)
|
| -TYPE_CHECKER(ExternalUnsignedIntArray, EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
|
| -TYPE_CHECKER(ExternalFloatArray, EXTERNAL_FLOAT_ARRAY_TYPE)
|
| -TYPE_CHECKER(ExternalDoubleArray, EXTERNAL_DOUBLE_ARRAY_TYPE)
|
| +#define TYPED_ARRAY_TYPE_CHECKER(Type, type, TYPE, ctype, size) \
|
| + TYPE_CHECKER(External##Type##Array, EXTERNAL_##TYPE##_ARRAY_TYPE) \
|
| + TYPE_CHECKER(Fixed##Type##Array, FIXED_##TYPE##_ARRAY_TYPE)
|
| +
|
| +TYPED_ARRAYS(TYPED_ARRAY_TYPE_CHECKER)
|
| +#undef TYPED_ARRAY_TYPE_CHECKER
|
|
|
|
|
| bool Object::IsFixedTypedArrayBase() {
|
| @@ -644,17 +639,6 @@ bool Object::IsFixedTypedArrayBase() {
|
| }
|
|
|
|
|
| -TYPE_CHECKER(FixedUint8Array, FIXED_UINT8_ARRAY_TYPE)
|
| -TYPE_CHECKER(FixedInt8Array, FIXED_INT8_ARRAY_TYPE)
|
| -TYPE_CHECKER(FixedUint16Array, FIXED_UINT16_ARRAY_TYPE)
|
| -TYPE_CHECKER(FixedInt16Array, FIXED_INT16_ARRAY_TYPE)
|
| -TYPE_CHECKER(FixedUint32Array, FIXED_UINT32_ARRAY_TYPE)
|
| -TYPE_CHECKER(FixedInt32Array, FIXED_INT32_ARRAY_TYPE)
|
| -TYPE_CHECKER(FixedFloat32Array, FIXED_FLOAT32_ARRAY_TYPE)
|
| -TYPE_CHECKER(FixedFloat64Array, FIXED_FLOAT64_ARRAY_TYPE)
|
| -TYPE_CHECKER(FixedUint8ClampedArray, FIXED_UINT8_CLAMPED_ARRAY_TYPE)
|
| -
|
| -
|
| bool MaybeObject::IsFailure() {
|
| return HAS_FAILURE_TAG(this);
|
| }
|
| @@ -776,16 +760,6 @@ bool Object::IsDependentCode() {
|
| }
|
|
|
|
|
| -bool Object::IsTypeFeedbackCells() {
|
| - if (!IsFixedArray()) return false;
|
| - // There's actually no way to see the difference between a fixed array and
|
| - // a cache cells array. Since this is used for asserts we can check that
|
| - // the length is plausible though.
|
| - if (FixedArray::cast(this)->length() % 2 != 0) return false;
|
| - return true;
|
| -}
|
| -
|
| -
|
| bool Object::IsContext() {
|
| if (!Object::IsHeapObject()) return false;
|
| Map* map = HeapObject::cast(this)->map();
|
| @@ -1566,26 +1540,32 @@ inline void AllocationSite::IncrementMementoCreateCount() {
|
| inline bool AllocationSite::DigestPretenuringFeedback() {
|
| bool decision_changed = false;
|
| int create_count = memento_create_count();
|
| - if (create_count >= kPretenureMinimumCreated) {
|
| - int found_count = memento_found_count();
|
| - double ratio = static_cast<double>(found_count) / create_count;
|
| - if (FLAG_trace_track_allocation_sites) {
|
| - PrintF("AllocationSite: %p (created, found, ratio) (%d, %d, %f)\n",
|
| - static_cast<void*>(this), create_count, found_count, ratio);
|
| - }
|
| - int current_mode = GetPretenureMode();
|
| + int found_count = memento_found_count();
|
| + bool minimum_mementos_created = create_count >= kPretenureMinimumCreated;
|
| + double ratio =
|
| + minimum_mementos_created || FLAG_trace_pretenuring_statistics ?
|
| + static_cast<double>(found_count) / create_count : 0.0;
|
| + PretenureFlag current_mode = GetPretenureMode();
|
| +
|
| + if (minimum_mementos_created) {
|
| PretenureDecision result = ratio >= kPretenureRatio
|
| ? kTenure
|
| : kDontTenure;
|
| set_pretenure_decision(result);
|
| if (current_mode != GetPretenureMode()) {
|
| decision_changed = true;
|
| - dependent_code()->MarkCodeForDeoptimization(
|
| - GetIsolate(),
|
| - DependentCode::kAllocationSiteTenuringChangedGroup);
|
| + set_deopt_dependent_code(true);
|
| }
|
| }
|
|
|
| + if (FLAG_trace_pretenuring_statistics) {
|
| + PrintF(
|
| + "AllocationSite(%p): (created, found, ratio) (%d, %d, %f) %s => %s\n",
|
| + static_cast<void*>(this), create_count, found_count, ratio,
|
| + current_mode == TENURED ? "tenured" : "not tenured",
|
| + GetPretenureMode() == TENURED ? "tenured" : "not tenured");
|
| + }
|
| +
|
| // Clear feedback calculation fields until the next gc.
|
| set_memento_found_count(0);
|
| set_memento_create_count(0);
|
| @@ -1984,18 +1964,12 @@ void JSObject::FastPropertyAtPut(int index, Object* value) {
|
|
|
|
|
| int JSObject::GetInObjectPropertyOffset(int index) {
|
| - // Adjust for the number of properties stored in the object.
|
| - index -= map()->inobject_properties();
|
| - ASSERT(index < 0);
|
| - return map()->instance_size() + (index * kPointerSize);
|
| + return map()->GetInObjectPropertyOffset(index);
|
| }
|
|
|
|
|
| Object* JSObject::InObjectPropertyAt(int index) {
|
| - // Adjust for the number of properties stored in the object.
|
| - index -= map()->inobject_properties();
|
| - ASSERT(index < 0);
|
| - int offset = map()->instance_size() + (index * kPointerSize);
|
| + int offset = GetInObjectPropertyOffset(index);
|
| return READ_FIELD(this, offset);
|
| }
|
|
|
| @@ -2004,9 +1978,7 @@ Object* JSObject::InObjectPropertyAtPut(int index,
|
| Object* value,
|
| WriteBarrierMode mode) {
|
| // Adjust for the number of properties stored in the object.
|
| - index -= map()->inobject_properties();
|
| - ASSERT(index < 0);
|
| - int offset = map()->instance_size() + (index * kPointerSize);
|
| + int offset = GetInObjectPropertyOffset(index);
|
| WRITE_FIELD(this, offset, value);
|
| CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
|
| return value;
|
| @@ -2518,6 +2490,11 @@ int DescriptorArray::SearchWithCache(Name* name, Map* map) {
|
| }
|
|
|
|
|
| +PropertyDetails Map::GetLastDescriptorDetails() {
|
| + return instance_descriptors()->GetDetails(LastAdded());
|
| +}
|
| +
|
| +
|
| void Map::LookupDescriptor(JSObject* holder,
|
| Name* name,
|
| LookupResult* result) {
|
| @@ -2535,7 +2512,8 @@ void Map::LookupTransition(JSObject* holder,
|
| TransitionArray* transition_array = transitions();
|
| int number = transition_array->Search(name);
|
| if (number != TransitionArray::kNotFound) {
|
| - return result->TransitionResult(holder, number);
|
| + return result->TransitionResult(
|
| + holder, transition_array->GetTarget(number));
|
| }
|
| }
|
| result->NotFound();
|
| @@ -2807,7 +2785,6 @@ CAST_ACCESSOR(DescriptorArray)
|
| CAST_ACCESSOR(DeoptimizationInputData)
|
| CAST_ACCESSOR(DeoptimizationOutputData)
|
| CAST_ACCESSOR(DependentCode)
|
| -CAST_ACCESSOR(TypeFeedbackCells)
|
| CAST_ACCESSOR(StringTable)
|
| CAST_ACCESSOR(JSFunctionResultCache)
|
| CAST_ACCESSOR(NormalizedMapCache)
|
| @@ -2859,15 +2836,15 @@ CAST_ACCESSOR(Foreign)
|
| CAST_ACCESSOR(ByteArray)
|
| CAST_ACCESSOR(FreeSpace)
|
| CAST_ACCESSOR(ExternalArray)
|
| -CAST_ACCESSOR(ExternalByteArray)
|
| -CAST_ACCESSOR(ExternalUnsignedByteArray)
|
| -CAST_ACCESSOR(ExternalShortArray)
|
| -CAST_ACCESSOR(ExternalUnsignedShortArray)
|
| -CAST_ACCESSOR(ExternalIntArray)
|
| -CAST_ACCESSOR(ExternalUnsignedIntArray)
|
| -CAST_ACCESSOR(ExternalFloatArray)
|
| -CAST_ACCESSOR(ExternalDoubleArray)
|
| -CAST_ACCESSOR(ExternalPixelArray)
|
| +CAST_ACCESSOR(ExternalInt8Array)
|
| +CAST_ACCESSOR(ExternalUint8Array)
|
| +CAST_ACCESSOR(ExternalInt16Array)
|
| +CAST_ACCESSOR(ExternalUint16Array)
|
| +CAST_ACCESSOR(ExternalInt32Array)
|
| +CAST_ACCESSOR(ExternalUint32Array)
|
| +CAST_ACCESSOR(ExternalFloat32Array)
|
| +CAST_ACCESSOR(ExternalFloat64Array)
|
| +CAST_ACCESSOR(ExternalUint8ClampedArray)
|
| CAST_ACCESSOR(Struct)
|
| CAST_ACCESSOR(AccessorInfo)
|
|
|
| @@ -3217,6 +3194,7 @@ void ExternalAsciiString::update_data_cache() {
|
|
|
| void ExternalAsciiString::set_resource(
|
| const ExternalAsciiString::Resource* resource) {
|
| + ASSERT(IsAligned(reinterpret_cast<intptr_t>(resource), kPointerSize));
|
| *reinterpret_cast<const Resource**>(
|
| FIELD_ADDR(this, kResourceOffset)) = resource;
|
| if (resource != NULL) update_data_cache();
|
| @@ -3466,26 +3444,26 @@ Address ByteArray::GetDataStartAddress() {
|
| }
|
|
|
|
|
| -uint8_t* ExternalPixelArray::external_pixel_pointer() {
|
| +uint8_t* ExternalUint8ClampedArray::external_uint8_clamped_pointer() {
|
| return reinterpret_cast<uint8_t*>(external_pointer());
|
| }
|
|
|
|
|
| -uint8_t ExternalPixelArray::get_scalar(int index) {
|
| +uint8_t ExternalUint8ClampedArray::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| - uint8_t* ptr = external_pixel_pointer();
|
| + uint8_t* ptr = external_uint8_clamped_pointer();
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalPixelArray::get(int index) {
|
| +MaybeObject* ExternalUint8ClampedArray::get(int index) {
|
| return Smi::FromInt(static_cast<int>(get_scalar(index)));
|
| }
|
|
|
|
|
| -void ExternalPixelArray::set(int index, uint8_t value) {
|
| +void ExternalUint8ClampedArray::set(int index, uint8_t value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| - uint8_t* ptr = external_pixel_pointer();
|
| + uint8_t* ptr = external_uint8_clamped_pointer();
|
| ptr[index] = value;
|
| }
|
|
|
| @@ -3502,152 +3480,152 @@ void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
|
| }
|
|
|
|
|
| -int8_t ExternalByteArray::get_scalar(int index) {
|
| +int8_t ExternalInt8Array::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| int8_t* ptr = static_cast<int8_t*>(external_pointer());
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalByteArray::get(int index) {
|
| +MaybeObject* ExternalInt8Array::get(int index) {
|
| return Smi::FromInt(static_cast<int>(get_scalar(index)));
|
| }
|
|
|
|
|
| -void ExternalByteArray::set(int index, int8_t value) {
|
| +void ExternalInt8Array::set(int index, int8_t value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| int8_t* ptr = static_cast<int8_t*>(external_pointer());
|
| ptr[index] = value;
|
| }
|
|
|
|
|
| -uint8_t ExternalUnsignedByteArray::get_scalar(int index) {
|
| +uint8_t ExternalUint8Array::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalUnsignedByteArray::get(int index) {
|
| +MaybeObject* ExternalUint8Array::get(int index) {
|
| return Smi::FromInt(static_cast<int>(get_scalar(index)));
|
| }
|
|
|
|
|
| -void ExternalUnsignedByteArray::set(int index, uint8_t value) {
|
| +void ExternalUint8Array::set(int index, uint8_t value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
|
| ptr[index] = value;
|
| }
|
|
|
|
|
| -int16_t ExternalShortArray::get_scalar(int index) {
|
| +int16_t ExternalInt16Array::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| int16_t* ptr = static_cast<int16_t*>(external_pointer());
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalShortArray::get(int index) {
|
| +MaybeObject* ExternalInt16Array::get(int index) {
|
| return Smi::FromInt(static_cast<int>(get_scalar(index)));
|
| }
|
|
|
|
|
| -void ExternalShortArray::set(int index, int16_t value) {
|
| +void ExternalInt16Array::set(int index, int16_t value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| int16_t* ptr = static_cast<int16_t*>(external_pointer());
|
| ptr[index] = value;
|
| }
|
|
|
|
|
| -uint16_t ExternalUnsignedShortArray::get_scalar(int index) {
|
| +uint16_t ExternalUint16Array::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalUnsignedShortArray::get(int index) {
|
| +MaybeObject* ExternalUint16Array::get(int index) {
|
| return Smi::FromInt(static_cast<int>(get_scalar(index)));
|
| }
|
|
|
|
|
| -void ExternalUnsignedShortArray::set(int index, uint16_t value) {
|
| +void ExternalUint16Array::set(int index, uint16_t value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
|
| ptr[index] = value;
|
| }
|
|
|
|
|
| -int32_t ExternalIntArray::get_scalar(int index) {
|
| +int32_t ExternalInt32Array::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| int32_t* ptr = static_cast<int32_t*>(external_pointer());
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalIntArray::get(int index) {
|
| +MaybeObject* ExternalInt32Array::get(int index) {
|
| return GetHeap()->NumberFromInt32(get_scalar(index));
|
| }
|
|
|
|
|
| -void ExternalIntArray::set(int index, int32_t value) {
|
| +void ExternalInt32Array::set(int index, int32_t value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| int32_t* ptr = static_cast<int32_t*>(external_pointer());
|
| ptr[index] = value;
|
| }
|
|
|
|
|
| -uint32_t ExternalUnsignedIntArray::get_scalar(int index) {
|
| +uint32_t ExternalUint32Array::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalUnsignedIntArray::get(int index) {
|
| +MaybeObject* ExternalUint32Array::get(int index) {
|
| return GetHeap()->NumberFromUint32(get_scalar(index));
|
| }
|
|
|
|
|
| -void ExternalUnsignedIntArray::set(int index, uint32_t value) {
|
| +void ExternalUint32Array::set(int index, uint32_t value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
|
| ptr[index] = value;
|
| }
|
|
|
|
|
| -float ExternalFloatArray::get_scalar(int index) {
|
| +float ExternalFloat32Array::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| float* ptr = static_cast<float*>(external_pointer());
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalFloatArray::get(int index) {
|
| +MaybeObject* ExternalFloat32Array::get(int index) {
|
| return GetHeap()->NumberFromDouble(get_scalar(index));
|
| }
|
|
|
|
|
| -void ExternalFloatArray::set(int index, float value) {
|
| +void ExternalFloat32Array::set(int index, float value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| float* ptr = static_cast<float*>(external_pointer());
|
| ptr[index] = value;
|
| }
|
|
|
|
|
| -double ExternalDoubleArray::get_scalar(int index) {
|
| +double ExternalFloat64Array::get_scalar(int index) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| double* ptr = static_cast<double*>(external_pointer());
|
| return ptr[index];
|
| }
|
|
|
|
|
| -MaybeObject* ExternalDoubleArray::get(int index) {
|
| +MaybeObject* ExternalFloat64Array::get(int index) {
|
| return GetHeap()->NumberFromDouble(get_scalar(index));
|
| }
|
|
|
|
|
| -void ExternalDoubleArray::set(int index, double value) {
|
| +void ExternalFloat64Array::set(int index, double value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| double* ptr = static_cast<double*>(external_pointer());
|
| ptr[index] = value;
|
| @@ -3691,6 +3669,15 @@ typename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) {
|
| return ptr[index];
|
| }
|
|
|
| +
|
| +template<> inline
|
| +FixedTypedArray<Float64ArrayTraits>::ElementType
|
| + FixedTypedArray<Float64ArrayTraits>::get_scalar(int index) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + return READ_DOUBLE_FIELD(this, ElementOffset(index));
|
| +}
|
| +
|
| +
|
| template <class Traits>
|
| void FixedTypedArray<Traits>::set(int index, ElementType value) {
|
| ASSERT((index >= 0) && (index < this->length()));
|
| @@ -3700,6 +3687,14 @@ void FixedTypedArray<Traits>::set(int index, ElementType value) {
|
| }
|
|
|
|
|
| +template<> inline
|
| +void FixedTypedArray<Float64ArrayTraits>::set(
|
| + int index, Float64ArrayTraits::ElementType value) {
|
| + ASSERT((index >= 0) && (index < this->length()));
|
| + WRITE_DOUBLE_FIELD(this, ElementOffset(index), value);
|
| +}
|
| +
|
| +
|
| template <class Traits>
|
| MaybeObject* FixedTypedArray<Traits>::get(int index) {
|
| return Traits::ToObject(GetHeap(), get_scalar(index));
|
| @@ -3807,6 +3802,14 @@ int Map::pre_allocated_property_fields() {
|
| }
|
|
|
|
|
| +int Map::GetInObjectPropertyOffset(int index) {
|
| + // Adjust for the number of properties stored in the object.
|
| + index -= inobject_properties();
|
| + ASSERT(index < 0);
|
| + return instance_size() + (index * kPointerSize);
|
| +}
|
| +
|
| +
|
| int HeapObject::SizeFromMap(Map* map) {
|
| int instance_size = map->instance_size();
|
| if (instance_size != kVariableSizeSentinel) return instance_size;
|
| @@ -3987,8 +3990,9 @@ bool Map::is_shared() {
|
|
|
|
|
| void Map::set_dictionary_map(bool value) {
|
| - if (value) mark_unstable();
|
| - set_bit_field3(DictionaryMap::update(bit_field3(), value));
|
| + uint32_t new_bit_field3 = DictionaryMap::update(bit_field3(), value);
|
| + new_bit_field3 = IsUnstable::update(new_bit_field3, value);
|
| + set_bit_field3(new_bit_field3);
|
| }
|
|
|
|
|
| @@ -4172,10 +4176,6 @@ void DependentCode::ExtendGroup(DependencyGroup group) {
|
|
|
| void Code::set_flags(Code::Flags flags) {
|
| STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
|
| - // Make sure that all call stubs have an arguments count.
|
| - ASSERT((ExtractKindFromFlags(flags) != CALL_IC &&
|
| - ExtractKindFromFlags(flags) != KEYED_CALL_IC) ||
|
| - ExtractArgumentsCountFromFlags(flags) >= 0);
|
| WRITE_INT_FIELD(this, kFlagsOffset, flags);
|
| }
|
|
|
| @@ -4198,16 +4198,8 @@ InlineCacheState Code::ic_state() {
|
|
|
|
|
| ExtraICState Code::extra_ic_state() {
|
| - ASSERT((is_inline_cache_stub() && !needs_extended_extra_ic_state(kind()))
|
| - || ic_state() == DEBUG_STUB);
|
| - return ExtractExtraICStateFromFlags(flags());
|
| -}
|
| -
|
| -
|
| -ExtraICState Code::extended_extra_ic_state() {
|
| ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB);
|
| - ASSERT(needs_extended_extra_ic_state(kind()));
|
| - return ExtractExtendedExtraICStateFromFlags(flags());
|
| + return ExtractExtraICStateFromFlags(flags());
|
| }
|
|
|
|
|
| @@ -4216,13 +4208,6 @@ Code::StubType Code::type() {
|
| }
|
|
|
|
|
| -int Code::arguments_count() {
|
| - ASSERT(is_call_stub() || is_keyed_call_stub() ||
|
| - kind() == STUB || is_handler());
|
| - return ExtractArgumentsCountFromFlags(flags());
|
| -}
|
| -
|
| -
|
| // For initialization.
|
| void Code::set_raw_kind_specific_flags1(int value) {
|
| WRITE_INT_FIELD(this, kKindSpecificFlags1Offset, value);
|
| @@ -4273,7 +4258,6 @@ bool Code::has_major_key() {
|
| kind() == KEYED_LOAD_IC ||
|
| kind() == STORE_IC ||
|
| kind() == KEYED_STORE_IC ||
|
| - kind() == KEYED_CALL_IC ||
|
| kind() == TO_BOOLEAN_IC;
|
| }
|
|
|
| @@ -4426,21 +4410,8 @@ void Code::set_back_edges_patched_for_osr(bool value) {
|
|
|
|
|
|
|
| -CheckType Code::check_type() {
|
| - ASSERT(is_call_stub() || is_keyed_call_stub());
|
| - byte type = READ_BYTE_FIELD(this, kCheckTypeOffset);
|
| - return static_cast<CheckType>(type);
|
| -}
|
| -
|
| -
|
| -void Code::set_check_type(CheckType value) {
|
| - ASSERT(is_call_stub() || is_keyed_call_stub());
|
| - WRITE_BYTE_FIELD(this, kCheckTypeOffset, value);
|
| -}
|
| -
|
| -
|
| byte Code::to_boolean_state() {
|
| - return extended_extra_ic_state();
|
| + return extra_ic_state();
|
| }
|
|
|
|
|
| @@ -4486,7 +4457,7 @@ bool Code::is_inline_cache_stub() {
|
|
|
|
|
| bool Code::is_keyed_stub() {
|
| - return is_keyed_load_stub() || is_keyed_store_stub() || is_keyed_call_stub();
|
| + return is_keyed_load_stub() || is_keyed_store_stub();
|
| }
|
|
|
|
|
| @@ -4511,23 +4482,13 @@ Code::Flags Code::ComputeFlags(Kind kind,
|
| InlineCacheState ic_state,
|
| ExtraICState extra_ic_state,
|
| StubType type,
|
| - int argc,
|
| InlineCacheHolderFlag holder) {
|
| - ASSERT(argc <= Code::kMaxArguments);
|
| - // Since the extended extra ic state overlaps with the argument count
|
| - // for CALL_ICs, do so checks to make sure that they don't interfere.
|
| - ASSERT((kind != Code::CALL_IC &&
|
| - kind != Code::KEYED_CALL_IC) ||
|
| - (ExtraICStateField::encode(extra_ic_state) | true));
|
| // Compute the bit mask.
|
| unsigned int bits = KindField::encode(kind)
|
| | ICStateField::encode(ic_state)
|
| | TypeField::encode(type)
|
| - | ExtendedExtraICStateField::encode(extra_ic_state)
|
| + | ExtraICStateField::encode(extra_ic_state)
|
| | CacheHolderField::encode(holder);
|
| - if (!Code::needs_extended_extra_ic_state(kind)) {
|
| - bits |= (argc << kArgumentsCountShift);
|
| - }
|
| return static_cast<Flags>(bits);
|
| }
|
|
|
| @@ -4535,9 +4496,15 @@ Code::Flags Code::ComputeFlags(Kind kind,
|
| Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
|
| ExtraICState extra_ic_state,
|
| InlineCacheHolderFlag holder,
|
| - StubType type,
|
| - int argc) {
|
| - return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder);
|
| + StubType type) {
|
| + return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, holder);
|
| +}
|
| +
|
| +
|
| +Code::Flags Code::ComputeHandlerFlags(Kind handler_kind,
|
| + StubType type,
|
| + InlineCacheHolderFlag holder) {
|
| + return ComputeFlags(Code::HANDLER, MONOMORPHIC, handler_kind, type, holder);
|
| }
|
|
|
|
|
| @@ -4556,22 +4523,11 @@ ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
|
| }
|
|
|
|
|
| -ExtraICState Code::ExtractExtendedExtraICStateFromFlags(
|
| - Flags flags) {
|
| - return ExtendedExtraICStateField::decode(flags);
|
| -}
|
| -
|
| -
|
| Code::StubType Code::ExtractTypeFromFlags(Flags flags) {
|
| return TypeField::decode(flags);
|
| }
|
|
|
|
|
| -int Code::ExtractArgumentsCountFromFlags(Flags flags) {
|
| - return (flags & kArgumentsCountMask) >> kArgumentsCountShift;
|
| -}
|
| -
|
| -
|
| InlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
|
| return CacheHolderField::decode(flags);
|
| }
|
| @@ -4600,6 +4556,21 @@ Object* Code::GetObjectFromEntryAddress(Address location_of_address) {
|
| }
|
|
|
|
|
| +bool Code::IsWeakObjectInOptimizedCode(Object* object) {
|
| + ASSERT(is_optimized_code());
|
| + if (object->IsMap()) {
|
| + return Map::cast(object)->CanTransition() &&
|
| + FLAG_collect_maps &&
|
| + FLAG_weak_embedded_maps_in_optimized_code;
|
| + }
|
| + if (object->IsJSObject() ||
|
| + (object->IsCell() && Cell::cast(object)->value()->IsJSObject())) {
|
| + return FLAG_weak_embedded_objects_in_optimized_code;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +
|
| Object* Map::prototype() {
|
| return READ_FIELD(this, kPrototypeOffset);
|
| }
|
| @@ -4711,7 +4682,7 @@ bool Map::CanHaveMoreTransitions() {
|
| if (!HasTransitionArray()) return true;
|
| return FixedArray::SizeFor(transitions()->length() +
|
| TransitionArray::kTransitionSize)
|
| - <= Page::kMaxNonCodeHeapObjectSize;
|
| + <= Page::kMaxRegularHeapObjectSize;
|
| }
|
|
|
|
|
| @@ -4789,6 +4760,17 @@ void Map::set_transitions(TransitionArray* transition_array,
|
| // When there is another reference to the array somewhere (e.g. a handle),
|
| // not zapping turns from a waste of memory into a source of crashes.
|
| if (HasTransitionArray()) {
|
| +#ifdef DEBUG
|
| + for (int i = 0; i < transitions()->number_of_transitions(); i++) {
|
| + Map* target = transitions()->GetTarget(i);
|
| + if (target->instance_descriptors() == instance_descriptors()) {
|
| + Name* key = transitions()->GetKey(i);
|
| + int new_target_index = transition_array->Search(key);
|
| + ASSERT(new_target_index != TransitionArray::kNotFound);
|
| + ASSERT(transition_array->GetTarget(new_target_index) == target);
|
| + }
|
| + }
|
| +#endif
|
| ASSERT(transitions() != transition_array);
|
| ZapTransitions();
|
| }
|
| @@ -5445,11 +5427,6 @@ void JSFunction::ReplaceCode(Code* code) {
|
| bool was_optimized = IsOptimized();
|
| bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
|
|
|
| - if (was_optimized && is_optimized) {
|
| - shared()->EvictFromOptimizedCodeMap(
|
| - this->code(), "Replacing with another optimized code");
|
| - }
|
| -
|
| set_code(code);
|
|
|
| // Add/remove the function from the list of optimized functions for this
|
| @@ -5682,7 +5659,6 @@ JSDate* JSDate::cast(Object* obj) {
|
| ACCESSORS(JSMessageObject, type, String, kTypeOffset)
|
| ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
|
| ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
|
| -ACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset)
|
| ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
|
| SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
|
| SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
|
| @@ -5988,29 +5964,18 @@ bool JSObject::HasExternalArrayElements() {
|
| }
|
|
|
|
|
| -#define EXTERNAL_ELEMENTS_CHECK(name, type) \
|
| -bool JSObject::HasExternal##name##Elements() { \
|
| - HeapObject* array = elements(); \
|
| - ASSERT(array != NULL); \
|
| - if (!array->IsHeapObject()) \
|
| - return false; \
|
| - return array->map()->instance_type() == type; \
|
| +#define EXTERNAL_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \
|
| +bool JSObject::HasExternal##Type##Elements() { \
|
| + HeapObject* array = elements(); \
|
| + ASSERT(array != NULL); \
|
| + if (!array->IsHeapObject()) \
|
| + return false; \
|
| + return array->map()->instance_type() == EXTERNAL_##TYPE##_ARRAY_TYPE; \
|
| }
|
|
|
| +TYPED_ARRAYS(EXTERNAL_ELEMENTS_CHECK)
|
|
|
| -EXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE)
|
| -EXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
|
| -EXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE)
|
| -EXTERNAL_ELEMENTS_CHECK(UnsignedShort,
|
| - EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
|
| -EXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE)
|
| -EXTERNAL_ELEMENTS_CHECK(UnsignedInt,
|
| - EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
|
| -EXTERNAL_ELEMENTS_CHECK(Float,
|
| - EXTERNAL_FLOAT_ARRAY_TYPE)
|
| -EXTERNAL_ELEMENTS_CHECK(Double,
|
| - EXTERNAL_DOUBLE_ARRAY_TYPE)
|
| -EXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE)
|
| +#undef EXTERNAL_ELEMENTS_CHECK
|
|
|
|
|
| bool JSObject::HasFixedTypedArrayElements() {
|
| @@ -6576,43 +6541,23 @@ MaybeObject* ConstantPoolArray::Copy() {
|
| }
|
|
|
|
|
| -void TypeFeedbackCells::SetAstId(int index, TypeFeedbackId id) {
|
| - set(1 + index * 2, Smi::FromInt(id.ToInt()));
|
| -}
|
| -
|
| -
|
| -TypeFeedbackId TypeFeedbackCells::AstId(int index) {
|
| - return TypeFeedbackId(Smi::cast(get(1 + index * 2))->value());
|
| -}
|
| -
|
| -
|
| -void TypeFeedbackCells::SetCell(int index, Cell* cell) {
|
| - set(index * 2, cell);
|
| -}
|
| -
|
| -
|
| -Cell* TypeFeedbackCells::GetCell(int index) {
|
| - return Cell::cast(get(index * 2));
|
| -}
|
| -
|
| -
|
| -Handle<Object> TypeFeedbackCells::UninitializedSentinel(Isolate* isolate) {
|
| +Handle<Object> TypeFeedbackInfo::UninitializedSentinel(Isolate* isolate) {
|
| return isolate->factory()->the_hole_value();
|
| }
|
|
|
|
|
| -Handle<Object> TypeFeedbackCells::MegamorphicSentinel(Isolate* isolate) {
|
| +Handle<Object> TypeFeedbackInfo::MegamorphicSentinel(Isolate* isolate) {
|
| return isolate->factory()->undefined_value();
|
| }
|
|
|
|
|
| -Handle<Object> TypeFeedbackCells::MonomorphicArraySentinel(Isolate* isolate,
|
| +Handle<Object> TypeFeedbackInfo::MonomorphicArraySentinel(Isolate* isolate,
|
| ElementsKind elements_kind) {
|
| return Handle<Object>(Smi::FromInt(static_cast<int>(elements_kind)), isolate);
|
| }
|
|
|
|
|
| -Object* TypeFeedbackCells::RawUninitializedSentinel(Heap* heap) {
|
| +Object* TypeFeedbackInfo::RawUninitializedSentinel(Heap* heap) {
|
| return heap->the_hole_value();
|
| }
|
|
|
| @@ -6695,8 +6640,8 @@ bool TypeFeedbackInfo::matches_inlined_type_change_checksum(int checksum) {
|
| }
|
|
|
|
|
| -ACCESSORS(TypeFeedbackInfo, type_feedback_cells, TypeFeedbackCells,
|
| - kTypeFeedbackCellsOffset)
|
| +ACCESSORS(TypeFeedbackInfo, feedback_vector, FixedArray,
|
| + kFeedbackVectorOffset)
|
|
|
|
|
| SMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot)
|
|
|