blob: ccd1fbb14d0b54143ae074ff0674d1b8305f1cd1 [file] [log] [blame]
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_LOOKUP_INL_H_
#define V8_LOOKUP_INL_H_
#include "src/lookup.h"
namespace v8 {
namespace internal {
JSReceiver* LookupIterator::NextHolder(Map* map) {
DisallowHeapAllocation no_gc;
if (map->prototype()->IsNull()) return NULL;
JSReceiver* next = JSReceiver::cast(map->prototype());
DCHECK(!next->map()->IsGlobalObjectMap() ||
next->map()->is_hidden_prototype());
if (!check_derived() &&
!(check_hidden() && next->map()->is_hidden_prototype())) {
return NULL;
}
return next;
}
LookupIterator::State LookupIterator::LookupInHolder(Map* map) {
DisallowHeapAllocation no_gc;
switch (state_) {
case NOT_FOUND:
if (map->IsJSProxyMap()) {
return JSPROXY;
}
if (check_access_check() && map->is_access_check_needed()) {
return ACCESS_CHECK;
}
// Fall through.
case ACCESS_CHECK:
if (check_interceptor() && map->has_named_interceptor()) {
return INTERCEPTOR;
}
// Fall through.
case INTERCEPTOR:
if (map->is_dictionary_map()) {
property_encoding_ = DICTIONARY;
} else {
DescriptorArray* descriptors = map->instance_descriptors();
number_ = descriptors->SearchWithCache(*name_, map);
if (number_ == DescriptorArray::kNotFound) return NOT_FOUND;
property_encoding_ = DESCRIPTOR;
}
return PROPERTY;
case PROPERTY:
return NOT_FOUND;
case JSPROXY:
UNREACHABLE();
}
UNREACHABLE();
return state_;
}
}
} // namespace v8::internal
#endif // V8_LOOKUP_INL_H_