return kUseCell;
case LookupIterator::JSPROXY:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
}
UNREACHABLE();
bool inline_followup = false;
switch (it->state()) {
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::ACCESS_CHECK:
case LookupIterator::INTERCEPTOR:
case LookupIterator::JSPROXY:
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::DATA: {
DCHECK_EQ(FIELD, it->property_details().type());
switch (it->state()) {
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::JSPROXY:
return;
case LookupIterator::JSPROXY:
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
}
switch (it->state()) {
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::JSPROXY:
return false;
case LookupIterator::ACCESS_CHECK:
case LookupIterator::JSPROXY:
case LookupIterator::NOT_FOUND:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
}
return slow_stub();
// Fall through.
case INTERCEPTOR:
if (map->is_dictionary_map()) {
- if (holder == NULL) return UNKNOWN;
NameDictionary* dict = JSObject::cast(holder)->property_dictionary();
number_ = dict->FindEntry(name_);
if (number_ == NameDictionary::kNotFound) return NOT_FOUND;
}
case ACCESSOR:
case DATA:
- case UNKNOWN:
return NOT_FOUND;
case JSPROXY:
case TRANSITION:
DisallowHeapAllocation no_gc;
has_property_ = false;
- JSReceiver* holder =
- maybe_holder_.is_null() ? NULL : *maybe_holder_.ToHandleChecked();
+ JSReceiver* holder = *holder_;
Map* map = *holder_map_;
// Perform lookup on current holder.
state_ = LookupInHolder(map, holder);
} while (!IsFound());
- if (holder == NULL) return;
-
- maybe_holder_ = handle(holder, isolate_);
- holder_map_ = handle(map, isolate_);
+ if (holder != *holder_) {
+ holder_ = handle(holder, isolate_);
+ holder_map_ = handle(map, isolate_);
+ }
}
Handle<JSReceiver> LookupIterator::GetRoot() const {
- Handle<Object> receiver = GetReceiver();
- if (receiver->IsJSReceiver()) return Handle<JSReceiver>::cast(receiver);
+ if (receiver_->IsJSReceiver()) return Handle<JSReceiver>::cast(receiver_);
Handle<Object> root =
- handle(receiver->GetRootMap(isolate_)->prototype(), isolate_);
+ handle(receiver_->GetRootMap(isolate_)->prototype(), isolate_);
CHECK(!root->IsNull());
return Handle<JSReceiver>::cast(root);
}
Handle<Map> LookupIterator::GetReceiverMap() const {
- Handle<Object> receiver = GetReceiver();
- if (receiver->IsNumber()) return isolate_->factory()->heap_number_map();
- return handle(Handle<HeapObject>::cast(receiver)->map(), isolate_);
+ if (receiver_->IsNumber()) return isolate_->factory()->heap_number_map();
+ return handle(Handle<HeapObject>::cast(receiver_)->map(), isolate_);
}
Handle<JSObject> LookupIterator::GetStoreTarget() const {
- Handle<JSObject> receiver = Handle<JSObject>::cast(GetReceiver());
-
- if (receiver->IsJSGlobalProxy()) {
- PrototypeIterator iter(isolate(), receiver);
- if (iter.IsAtEnd()) return receiver;
+ if (receiver_->IsJSGlobalProxy()) {
+ PrototypeIterator iter(isolate(), receiver_);
+ if (iter.IsAtEnd()) return Handle<JSGlobalProxy>::cast(receiver_);
return Handle<JSGlobalObject>::cast(PrototypeIterator::GetCurrent(iter));
}
- return receiver;
+ return Handle<JSObject>::cast(receiver_);
}
bool LookupIterator::HasAccess(v8::AccessType access_type) const {
DCHECK_EQ(ACCESS_CHECK, state_);
- DCHECK(is_guaranteed_to_have_holder());
return isolate_->MayNamedAccess(GetHolder<JSObject>(), name_, access_type);
}
void LookupIterator::ReloadPropertyInformation() {
state_ = BEFORE_PROPERTY;
- state_ = LookupInHolder(*holder_map_, *maybe_holder_.ToHandleChecked());
+ state_ = LookupInHolder(*holder_map_, *holder_);
DCHECK(IsFound() || holder_map_->is_dictionary_map());
}
DCHECK_EQ(TRANSITION, state_);
Handle<JSObject> receiver = GetStoreTarget();
- maybe_holder_ = receiver;
+ holder_ = receiver;
holder_map_ = transition_map_;
JSObject::MigrateToMap(receiver, holder_map_);
ReloadPropertyInformation();
// handled via a trap. Adding properties to primitive values is not
// observable.
Handle<JSObject> receiver = GetStoreTarget();
- maybe_holder_ = receiver;
+ holder_ = receiver;
holder_map_ =
Map::TransitionToAccessorProperty(handle(receiver->map(), isolate_),
name_, component, accessor, attributes);
// Optimization that only works if configuration_ is not mutable.
if (!check_prototype_chain()) return true;
DisallowHeapAllocation no_gc;
- Handle<Object> receiver = GetReceiver();
- if (!receiver->IsJSReceiver()) return false;
- Object* current = *receiver;
- JSReceiver* holder = *maybe_holder_.ToHandleChecked();
+ if (!receiver_->IsJSReceiver()) return false;
+ Object* current = *receiver_;
+ JSReceiver* holder = *holder_;
// JSProxy do not occur as hidden prototypes.
if (current->IsJSProxy()) {
return JSReceiver::cast(current) == holder;
void LookupIterator::WriteDataValue(Handle<Object> value) {
- DCHECK(is_guaranteed_to_have_holder());
DCHECK_EQ(DATA, state_);
Handle<JSObject> holder = GetHolder<JSObject>();
if (holder_map_->is_dictionary_map()) {
INTERCEPTOR,
JSPROXY,
NOT_FOUND,
- UNKNOWN, // Dictionary-mode holder map without a holder.
ACCESSOR,
DATA,
TRANSITION,
property_details_(NONE, NORMAL, Representation::None()),
isolate_(name->GetIsolate()),
name_(name),
- maybe_receiver_(receiver),
+ receiver_(receiver),
number_(DescriptorArray::kNotFound) {
- Handle<JSReceiver> root = GetRoot();
- holder_map_ = handle(root->map(), isolate_);
- maybe_holder_ = root;
+ holder_ = GetRoot();
+ holder_map_ = handle(holder_->map(), isolate_);
Next();
}
isolate_(name->GetIsolate()),
name_(name),
holder_map_(holder->map(), isolate_),
- maybe_receiver_(receiver),
- maybe_holder_(holder),
+ receiver_(receiver),
+ holder_(holder),
number_(DescriptorArray::kNotFound) {
Next();
}
}
Factory* factory() const { return isolate_->factory(); }
- Handle<Object> GetReceiver() const {
- return maybe_receiver_.ToHandleChecked();
- }
+ Handle<Object> GetReceiver() const { return receiver_; }
Handle<JSObject> GetStoreTarget() const;
bool is_dictionary_holder() const { return holder_map_->is_dictionary_map(); }
Handle<Map> transition_map() const {
template <class T>
Handle<T> GetHolder() const {
DCHECK(IsFound());
- return Handle<T>::cast(maybe_holder_.ToHandleChecked());
+ return Handle<T>::cast(holder_);
}
Handle<JSReceiver> GetRoot() const;
bool HolderIsReceiverOrHiddenPrototype() const;
bool IsBootstrapping() const;
- // Methods that fetch data from the holder ensure they always have a holder.
- // This means the receiver needs to be present as opposed to just the receiver
- // map. Other objects in the prototype chain are transitively guaranteed to be
- // present via the receiver map.
- bool is_guaranteed_to_have_holder() const {
- return !maybe_receiver_.is_null();
- }
bool check_hidden() const { return (configuration_ & kHidden) != 0; }
bool check_interceptor() const {
return !IsBootstrapping() && (configuration_ & kInterceptor) != 0;
Handle<Name> name_;
Handle<Map> holder_map_;
Handle<Map> transition_map_;
- MaybeHandle<Object> maybe_receiver_;
- MaybeHandle<JSReceiver> maybe_holder_;
+ Handle<Object> receiver_;
+ Handle<JSReceiver> holder_;
int number_;
};
switch (it->state()) {
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::JSPROXY:
return JSProxy::GetPropertyWithHandler(it->GetHolder<JSProxy>(),
case LookupIterator::INTERCEPTOR:
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::ACCESS_CHECK:
if (it->HasAccess(v8::ACCESS_GET)) continue;
for (; it->IsFound(); it->Next()) {
switch (it->state()) {
case LookupIterator::NOT_FOUND:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::ACCESS_CHECK:
case LookupIterator::JSPROXY:
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::ACCESS_CHECK:
for (; it->IsFound(); it->Next()) {
switch (it->state()) {
case LookupIterator::NOT_FOUND:
- case LookupIterator::UNKNOWN:
case LookupIterator::TRANSITION:
UNREACHABLE();
case LookupIterator::JSPROXY:
case LookupIterator::JSPROXY:
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::ACCESS_CHECK:
if (it.HasAccess(v8::ACCESS_DELETE)) break;
case LookupIterator::INTERCEPTOR:
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::ACCESS_CHECK:
switch (it->state()) {
case LookupIterator::NOT_FOUND:
case LookupIterator::TRANSITION:
- case LookupIterator::UNKNOWN:
UNREACHABLE();
case LookupIterator::ACCESS_CHECK:
// Ignore access checks.