diff options
Diffstat (limited to 'deps/v8/src/objects/lookup.cc')
-rw-r--r-- | deps/v8/src/objects/lookup.cc | 133 |
1 files changed, 69 insertions, 64 deletions
diff --git a/deps/v8/src/objects/lookup.cc b/deps/v8/src/objects/lookup.cc index 4646b71a9e..7f626cc223 100644 --- a/deps/v8/src/objects/lookup.cc +++ b/deps/v8/src/objects/lookup.cc @@ -249,10 +249,10 @@ void LookupIterator::InternalUpdateProtector() { } if (!Protectors::IsArraySpeciesLookupChainIntact(isolate_) && - !isolate_->IsPromiseSpeciesLookupChainIntact() && + !Protectors::IsPromiseSpeciesLookupChainIntact(isolate_) && !Protectors::IsRegExpSpeciesLookupChainProtectorIntact( native_context) && - !isolate_->IsTypedArraySpeciesLookupChainIntact()) { + !Protectors::IsTypedArraySpeciesLookupChainIntact(isolate_)) { return; } // Setting the constructor property could change an instance's @@species @@ -263,8 +263,8 @@ void LookupIterator::InternalUpdateProtector() { Protectors::InvalidateArraySpeciesLookupChain(isolate_); return; } else if (receiver->IsJSPromise(isolate_)) { - if (!isolate_->IsPromiseSpeciesLookupChainIntact()) return; - isolate_->InvalidatePromiseSpeciesProtector(); + if (!Protectors::IsPromiseSpeciesLookupChainIntact(isolate_)) return; + Protectors::InvalidatePromiseSpeciesLookupChain(isolate_); return; } else if (receiver->IsJSRegExp(isolate_)) { if (!Protectors::IsRegExpSpeciesLookupChainProtectorIntact( @@ -275,8 +275,8 @@ void LookupIterator::InternalUpdateProtector() { native_context); return; } else if (receiver->IsJSTypedArray(isolate_)) { - if (!isolate_->IsTypedArraySpeciesLookupChainIntact()) return; - isolate_->InvalidateTypedArraySpeciesProtector(); + if (!Protectors::IsTypedArraySpeciesLookupChainIntact(isolate_)) return; + Protectors::InvalidateTypedArraySpeciesLookupChain(isolate_); return; } if (receiver->map(isolate_).is_prototype_map()) { @@ -294,8 +294,8 @@ void LookupIterator::InternalUpdateProtector() { Protectors::InvalidateArraySpeciesLookupChain(isolate_); } else if (isolate_->IsInAnyContext(*receiver, Context::PROMISE_PROTOTYPE_INDEX)) { - if (!isolate_->IsPromiseSpeciesLookupChainIntact()) return; - isolate_->InvalidatePromiseSpeciesProtector(); + if (!Protectors::IsPromiseSpeciesLookupChainIntact(isolate_)) return; + Protectors::InvalidatePromiseSpeciesLookupChain(isolate_); } else if (isolate_->IsInAnyContext(*receiver, Context::REGEXP_PROTOTYPE_INDEX)) { if (!Protectors::IsRegExpSpeciesLookupChainProtectorIntact( @@ -307,8 +307,8 @@ void LookupIterator::InternalUpdateProtector() { } else if (isolate_->IsInAnyContext( receiver->map(isolate_).prototype(isolate_), Context::TYPED_ARRAY_PROTOTYPE_INDEX)) { - if (!isolate_->IsTypedArraySpeciesLookupChainIntact()) return; - isolate_->InvalidateTypedArraySpeciesProtector(); + if (!Protectors::IsTypedArraySpeciesLookupChainIntact(isolate_)) return; + Protectors::InvalidateTypedArraySpeciesLookupChain(isolate_); } } } else if (*name_ == roots.next_string()) { @@ -317,26 +317,26 @@ void LookupIterator::InternalUpdateProtector() { *receiver, Context::INITIAL_ARRAY_ITERATOR_PROTOTYPE_INDEX)) { // Setting the next property of %ArrayIteratorPrototype% also needs to // invalidate the array iterator protector. - if (!isolate_->IsArrayIteratorLookupChainIntact()) return; - isolate_->InvalidateArrayIteratorProtector(); + if (!Protectors::IsArrayIteratorLookupChainIntact(isolate_)) return; + Protectors::InvalidateArrayIteratorLookupChain(isolate_); } else if (receiver->IsJSMapIterator() || isolate_->IsInAnyContext( *receiver, Context::INITIAL_MAP_ITERATOR_PROTOTYPE_INDEX)) { - if (!isolate_->IsMapIteratorLookupChainIntact()) return; - isolate_->InvalidateMapIteratorProtector(); + if (!Protectors::IsMapIteratorLookupChainIntact(isolate_)) return; + Protectors::InvalidateMapIteratorLookupChain(isolate_); } else if (receiver->IsJSSetIterator() || isolate_->IsInAnyContext( *receiver, Context::INITIAL_SET_ITERATOR_PROTOTYPE_INDEX)) { - if (!isolate_->IsSetIteratorLookupChainIntact()) return; - isolate_->InvalidateSetIteratorProtector(); + if (!Protectors::IsSetIteratorLookupChainIntact(isolate_)) return; + Protectors::InvalidateSetIteratorLookupChain(isolate_); } else if (receiver->IsJSStringIterator() || isolate_->IsInAnyContext( *receiver, Context::INITIAL_STRING_ITERATOR_PROTOTYPE_INDEX)) { // Setting the next property of %StringIteratorPrototype% invalidates the // string iterator protector. - if (!isolate_->IsStringIteratorLookupChainIntact()) return; - isolate_->InvalidateStringIteratorProtector(); + if (!Protectors::IsStringIteratorLookupChainIntact(isolate_)) return; + Protectors::InvalidateStringIteratorLookupChain(isolate_); } } else if (*name_ == roots.species_symbol()) { // Fetching the context in here since the operation is rather expensive. @@ -345,10 +345,10 @@ void LookupIterator::InternalUpdateProtector() { } if (!Protectors::IsArraySpeciesLookupChainIntact(isolate_) && - !isolate_->IsPromiseSpeciesLookupChainIntact() && + !Protectors::IsPromiseSpeciesLookupChainIntact(isolate_) && !Protectors::IsRegExpSpeciesLookupChainProtectorIntact( native_context) && - !isolate_->IsTypedArraySpeciesLookupChainIntact()) { + !Protectors::IsTypedArraySpeciesLookupChainIntact(isolate_)) { return; } // Setting the Symbol.species property of any Array, Promise or TypedArray @@ -360,8 +360,8 @@ void LookupIterator::InternalUpdateProtector() { Protectors::InvalidateArraySpeciesLookupChain(isolate_); } else if (isolate_->IsInAnyContext(*receiver, Context::PROMISE_FUNCTION_INDEX)) { - if (!isolate_->IsPromiseSpeciesLookupChainIntact()) return; - isolate_->InvalidatePromiseSpeciesProtector(); + if (!Protectors::IsPromiseSpeciesLookupChainIntact(isolate_)) return; + Protectors::InvalidatePromiseSpeciesLookupChain(isolate_); } else if (isolate_->IsInAnyContext(*receiver, Context::REGEXP_FUNCTION_INDEX)) { if (!Protectors::IsRegExpSpeciesLookupChainProtectorIntact( @@ -371,37 +371,37 @@ void LookupIterator::InternalUpdateProtector() { Protectors::InvalidateRegExpSpeciesLookupChainProtector(isolate_, native_context); } else if (IsTypedArrayFunctionInAnyContext(isolate_, *receiver)) { - if (!isolate_->IsTypedArraySpeciesLookupChainIntact()) return; - isolate_->InvalidateTypedArraySpeciesProtector(); + if (!Protectors::IsTypedArraySpeciesLookupChainIntact(isolate_)) return; + Protectors::InvalidateTypedArraySpeciesLookupChain(isolate_); } } else if (*name_ == roots.is_concat_spreadable_symbol()) { - if (!isolate_->IsIsConcatSpreadableLookupChainIntact()) return; - isolate_->InvalidateIsConcatSpreadableProtector(); + if (!Protectors::IsIsConcatSpreadableLookupChainIntact(isolate_)) return; + Protectors::InvalidateIsConcatSpreadableLookupChain(isolate_); } else if (*name_ == roots.iterator_symbol()) { if (receiver->IsJSArray(isolate_)) { - if (!isolate_->IsArrayIteratorLookupChainIntact()) return; - isolate_->InvalidateArrayIteratorProtector(); + if (!Protectors::IsArrayIteratorLookupChainIntact(isolate_)) return; + Protectors::InvalidateArrayIteratorLookupChain(isolate_); } else if (receiver->IsJSSet(isolate_) || receiver->IsJSSetIterator() || isolate_->IsInAnyContext( *receiver, Context::INITIAL_SET_ITERATOR_PROTOTYPE_INDEX) || isolate_->IsInAnyContext(*receiver, Context::INITIAL_SET_PROTOTYPE_INDEX)) { - if (isolate_->IsSetIteratorLookupChainIntact()) { - isolate_->InvalidateSetIteratorProtector(); + if (Protectors::IsSetIteratorLookupChainIntact(isolate_)) { + Protectors::InvalidateSetIteratorLookupChain(isolate_); } } else if (receiver->IsJSMapIterator() || isolate_->IsInAnyContext( *receiver, Context::INITIAL_MAP_ITERATOR_PROTOTYPE_INDEX)) { - if (isolate_->IsMapIteratorLookupChainIntact()) { - isolate_->InvalidateMapIteratorProtector(); + if (Protectors::IsMapIteratorLookupChainIntact(isolate_)) { + Protectors::InvalidateMapIteratorLookupChain(isolate_); } } else if (isolate_->IsInAnyContext( *receiver, Context::INITIAL_ITERATOR_PROTOTYPE_INDEX)) { - if (isolate_->IsMapIteratorLookupChainIntact()) { - isolate_->InvalidateMapIteratorProtector(); + if (Protectors::IsMapIteratorLookupChainIntact(isolate_)) { + Protectors::InvalidateMapIteratorLookupChain(isolate_); } - if (isolate_->IsSetIteratorLookupChainIntact()) { - isolate_->InvalidateSetIteratorProtector(); + if (Protectors::IsSetIteratorLookupChainIntact(isolate_)) { + Protectors::InvalidateSetIteratorLookupChain(isolate_); } } else if (isolate_->IsInAnyContext( *receiver, Context::INITIAL_STRING_PROTOTYPE_INDEX)) { @@ -409,18 +409,18 @@ void LookupIterator::InternalUpdateProtector() { // the string iterator protector. Symbol.iterator can also be set on a // String wrapper, but not on a primitive string. We only support // protector for primitive strings. - if (!isolate_->IsStringIteratorLookupChainIntact()) return; - isolate_->InvalidateStringIteratorProtector(); + if (!Protectors::IsStringIteratorLookupChainIntact(isolate_)) return; + Protectors::InvalidateStringIteratorLookupChain(isolate_); } } else if (*name_ == roots.resolve_string()) { - if (!isolate_->IsPromiseResolveLookupChainIntact()) return; + if (!Protectors::IsPromiseResolveLookupChainIntact(isolate_)) return; // Setting the "resolve" property on any %Promise% intrinsic object // invalidates the Promise.resolve protector. if (isolate_->IsInAnyContext(*receiver, Context::PROMISE_FUNCTION_INDEX)) { - isolate_->InvalidatePromiseResolveProtector(); + Protectors::InvalidatePromiseResolveLookupChain(isolate_); } } else if (*name_ == roots.then_string()) { - if (!isolate_->IsPromiseThenLookupChainIntact()) return; + if (!Protectors::IsPromiseThenLookupChainIntact(isolate_)) return; // Setting the "then" property on any JSPromise instance or on the // initial %PromisePrototype% invalidates the Promise#then protector. // Also setting the "then" property on the initial %ObjectPrototype% @@ -432,7 +432,7 @@ void LookupIterator::InternalUpdateProtector() { isolate_->IsInAnyContext(*receiver, Context::INITIAL_OBJECT_PROTOTYPE_INDEX) || isolate_->IsInAnyContext(*receiver, Context::PROMISE_PROTOTYPE_INDEX)) { - isolate_->InvalidatePromiseThenProtector(); + Protectors::InvalidatePromiseThenLookupChain(isolate_); } } } @@ -534,7 +534,7 @@ void LookupIterator::ReconfigureDataProperty(Handle<Object> value, DCHECK(attributes != NONE || !holder_obj->HasFastElements(isolate_)); Handle<FixedArrayBase> elements(holder_obj->elements(isolate_), isolate()); holder_obj->GetElementsAccessor(isolate_)->Reconfigure( - holder_obj, elements, number_, value, attributes); + holder_obj, elements, InternalIndex(number_), value, attributes); ReloadPropertyInformation<true>(); } else if (holder_obj->HasFastProperties(isolate_)) { Handle<Map> old_map(holder_obj->map(isolate_), isolate_); @@ -699,8 +699,7 @@ void LookupIterator::ApplyTransitionToDataProperty( } if (simple_transition) { - int number = transition->LastAdded(); - number_ = static_cast<uint32_t>(number); + number_ = transition->LastAdded().as_uint32(); property_details_ = transition->GetLastDescriptorDetails(isolate_); state_ = DATA; } else if (receiver->map(isolate_).is_dictionary_map()) { @@ -731,7 +730,7 @@ void LookupIterator::Delete() { if (IsElement()) { Handle<JSObject> object = Handle<JSObject>::cast(holder); ElementsAccessor* accessor = object->GetElementsAccessor(isolate_); - accessor->Delete(object, number_); + accessor->Delete(object, InternalIndex(number_)); } else { DCHECK(!name()->IsPrivateName(isolate_)); bool is_prototype_map = holder->map(isolate_).is_prototype_map(); @@ -777,8 +776,11 @@ void LookupIterator::TransitionToAccessorProperty( } else if (state_ == INTERCEPTOR) { LookupInRegularHolder<false>(*old_map, *holder_); } - int descriptor = - IsFound() ? static_cast<int>(number_) : DescriptorArray::kNotFound; + // TODO(jkummerow): {IsFound()} should be enough once {number_} has type + // {InternalIndex}. + InternalIndex descriptor = (IsFound() && number_ != kMaxUInt32) + ? InternalIndex(number_) + : InternalIndex::NotFound(); Handle<Map> new_map = Map::TransitionToAccessorProperty( isolate_, old_map, name_, descriptor, getter, setter, attributes); @@ -787,8 +789,7 @@ void LookupIterator::TransitionToAccessorProperty( JSObject::MigrateToMap(isolate_, receiver, new_map); if (simple_transition) { - int number = new_map->LastAdded(); - number_ = static_cast<uint32_t>(number); + number_ = new_map->LastAdded().as_uint32(); property_details_ = new_map->GetLastDescriptorDetails(isolate_); state_ = ACCESSOR; return; @@ -894,23 +895,24 @@ Handle<Object> LookupIterator::FetchValue() const { if (IsElement()) { Handle<JSObject> holder = GetHolder<JSObject>(); ElementsAccessor* accessor = holder->GetElementsAccessor(isolate_); - return accessor->Get(holder, number_); + return accessor->Get(holder, InternalIndex(number_)); } else if (holder_->IsJSGlobalObject(isolate_)) { Handle<JSGlobalObject> holder = GetHolder<JSGlobalObject>(); result = holder->global_dictionary(isolate_).ValueAt(isolate_, number_); } else if (!holder_->HasFastProperties(isolate_)) { - result = holder_->property_dictionary(isolate_).ValueAt(isolate_, number_); + result = holder_->property_dictionary(isolate_).ValueAt(isolate_, + dictionary_entry()); } else if (property_details_.location() == kField) { DCHECK_EQ(kData, property_details_.kind()); Handle<JSObject> holder = GetHolder<JSObject>(); FieldIndex field_index = - FieldIndex::ForDescriptor(holder->map(isolate_), number_); + FieldIndex::ForDescriptor(holder->map(isolate_), descriptor_number()); return JSObject::FastPropertyAt(holder, property_details_.representation(), field_index); } else { result = holder_->map(isolate_).instance_descriptors(isolate_).GetStrongValue( - isolate_, number_); + isolate_, descriptor_number()); } return handle(result, isolate_); } @@ -922,7 +924,7 @@ bool LookupIterator::IsConstFieldValueEqualTo(Object value) const { DCHECK_EQ(PropertyConstness::kConst, property_details_.constness()); Handle<JSObject> holder = GetHolder<JSObject>(); FieldIndex field_index = - FieldIndex::ForDescriptor(holder->map(isolate_), number_); + FieldIndex::ForDescriptor(holder->map(isolate_), descriptor_number()); if (property_details_.representation().IsDouble()) { if (!value.IsNumber(isolate_)) return false; uint64_t bits; @@ -958,7 +960,8 @@ int LookupIterator::GetFieldDescriptorIndex() const { DCHECK(holder_->HasFastProperties()); DCHECK_EQ(kField, property_details_.location()); DCHECK_EQ(kData, property_details_.kind()); - return descriptor_number(); + // TODO(jkummerow): Propagate InternalIndex further. + return descriptor_number().as_int(); } int LookupIterator::GetAccessorIndex() const { @@ -966,7 +969,7 @@ int LookupIterator::GetAccessorIndex() const { DCHECK(holder_->HasFastProperties(isolate_)); DCHECK_EQ(kDescriptor, property_details_.location()); DCHECK_EQ(kAccessor, property_details_.kind()); - return descriptor_number(); + return descriptor_number().as_int(); } Handle<Map> LookupIterator::GetFieldOwnerMap() const { @@ -1028,7 +1031,7 @@ void LookupIterator::WriteDataValue(Handle<Object> value, if (IsElement()) { Handle<JSObject> object = Handle<JSObject>::cast(holder); ElementsAccessor* accessor = object->GetElementsAccessor(isolate_); - accessor->Set(object, number_, *value); + accessor->Set(object, InternalIndex(number_), *value); } else if (holder->HasFastProperties(isolate_)) { if (property_details_.location() == kField) { // Check that in case of VariableMode::kConst field the existing value is @@ -1164,13 +1167,15 @@ LookupIterator::State LookupIterator::LookupInRegularHolder( JSObject js_object = JSObject::cast(holder); ElementsAccessor* accessor = js_object.GetElementsAccessor(isolate_); FixedArrayBase backing_store = js_object.elements(isolate_); - number_ = + // TODO(jkummerow): {number_} should have type InternalIndex. + InternalIndex entry = accessor->GetEntryForIndex(isolate_, js_object, backing_store, index_); + number_ = entry.is_found() ? entry.as_uint32() : kMaxUInt32; if (number_ == kMaxUInt32) { return holder.IsJSTypedArray(isolate_) ? INTEGER_INDEXED_EXOTIC : NOT_FOUND; } - property_details_ = accessor->GetDetails(js_object, number_); + property_details_ = accessor->GetDetails(js_object, InternalIndex(number_)); if (map.has_frozen_elements()) { property_details_ = property_details_.CopyAddAttributes(FROZEN); } else if (map.has_sealed_elements()) { @@ -1178,10 +1183,10 @@ LookupIterator::State LookupIterator::LookupInRegularHolder( } } else if (!map.is_dictionary_map()) { DescriptorArray descriptors = map.instance_descriptors(isolate_); - int number = descriptors.SearchWithCache(isolate_, *name_, map); - if (number == DescriptorArray::kNotFound) return NotFound(holder); - number_ = static_cast<uint32_t>(number); - property_details_ = descriptors.GetDetails(number_); + InternalIndex number = descriptors.SearchWithCache(isolate_, *name_, map); + if (number.is_not_found()) return NotFound(holder); + number_ = number.as_uint32(); + property_details_ = descriptors.GetDetails(InternalIndex(number_)); } else { DCHECK_IMPLIES(holder.IsJSProxy(isolate_), name()->IsPrivate(isolate_)); NameDictionary dict = holder.property_dictionary(isolate_); |