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