1ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
2ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
3ed1a63112185152bc10fbd02418393804a5fcf04machenbach@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_PROPERTY_H_
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_PROPERTY_H_
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
9e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org#include "src/field-index.h"
10e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org#include "src/field-index-inl.h"
114b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/isolate.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/types.h"
131c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
1571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass OStream;
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Abstraction for elements in instance-descriptor arrays.
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Each descriptor has a key, property attributes, property type,
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// property index (in the actual instance-descriptor array) and
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// optionally a piece of data.
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Descriptor BASE_EMBEDDED {
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  void KeyToUniqueName() {
27750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    if (!key_->IsUniqueName()) {
285b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      key_ = key_->GetIsolate()->factory()->InternalizeString(
295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          Handle<String>::cast(key_));
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  Handle<Name> GetKey() const { return key_; }
34f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  Handle<Object> GetValue() const { return value_; }
35f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  PropertyDetails GetDetails() const { return details_; }
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  void SetSortedKeyIndex(int index) { details_ = details_.set_pointer(index); }
3846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Name> key_;
415b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Handle<Object> value_;
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PropertyDetails details_;
4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected:
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Descriptor() : details_(Smi::FromInt(0)) {}
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  void Init(Handle<Name> key, Handle<Object> value, PropertyDetails details) {
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    key_ = key;
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    value_ = value;
5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    details_ = details;
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
535b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Descriptor(Handle<Name> key, Handle<Object> value, PropertyDetails details)
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : key_(key),
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        value_(value),
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        details_(details) { }
5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
585b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  Descriptor(Handle<Name> key,
595b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org             Handle<Object> value,
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             PropertyAttributes attributes,
6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen             PropertyType type,
6279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org             Representation representation,
6379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org             int field_index = 0)
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      : key_(key),
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        value_(value),
6679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org        details_(attributes, type, representation, field_index) { }
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  friend class DescriptorArray;
69a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org  friend class Map;
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const Descriptor& d);
74f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org
75f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org
76ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass FieldDescriptor FINAL : public Descriptor {
7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
785b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  FieldDescriptor(Handle<Name> key,
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  int field_index,
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                  PropertyAttributes attributes,
8157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                  Representation representation)
82e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org      : Descriptor(key, HeapType::Any(key->GetIsolate()), attributes,
8379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org                   FIELD, representation, field_index) {}
84e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  FieldDescriptor(Handle<Name> key,
85e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org                  int field_index,
86e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org                  Handle<HeapType> field_type,
87e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org                  PropertyAttributes attributes,
88e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org                  Representation representation)
89e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org      : Descriptor(key, field_type, attributes, FIELD,
90e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org                   representation, field_index) { }
9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ConstantDescriptor FINAL : public Descriptor {
9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
965b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  ConstantDescriptor(Handle<Name> key,
975b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org                     Handle<Object> value,
98fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                     PropertyAttributes attributes)
99fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      : Descriptor(key, value, attributes, CONSTANT,
100fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                   value->OptimalRepresentation()) {}
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CallbacksDescriptor FINAL : public Descriptor {
10543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
1065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  CallbacksDescriptor(Handle<Name> key,
1075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org                      Handle<Object> foreign,
10857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                      PropertyAttributes attributes)
109f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org      : Descriptor(key, foreign, attributes, CALLBACKS,
11057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                   Representation::Tagged()) {}
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass LookupResult FINAL BASE_EMBEDDED {
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
116394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  explicit LookupResult(Isolate* isolate)
117394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      : isolate_(isolate),
118394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        next_(isolate->top_lookup_result()),
119394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        lookup_type_(NOT_FOUND),
120394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        holder_(NULL),
121bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org        transition_(NULL),
122f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org        details_(NONE, NORMAL, Representation::None()) {
123f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    isolate->set_top_lookup_result(this);
124394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
125394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
126394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  ~LookupResult() {
127e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(isolate()->top_lookup_result() == this);
128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    isolate()->set_top_lookup_result(next_);
129394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1318432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  Isolate* isolate() const { return isolate_; }
1328432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void DescriptorResult(JSObject* holder, PropertyDetails details, int number) {
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    lookup_type_ = DESCRIPTOR_TYPE;
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    holder_ = holder;
136f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    transition_ = NULL;
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    details_ = details;
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    number_ = number;
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org  void TransitionResult(JSObject* holder, Map* target) {
14299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    lookup_type_ = TRANSITION_TYPE;
1438f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org    number_ = target->LastAdded();
1448f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org    details_ = target->instance_descriptors()->GetDetails(number_);
14599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    holder_ = holder;
146bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org    transition_ = target;
14799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  }
14899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void NotFound() {
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    lookup_type_ = NOT_FOUND;
151f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org    details_ = PropertyDetails(NONE, NORMAL, Representation::None());
152394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    holder_ = NULL;
153f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    transition_ = NULL;
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
156f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Representation representation() const {
157e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsFound());
158f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return details_.representation();
159f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
160f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
16199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  // Property callbacks does not include transitions to callbacks.
162f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool IsPropertyCallbacks() const {
163e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!(details_.type() == CALLBACKS && !IsFound()));
1648f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org    return !IsTransition() && details_.type() == CALLBACKS;
165de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
166de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
167f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool IsReadOnly() const {
168e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsFound());
16999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    return details_.IsReadOnly();
170de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
171de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
172f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool IsField() const {
173e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!(details_.type() == FIELD && !IsFound()));
174fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    return lookup_type_ == DESCRIPTOR_TYPE && details_.type() == FIELD;
175de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org  }
176de0db002768654f346a9059d80ab47602018bfa0yangguo@chromium.org
177f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool IsConstant() const {
178e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!(details_.type() == CONSTANT && !IsFound()));
179fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    return lookup_type_ == DESCRIPTOR_TYPE && details_.type() == CONSTANT;
180fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
181fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
182f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org  bool IsConfigurable() const { return details_.IsConfigurable(); }
183f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool IsFound() const { return lookup_type_ != NOT_FOUND; }
184f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool IsTransition() const { return lookup_type_ == TRANSITION_TYPE; }
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1869a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org  // Is the result is a property excluding transitions and the null descriptor?
187f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool IsProperty() const {
18899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    return IsFound() && !IsTransition();
1895c838251403b0be9a882540f1922577abba4c872ager@chromium.org  }
1905c838251403b0be9a882540f1922577abba4c872ager@chromium.org
191f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Map* GetTransitionTarget() const {
192e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(IsTransition());
1938f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org    return transition_;
19499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  }
19599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
196f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  bool IsTransitionToField() const {
1978f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org    return IsTransition() && details_.type() == FIELD;
198b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  }
199b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org
200f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  int GetLocalFieldIndexFromMap(Map* map) const {
20179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org    return GetFieldIndexFromMap(map) - map->inobject_properties();
202a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
203a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
204f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  Object* GetConstantFromMap(Map* map) const {
205fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    DCHECK(details_.type() == CONSTANT);
206fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return GetValueFromMap(map);
207fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
208fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
20999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  Object* GetValueFromMap(Map* map) const {
210e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(lookup_type_ == DESCRIPTOR_TYPE ||
2118f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org           lookup_type_ == TRANSITION_TYPE);
212e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(number_ < map->NumberOfOwnDescriptors());
21399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    return map->instance_descriptors()->GetValue(number_);
21499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  }
21599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
21679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  int GetFieldIndexFromMap(Map* map) const {
217e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(lookup_type_ == DESCRIPTOR_TYPE ||
2188f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org           lookup_type_ == TRANSITION_TYPE);
219e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(number_ < map->NumberOfOwnDescriptors());
22079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org    return map->instance_descriptors()->GetFieldIndex(number_);
22179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  }
22279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org
223e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  HeapType* GetFieldTypeFromMap(Map* map) const {
224fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    DCHECK_NE(NOT_FOUND, lookup_type_);
225e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(number_ < map->NumberOfOwnDescriptors());
226e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org    return map->instance_descriptors()->GetFieldType(number_);
227e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  }
228e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org
229e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  Map* GetFieldOwnerFromMap(Map* map) const {
230e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(lookup_type_ == DESCRIPTOR_TYPE ||
231e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org           lookup_type_ == TRANSITION_TYPE);
232e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(number_ < map->NumberOfOwnDescriptors());
233e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org    return map->FindFieldOwner(number_);
234e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  }
235e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org
236394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  void Iterate(ObjectVisitor* visitor);
237394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
239394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  Isolate* isolate_;
240394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  LookupResult* next_;
241394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
242c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  // Where did we find the result;
243fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  enum { NOT_FOUND, DESCRIPTOR_TYPE, TRANSITION_TYPE } lookup_type_;
244c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org
245c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  JSReceiver* holder_;
246bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org  Map* transition_;
24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int number_;
24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PropertyDetails details_;
24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
251f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org
252f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const LookupResult& r);
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_PROPERTY_H_
256