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