13e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 23e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 33e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org// found in the LICENSE file. 43e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 53e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#ifndef V8_LOOKUP_INL_H_ 63e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#define V8_LOOKUP_INL_H_ 73e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 83e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/lookup.h" 93e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 103e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgnamespace v8 { 113e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgnamespace internal { 123e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 133e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 143e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.orgJSReceiver* LookupIterator::NextHolder(Map* map) { 153e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org DisallowHeapAllocation no_gc; 163e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org if (map->prototype()->IsNull()) return NULL; 173e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 183e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org JSReceiver* next = JSReceiver::cast(map->prototype()); 193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org DCHECK(!next->map()->IsGlobalObjectMap() || 203e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org next->map()->is_hidden_prototype()); 213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 226474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org if (!check_prototype_chain() && 23f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org !(check_hidden() && next->map()->is_hidden_prototype()) && 24f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org // Always lookup behind the JSGlobalProxy into the JSGlobalObject, even 25f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org // when not checking other hidden prototypes. 266474a1cfee1cdad45de5cc96960085e1c7daf11cmachenbach@chromium.org !map->IsJSGlobalProxyMap()) { 273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return NULL; 283e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 293e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 303e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return next; 313e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} 323e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 333e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 341af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.orgLookupIterator::State LookupIterator::LookupInHolder(Map* map, 351af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org JSReceiver* holder) { 367dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org STATIC_ASSERT(INTERCEPTOR == BEFORE_PROPERTY); 373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org DisallowHeapAllocation no_gc; 383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org switch (state_) { 393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case NOT_FOUND: 409aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org if (map->IsJSProxyMap()) return JSPROXY; 419aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org if (map->is_access_check_needed()) return ACCESS_CHECK; 423e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org // Fall through. 433e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case ACCESS_CHECK: 443e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org if (check_interceptor() && map->has_named_interceptor()) { 453e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return INTERCEPTOR; 463e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 473e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org // Fall through. 483e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case INTERCEPTOR: 493e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org if (map->is_dictionary_map()) { 501af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org NameDictionary* dict = JSObject::cast(holder)->property_dictionary(); 511af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org number_ = dict->FindEntry(name_); 521af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org if (number_ == NameDictionary::kNotFound) return NOT_FOUND; 531af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org property_details_ = dict->DetailsAt(number_); 541af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org if (holder->IsGlobalObject()) { 551af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org if (property_details_.IsDeleted()) return NOT_FOUND; 561af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org PropertyCell* cell = PropertyCell::cast(dict->ValueAt(number_)); 571af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org if (cell->value()->IsTheHole()) return NOT_FOUND; 581af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org } 593e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } else { 603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org DescriptorArray* descriptors = map->instance_descriptors(); 613e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org number_ = descriptors->SearchWithCache(*name_, map); 623e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org if (number_ == DescriptorArray::kNotFound) return NOT_FOUND; 631af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org property_details_ = descriptors->GetDetails(number_); 643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 651af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org has_property_ = true; 661af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org switch (property_details_.type()) { 671af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org case v8::internal::CONSTANT: 681af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org case v8::internal::FIELD: 691af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org case v8::internal::NORMAL: 701af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org return DATA; 711af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org case v8::internal::CALLBACKS: 721af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org return ACCESSOR; 731af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org } 741af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org case ACCESSOR: 751af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org case DATA: 763e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return NOT_FOUND; 773e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org case JSPROXY: 78a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org case TRANSITION: 793e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org UNREACHABLE(); 803e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org } 813e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org UNREACHABLE(); 823e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org return state_; 833e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} 843e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} 853e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org} // namespace v8::internal 863e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org 873e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#endif // V8_LOOKUP_INL_H_ 88