1994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
2c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// Redistribution and use in source and binary forms, with or without
3c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// modification, are permitted provided that the following conditions are
4c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// met:
5c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//
6c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//     * Redistributions of source code must retain the above copyright
7c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//       notice, this list of conditions and the following disclaimer.
8c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//     * Redistributions in binary form must reproduce the above
9c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//       copyright notice, this list of conditions and the following
10c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//       disclaimer in the documentation and/or other materials provided
11c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//       with the distribution.
12c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//     * Neither the name of Google Inc. nor the names of its
13c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//       contributors may be used to endorse or promote products derived
14c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//       from this software without specific prior written permission.
15c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org//
16c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
28c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#ifndef V8_PROPERTY_DETAILS_H_
29c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#define V8_PROPERTY_DETAILS_H_
30c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
31c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#include "../include/v8.h"
32c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#include "allocation.h"
33c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#include "utils.h"
34c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
35c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// Ecma-262 3rd 8.6.1
36c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgenum PropertyAttributes {
37c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  NONE              = v8::None,
38c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  READ_ONLY         = v8::ReadOnly,
39c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  DONT_ENUM         = v8::DontEnum,
40c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  DONT_DELETE       = v8::DontDelete,
418e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
42a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  SEALED            = DONT_DELETE,
438e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  FROZEN            = SEALED | READ_ONLY,
448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
45750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  SYMBOLIC          = 8,  // Used to filter symbol names
46750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  DONT_SHOW         = DONT_ENUM | SYMBOLIC,
47c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  ABSENT            = 16  // Used in runtime to indicate a property is absent.
48c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // ABSENT can never be stored in or returned from a descriptor's attributes
49c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // bitfield.  It is only used as a return value meaning the attributes of
50c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // a non-existent property.
51c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org};
52c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
53c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
54c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgnamespace v8 {
55c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgnamespace internal {
56c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
57c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgclass Smi;
58e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgclass Type;
59e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgclass TypeInfo;
60c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
61c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// Type of properties.
62c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// Order of properties is significant.
63c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// Must fit in the BitField PropertyDetails::TypeField.
64c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// A copy of this is in mirror-debugger.js.
65c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgenum PropertyType {
6699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  // Only in slow mode.
6799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  NORMAL                    = 0,
6899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  // Only in fast mode.
6999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  FIELD                     = 1,
70fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  CONSTANT                  = 2,
71c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  CALLBACKS                 = 3,
7299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  // Only in lookup results, not in descriptors.
7399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  HANDLER                   = 4,
7499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  INTERCEPTOR               = 5,
7599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  TRANSITION                = 6,
767a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org  // Only used as a marker in LookupResult.
7799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  NONEXISTENT               = 7
78c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org};
79c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
80c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
81f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgclass Representation {
82f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org public:
83f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  enum Kind {
84f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    kNone,
85f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    kSmi,
86f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    kInteger32,
87f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    kDouble,
88906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    kHeapObject,
89f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    kTagged,
90f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    kExternal,
91f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    kNumRepresentations
92f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  };
93f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
94f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Representation() : kind_(kNone) { }
95f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
96f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Representation None() { return Representation(kNone); }
97f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Representation Tagged() { return Representation(kTagged); }
98f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Representation Smi() { return Representation(kSmi); }
99f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Representation Integer32() { return Representation(kInteger32); }
100f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Representation Double() { return Representation(kDouble); }
101906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  static Representation HeapObject() { return Representation(kHeapObject); }
102f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Representation External() { return Representation(kExternal); }
103f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
104f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Representation FromKind(Kind kind) { return Representation(kind); }
105f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
106e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  // TODO(rossberg): this should die eventually.
107e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  static Representation FromType(TypeInfo info);
108e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  static Representation FromType(Handle<Type> type);
109e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
11057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool Equals(const Representation& other) const {
111f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return kind_ == other.kind_;
112f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
113f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
11457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool IsCompatibleForLoad(const Representation& other) const {
11557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return (IsDouble() && other.IsDouble()) ||
11657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org        (!IsDouble() && !other.IsDouble());
11757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
11857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
119b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  bool IsCompatibleForStore(const Representation& other) const {
120b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    return Equals(other);
121b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  }
122b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org
12357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool is_more_general_than(const Representation& other) const {
124f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    ASSERT(kind_ != kExternal);
125f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    ASSERT(other.kind_ != kExternal);
1261fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    if (IsHeapObject()) return other.IsDouble() || other.IsNone();
127f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return kind_ > other.kind_;
128f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
129f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
13057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  bool fits_into(const Representation& other) const {
13157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return other.is_more_general_than(*this) || other.Equals(*this);
13257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
13357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
134f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Representation generalize(Representation other) {
135906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    if (other.fits_into(*this)) return *this;
136906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    if (other.is_more_general_than(*this)) return other;
137906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    return Representation::Tagged();
138f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
139f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
140f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Kind kind() const { return static_cast<Kind>(kind_); }
141f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  bool IsNone() const { return kind_ == kNone; }
142f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  bool IsTagged() const { return kind_ == kTagged; }
143f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  bool IsSmi() const { return kind_ == kSmi; }
144a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  bool IsSmiOrTagged() const { return IsSmi() || IsTagged(); }
145f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  bool IsInteger32() const { return kind_ == kInteger32; }
14653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  bool IsSmiOrInteger32() const { return IsSmi() || IsInteger32(); }
147f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  bool IsDouble() const { return kind_ == kDouble; }
148906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  bool IsHeapObject() const { return kind_ == kHeapObject; }
149f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  bool IsExternal() const { return kind_ == kExternal; }
150f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  bool IsSpecialization() const {
151f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return kind_ == kInteger32 || kind_ == kDouble;
152f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
153f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  const char* Mnemonic() const;
154f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
155f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org private:
156f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  explicit Representation(Kind k) : kind_(k) { }
157f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
158f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  // Make sure kind fits in int8.
159f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  STATIC_ASSERT(kNumRepresentations <= (1 << kBitsPerByte));
160f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
161f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  int8_t kind_;
162f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org};
163f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
164f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
165c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// PropertyDetails captures type and attributes for a property.
166c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org// They are used both in property dictionaries and instance descriptors.
167c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgclass PropertyDetails BASE_EMBEDDED {
168c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org public:
169c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  PropertyDetails(PropertyAttributes attributes,
170c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org                  PropertyType type,
17157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                  int index) {
172c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    value_ = TypeField::encode(type)
173c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org        | AttributesField::encode(attributes)
17446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        | DictionaryStorageField::encode(index);
175c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
176c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    ASSERT(type == this->type());
177c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org    ASSERT(attributes == this->attributes());
17857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
17957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
18057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PropertyDetails(PropertyAttributes attributes,
18157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org                  PropertyType type,
18279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org                  Representation representation,
18379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org                  int field_index = 0) {
18457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    value_ = TypeField::encode(type)
18557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org        | AttributesField::encode(attributes)
18679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org        | RepresentationField::encode(EncodeRepresentation(representation))
18779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org        | FieldIndexField::encode(field_index);
188c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
189c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
19046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int pointer() { return DescriptorPointer::decode(value_); }
19146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
19246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  PropertyDetails set_pointer(int i) { return PropertyDetails(value_, i); }
19346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
194f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  PropertyDetails CopyWithRepresentation(Representation representation) {
195f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return PropertyDetails(value_, representation);
196f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
197a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  PropertyDetails CopyAddAttributes(PropertyAttributes new_attributes) {
198a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    new_attributes =
199a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org        static_cast<PropertyAttributes>(attributes() | new_attributes);
200a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    return PropertyDetails(value_, new_attributes);
201a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
202f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
203c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // Conversion for storing details as Object*.
204c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  explicit inline PropertyDetails(Smi* smi);
205c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  inline Smi* AsSmi();
206c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
207f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static uint8_t EncodeRepresentation(Representation representation) {
20857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    return representation.kind();
209f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
210f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
211f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  static Representation DecodeRepresentation(uint32_t bits) {
212f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return Representation::FromKind(static_cast<Representation::Kind>(bits));
213f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
214f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
215c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  PropertyType type() { return TypeField::decode(value_); }
216c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
217c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  PropertyAttributes attributes() const {
218c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org    return AttributesField::decode(value_);
219c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  }
220c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
22146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int dictionary_index() {
22246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    return DictionaryStorageField::decode(value_);
22346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
22446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
225f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  Representation representation() {
2261fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    ASSERT(type() != NORMAL);
227f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    return DecodeRepresentation(RepresentationField::decode(value_));
228f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
229f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
23079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  int  field_index() {
23179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org    return FieldIndexField::decode(value_);
23279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  }
23379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org
234c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  inline PropertyDetails AsDeleted();
235c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
236c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  static bool IsValidIndex(int index) {
23746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    return DictionaryStorageField::is_valid(index);
238c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  }
239c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
240c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  bool IsReadOnly() const { return (attributes() & READ_ONLY) != 0; }
241c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  bool IsDontDelete() const { return (attributes() & DONT_DELETE) != 0; }
242c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  bool IsDontEnum() const { return (attributes() & DONT_ENUM) != 0; }
243c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  bool IsDeleted() const { return DeletedField::decode(value_) != 0;}
244c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
245c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // Bit fields in value_ (type, shift, size). Must be public so the
246c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  // constants can be embedded in generated code.
24746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  class TypeField:                public BitField<PropertyType,       0,  3> {};
24846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  class AttributesField:          public BitField<PropertyAttributes, 3,  3> {};
24979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org
25079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  // Bit fields for normalized objects.
25146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  class DeletedField:             public BitField<uint32_t,           6,  1> {};
25246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  class DictionaryStorageField:   public BitField<uint32_t,           7, 24> {};
25379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org
25479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  // Bit fields for fast objects.
25579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  class DescriptorPointer:        public BitField<uint32_t,           6, 11> {};
25679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  class RepresentationField:      public BitField<uint32_t,          17,  3> {};
25779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  class FieldIndexField:          public BitField<uint32_t,          20, 11> {};
258c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
259c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  static const int kInitialIndex = 1;
260c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
261c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org private:
26246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  PropertyDetails(int value, int pointer) {
263f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    value_ = DescriptorPointer::update(value, pointer);
264f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
265f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  PropertyDetails(int value, Representation representation) {
266f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    value_ = RepresentationField::update(
267f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org        value, EncodeRepresentation(representation));
26846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
269a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  PropertyDetails(int value, PropertyAttributes attributes) {
270a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    value_ = AttributesField::update(value, attributes);
271a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
27246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
273c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  uint32_t value_;
274c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org};
275c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
276c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org} }  // namespace v8::internal
277c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
278c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org#endif  // V8_PROPERTY_DETAILS_H_
279