objects-inl.h revision f87a203d89e1bbb6708282e0b64dbd13d59b723d
1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Review notes:
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - The use of macros in these inline functions may seem superfluous
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// but it is absolutely needed to make sure gcc generates optimal
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// code. gcc is not happy when attempting to inline too deep.
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_OBJECTS_INL_H_
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_OBJECTS_INL_H_
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "objects.h"
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "contexts.h"
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "conversions-inl.h"
4180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "heap.h"
4280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "memory.h"
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "property.h"
4480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "spaces.h"
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails::PropertyDetails(Smi* smi) {
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value_ = smi->value();
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* PropertyDetails::AsSmi() {
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Smi::FromInt(value_);
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails PropertyDetails::AsDeleted() {
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PropertyDetails d(DONT_ENUM, NORMAL);
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Smi* smi = Smi::FromInt(AsSmi()->value() | DeletedField::encode(1));
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return PropertyDetails(smi);
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CAST_ACCESSOR(type)                     \
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  type* type::cast(Object* object) {            \
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(object->Is##type());                 \
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return reinterpret_cast<type*>(object);     \
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define INT_ACCESSORS(holder, name, offset)                             \
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int holder::name() { return READ_INT_FIELD(this, offset); }           \
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); }
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define ACCESSORS(holder, name, type, offset)                           \
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(type* value, WriteBarrierMode mode) {         \
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);                                   \
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    CONDITIONAL_WRITE_BARRIER(this, offset, mode);                      \
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define SMI_ACCESSORS(holder, name, offset)             \
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int holder::name() {                                  \
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Object* value = READ_FIELD(this, offset);           \
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return Smi::cast(value)->value();                   \
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }                                                     \
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(int value) {                  \
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, Smi::FromInt(value));     \
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_GETTER(holder, field, name, offset)           \
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool holder::name() {                                    \
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return BooleanBit::get(field(), offset);               \
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }                                                        \
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_ACCESSORS(holder, field, name, offset)        \
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool holder::name() {                                    \
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return BooleanBit::get(field(), offset);               \
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }                                                        \
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(bool value) {                    \
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_##field(BooleanBit::set(field(), offset, value));  \
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsInstanceOf(FunctionTemplateInfo* expected) {
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // There is a constraint on the object; check.
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!this->IsJSObject()) return false;
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Fetch the constructor function of the object.
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* cons_obj = JSObject::cast(this)->map()->constructor();
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!cons_obj->IsJSFunction()) return false;
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSFunction* fun = JSFunction::cast(cons_obj);
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Iterate through the chain of inheriting function templates to
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // see if the required one occurs.
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (Object* type = fun->shared()->function_data();
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       type->IsFunctionTemplateInfo();
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       type = FunctionTemplateInfo::cast(type)->parent_template()) {
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (type == expected) return true;
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Didn't find the required type in the inheritance chain.
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return false;
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSmi() {
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_SMI_TAG(this);
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHeapObject() {
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Internals::HasHeapObjectTag(this);
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHeapNumber() {
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == HEAP_NUMBER_TYPE;
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsString() {
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE;
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSymbol() {
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!this->IsHeapObject()) return false;
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t type = HeapObject::cast(this)->map()->instance_type();
155e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // Because the symbol tag is non-zero and no non-string types have the
156e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // symbol bit set we can test for symbols with a very simple test
157e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // operation.
158e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  ASSERT(kSymbolTag != 0);
159e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  ASSERT(kNotStringTag + kIsSymbolMask > LAST_TYPE);
160e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  return (type & kIsSymbolMask) != 0;
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsConsString() {
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!this->IsHeapObject()) return false;
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t type = HeapObject::cast(this)->map()->instance_type();
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type & (kIsNotStringMask | kStringRepresentationMask)) ==
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         (kStringTag | kConsStringTag);
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqString() {
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential();
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqAsciiString() {
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential() &&
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsAsciiRepresentation();
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqTwoByteString() {
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential() &&
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsTwoByteRepresentation();
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalString() {
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal();
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalAsciiString() {
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal() &&
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsAsciiRepresentation();
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalTwoByteString() {
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal() &&
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsTwoByteRepresentation();
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(String* str)
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : type_(str->map()->instance_type()) {
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_valid();
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((type_ & kIsNotStringMask) == kStringTag);
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(Map* map)
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : type_(map->instance_type()) {
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_valid();
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((type_ & kIsNotStringMask) == kStringTag);
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(InstanceType t)
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : type_(static_cast<uint32_t>(t)) {
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_valid();
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((type_ & kIsNotStringMask) == kStringTag);
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSymbol() {
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(valid());
235e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  ASSERT(kSymbolTag != 0);
236e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  return (type_ & kIsSymbolMask) != 0;
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsAsciiRepresentation() {
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t type = map()->instance_type();
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type & kStringEncodingMask) == kAsciiStringTag;
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsTwoByteRepresentation() {
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t type = map()->instance_type();
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type & kStringEncodingMask) == kTwoByteStringTag;
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2529dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenbool String::HasOnlyAsciiChars() {
2539dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  uint32_t type = map()->instance_type();
2549dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  return (type & kStringEncodingMask) == kAsciiStringTag ||
2559dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen         (type & kAsciiDataHintMask) == kAsciiDataHintTag;
2566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
2576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsCons() {
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type_ & kStringRepresentationMask) == kConsStringTag;
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternal() {
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type_ & kStringRepresentationMask) == kExternalStringTag;
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequential() {
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type_ & kStringRepresentationMask) == kSeqStringTag;
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringRepresentationTag StringShape::representation_tag() {
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t tag = (type_ & kStringRepresentationMask);
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<StringRepresentationTag>(tag);
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t StringShape::full_representation_tag() {
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type_ & (kStringRepresentationMask | kStringEncodingMask));
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSTATIC_CHECK((kStringRepresentationMask | kStringEncodingMask) ==
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             Internals::kFullStringRepresentationMask);
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequentialAscii() {
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return full_representation_tag() == (kSeqStringTag | kAsciiStringTag);
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequentialTwoByte() {
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return full_representation_tag() == (kSeqStringTag | kTwoByteStringTag);
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternalAscii() {
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return full_representation_tag() == (kExternalStringTag | kAsciiStringTag);
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternalTwoByte() {
305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag);
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSTATIC_CHECK((kExternalStringTag | kTwoByteStringTag) ==
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             Internals::kExternalTwoByteRepresentationTag);
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc32 FlatStringReader::Get(int index) {
314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= index && index <= length_);
315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (is_ascii_) {
316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return static_cast<const byte*>(start_)[index];
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return static_cast<const uc16*>(start_)[index];
319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsNumber() {
324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsSmi() || IsHeapNumber();
325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsByteArray() {
329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == BYTE_ARRAY_TYPE;
331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsPixelArray() {
335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject() &&
336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      HeapObject::cast(this)->map()->instance_type() == PIXEL_ARRAY_TYPE;
337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalArray() {
3413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (!Object::IsHeapObject())
3423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return false;
3433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  InstanceType instance_type =
3443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type();
345e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE &&
346e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke          instance_type <= LAST_EXTERNAL_ARRAY_TYPE);
3473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
3483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalByteArray() {
3513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Object::IsHeapObject() &&
3523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type() ==
3533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      EXTERNAL_BYTE_ARRAY_TYPE;
3543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
3553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalUnsignedByteArray() {
3583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Object::IsHeapObject() &&
3593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type() ==
3603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE;
3613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
3623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalShortArray() {
3653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Object::IsHeapObject() &&
3663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type() ==
3673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      EXTERNAL_SHORT_ARRAY_TYPE;
3683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
3693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalUnsignedShortArray() {
3723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Object::IsHeapObject() &&
3733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type() ==
3743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE;
3753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
3763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalIntArray() {
3793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Object::IsHeapObject() &&
3803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type() ==
3813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      EXTERNAL_INT_ARRAY_TYPE;
3823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
3833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalUnsignedIntArray() {
3863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Object::IsHeapObject() &&
3873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type() ==
3883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      EXTERNAL_UNSIGNED_INT_ARRAY_TYPE;
3893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
3903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalFloatArray() {
3933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return Object::IsHeapObject() &&
3943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type() ==
3953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      EXTERNAL_FLOAT_ARRAY_TYPE;
3963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
3973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsFailure() {
400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_FAILURE_TAG(this);
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsRetryAfterGC() {
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_FAILURE_TAG(this)
406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC;
407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsOutOfMemoryFailure() {
411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_FAILURE_TAG(this)
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && Failure::cast(this)->IsOutOfMemoryException();
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsException() {
417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this == Failure::Exception();
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSObject() {
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHeapObject()
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSContextExtensionObject() {
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHeapObject()
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && (HeapObject::cast(this)->map()->instance_type() ==
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        JS_CONTEXT_EXTENSION_OBJECT_TYPE);
431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsMap() {
435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == MAP_TYPE;
437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsFixedArray() {
441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == FIXED_ARRAY_TYPE;
443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsDescriptorArray() {
447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsFixedArray();
448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsContext() {
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && (HeapObject::cast(this)->map() == Heap::context_map() ||
454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        HeapObject::cast(this)->map() == Heap::catch_context_map() ||
455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        HeapObject::cast(this)->map() == Heap::global_context_map());
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsCatchContext() {
460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map() == Heap::catch_context_map();
462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsGlobalContext() {
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map() == Heap::global_context_map();
468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSFunction() {
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == JS_FUNCTION_TYPE;
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> inline bool Is<JSFunction>(Object* obj) {
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return obj->IsJSFunction();
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsCode() {
483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == CODE_TYPE;
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsOddball() {
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == ODDBALL_TYPE;
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSGlobalPropertyCell() {
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      && HeapObject::cast(this)->map()->instance_type()
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      == JS_GLOBAL_PROPERTY_CELL_TYPE;
498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSharedFunctionInfo() {
502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject() &&
503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (HeapObject::cast(this)->map()->instance_type() ==
504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       SHARED_FUNCTION_INFO_TYPE);
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSValue() {
509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == JS_VALUE_TYPE;
511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStringWrapper() {
515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsJSValue() && JSValue::cast(this)->value()->IsString();
516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsProxy() {
520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == PROXY_TYPE;
522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsBoolean() {
526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsTrue() || IsFalse();
527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSArray() {
531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == JS_ARRAY_TYPE;
533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSRegExp() {
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() == JS_REGEXP_TYPE;
539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> inline bool Is<JSArray>(Object* obj) {
543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return obj->IsJSArray();
544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHashTable() {
548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map() == Heap::hash_table_map();
550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsDictionary() {
554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHashTable() && this != Heap::symbol_table();
555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSymbolTable() {
559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHashTable() && this == Heap::raw_unchecked_symbol_table();
560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5636ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Object::IsJSFunctionResultCache() {
5646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (!IsFixedArray()) return false;
5656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  FixedArray* self = FixedArray::cast(this);
5666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int length = self->length();
5676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (length < JSFunctionResultCache::kEntriesIndex) return false;
5686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if ((length - JSFunctionResultCache::kEntriesIndex)
5696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      % JSFunctionResultCache::kEntrySize != 0) {
5706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return false;
5716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
5726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef DEBUG
5736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  reinterpret_cast<JSFunctionResultCache*>(this)->JSFunctionResultCacheVerify();
5746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif
5756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return true;
5766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
5776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
5786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
57980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenbool Object::IsNormalizedMapCache() {
58080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  if (!IsFixedArray()) return false;
58180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  if (FixedArray::cast(this)->length() != NormalizedMapCache::kEntries) {
58280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    return false;
58380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
58480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#ifdef DEBUG
58580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  reinterpret_cast<NormalizedMapCache*>(this)->NormalizedMapCacheVerify();
58680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#endif
58780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  return true;
58880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
58980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
59080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsCompilationCacheTable() {
592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHashTable();
593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5966ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Object::IsCodeCacheHashTable() {
5976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return IsHashTable();
5986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
5996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsMapCache() {
602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHashTable();
603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsPrimitive() {
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsOddball() || IsNumber() || IsString();
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSGlobalProxy() {
612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool result = IsHeapObject() &&
613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                (HeapObject::cast(this)->map()->instance_type() ==
614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 JS_GLOBAL_PROXY_TYPE);
615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!result || IsAccessCheckNeeded());
616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsGlobalObject() {
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsHeapObject()) return false;
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InstanceType type = HeapObject::cast(this)->map()->instance_type();
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return type == JS_GLOBAL_OBJECT_TYPE ||
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         type == JS_BUILTINS_OBJECT_TYPE;
626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSGlobalObject() {
630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHeapObject() &&
631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (HeapObject::cast(this)->map()->instance_type() ==
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       JS_GLOBAL_OBJECT_TYPE);
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSBuiltinsObject() {
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHeapObject() &&
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (HeapObject::cast(this)->map()->instance_type() ==
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       JS_BUILTINS_OBJECT_TYPE);
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsUndetectableObject() {
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHeapObject()
645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->is_undetectable();
646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsAccessCheckNeeded() {
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHeapObject()
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->is_access_check_needed();
652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStruct() {
656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsHeapObject()) return false;
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (HeapObject::cast(this)->map()->instance_type()) {
658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true;
659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  STRUCT_LIST(MAKE_STRUCT_CASE)
660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CASE
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default: return false;
662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_PREDICATE(NAME, Name, name)                  \
667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool Object::Is##Name() {                                      \
668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return Object::IsHeapObject()                                \
669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \
670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  STRUCT_LIST(MAKE_STRUCT_PREDICATE)
672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_PREDICATE
673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsUndefined() {
676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this == Heap::undefined_value();
677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsTheHole() {
681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this == Heap::the_hole_value();
682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsNull() {
686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this == Heap::null_value();
687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsTrue() {
691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this == Heap::true_value();
692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsFalse() {
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this == Heap::false_value();
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdouble Object::Number() {
701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(IsNumber());
702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsSmi()
703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ? static_cast<double>(reinterpret_cast<Smi*>(this)->value())
704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    : reinterpret_cast<HeapNumber*>(this)->value();
705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::ToSmi() {
710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (IsSmi()) return this;
711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (IsHeapNumber()) {
712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    double value = HeapNumber::cast(this)->value();
713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int int_value = FastD2I(value);
714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (value == FastI2D(int_value) && Smi::IsValid(int_value)) {
715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return Smi::FromInt(int_value);
716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Failure::Exception();
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::HasSpecificClassOf(String* name) {
723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this->IsJSObject() && (JSObject::cast(this)->class_name() == name);
724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::GetElement(uint32_t index) {
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetElementWithReceiver(this, index);
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::GetProperty(String* key) {
733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PropertyAttributes attributes;
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetPropertyWithReceiver(this, key, &attributes);
735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::GetProperty(String* key, PropertyAttributes* attributes) {
739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetPropertyWithReceiver(this, key, attributes);
740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define FIELD_ADDR(p, offset) \
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag)
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_FIELD(p, offset) \
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)))
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_FIELD(p, offset, value) \
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value)
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_BARRIER(object, offset) \
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Heap::RecordWrite(object->address(), offset);
755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// CONDITIONAL_WRITE_BARRIER must be issued after the actual
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// write due to the assert validating the written value.
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CONDITIONAL_WRITE_BARRIER(object, offset, mode) \
759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (mode == UPDATE_WRITE_BARRIER) { \
760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Heap::RecordWrite(object->address(), offset); \
761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else { \
762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(mode == SKIP_WRITE_BARRIER); \
763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(Heap::InNewSpace(object) || \
7646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block           !Heap::InNewSpace(READ_FIELD(object, offset)) || \
7657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch           Page::FromAddress(object->address())->           \
7667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch               IsRegionDirty(object->address() + offset));  \
767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_DOUBLE_FIELD(p, offset) \
770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)))
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_DOUBLE_FIELD(p, offset, value) \
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value)
774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INT_FIELD(p, offset) \
776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)))
777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INT_FIELD(p, offset, value) \
779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value)
780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INTPTR_FIELD(p, offset) \
782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)))
783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INTPTR_FIELD(p, offset, value) \
785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value)
786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_UINT32_FIELD(p, offset) \
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)))
789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_UINT32_FIELD(p, offset, value) \
791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value)
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_SHORT_FIELD(p, offset) \
794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)))
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_SHORT_FIELD(p, offset, value) \
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value)
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_BYTE_FIELD(p, offset) \
800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)))
801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_BYTE_FIELD(p, offset, value) \
803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value)
804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject** HeapObject::RawField(HeapObject* obj, int byte_offset) {
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return &READ_FIELD(obj, byte_offset);
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Smi::value() {
812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Internals::SmiValue(this);
813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* Smi::FromInt(int value) {
817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(Smi::IsValid(value));
8183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  intptr_t tagged_value =
8203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag;
821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Smi*>(tagged_value);
822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* Smi::FromIntptr(intptr_t value) {
826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(Smi::IsValid(value));
8273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
8283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag);
829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure::Type Failure::type() const {
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<Type>(value() & kFailureTypeTagMask);
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Failure::IsInternalError() const {
838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return type() == INTERNAL_ERROR;
839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Failure::IsOutOfMemoryException() const {
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return type() == OUT_OF_MEMORY_EXCEPTION;
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAllocationSpace Failure::allocation_space() const {
848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_EQ(RETRY_AFTER_GC, type());
849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<AllocationSpace>((value() >> kFailureTypeTagSize)
850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      & kSpaceTagMask);
851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::InternalError() {
855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Construct(INTERNAL_ERROR);
856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::Exception() {
860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Construct(EXCEPTION);
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::OutOfMemoryException() {
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Construct(OUT_OF_MEMORY_EXCEPTION);
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockintptr_t Failure::value() const {
8706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return static_cast<intptr_t>(
8716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      reinterpret_cast<uintptr_t>(this) >> kFailureTagSize);
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
875f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochFailure* Failure::RetryAfterGC() {
876f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  return RetryAfterGC(NEW_SPACE);
877f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch}
878f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
879f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
880f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochFailure* Failure::RetryAfterGC(AllocationSpace space) {
881f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  ASSERT((space & ~kSpaceTagMask) == 0);
882f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  return Construct(RETRY_AFTER_GC, space);
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockFailure* Failure::Construct(Type type, intptr_t value) {
8876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  uintptr_t info =
8886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      (static_cast<uintptr_t>(value) << kFailureTypeTagSize) | type;
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info);
8903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return reinterpret_cast<Failure*>((info << kFailureTagSize) | kFailureTag);
891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Smi::IsValid(intptr_t value) {
895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool in_range = (value >= kMinValue) && (value <= kMaxValue);
897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
8983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
8993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#ifdef V8_TARGET_ARCH_X64
9003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  // To be representable as a long smi, the value must be a 32-bit integer.
9013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  bool result = (value == static_cast<int32_t>(value));
9023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#else
903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // To be representable as an tagged small integer, the two
904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // most-significant bits of 'value' must be either 00 or 11 due to
905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // sign-extension. To check this we add 01 to the two
906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // most-significant bits, and check if the most-significant bit is 0
907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  //
908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // CAUTION: The original code below:
909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // bool result = ((value + 0x40000000) & 0x80000000) == 0;
910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // may lead to incorrect results according to the C language spec, and
911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // in fact doesn't work correctly with gcc4.1.1 in some cases: The
912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // compiler may produce undefined results in case of signed integer
913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // overflow. The computation must be done w/ unsigned ints.
9143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  bool result = (static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U);
915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(result == in_range);
917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromMap(Map* map) {
922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(map));
923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* MapWord::ToMap() {
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Map*>(value_);
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool MapWord::IsForwardingAddress() {
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_SMI_TAG(reinterpret_cast<Object*>(value_));
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromForwardingAddress(HeapObject* object) {
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag;
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(raw));
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* MapWord::ToForwardingAddress() {
943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(IsForwardingAddress());
944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HeapObject::FromAddress(reinterpret_cast<Address>(value_));
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool MapWord::IsMarked() {
949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (value_ & kMarkingMask) == 0;
950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid MapWord::SetMark() {
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value_ &= ~kMarkingMask;
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid MapWord::ClearMark() {
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value_ |= kMarkingMask;
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool MapWord::IsOverflowed() {
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (value_ & kOverflowMask) != 0;
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid MapWord::SetOverflow() {
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value_ |= kOverflowMask;
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid MapWord::ClearOverflow() {
974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value_ &= ~kOverflowMask;
975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::EncodeAddress(Address map_address, int offset) {
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Offset is the distance in live bytes from the first live object in the
980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // same page. The offset between two objects in the same page should not
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // exceed the object area size of a page.
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= offset && offset < Page::kObjectAreaSize);
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
984e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  uintptr_t compact_offset = offset >> kObjectAlignmentBits;
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(compact_offset < (1 << kForwardingOffsetBits));
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Page* map_page = Page::FromAddress(map_address);
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_MAP_PAGE_INDEX(map_page->mc_page_index);
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
990e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  uintptr_t map_page_offset =
991e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke      map_page->Offset(map_address) >> kMapAlignmentBits;
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uintptr_t encoding =
994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (compact_offset << kForwardingOffsetShift) |
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (map_page_offset << kMapPageOffsetShift) |
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (map_page->mc_page_index << kMapPageIndexShift);
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(encoding);
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress MapWord::DecodeMapAddress(MapSpace* map_space) {
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int map_page_index =
1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      static_cast<int>((value_ & kMapPageIndexMask) >> kMapPageIndexShift);
1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_MAP_PAGE_INDEX(map_page_index);
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int map_page_offset = static_cast<int>(
1007e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke      ((value_ & kMapPageOffsetMask) >> kMapPageOffsetShift) <<
1008e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke      kMapAlignmentBits);
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (map_space->PageAddress(map_page_index) + map_page_offset);
1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint MapWord::DecodeOffset() {
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The offset field is represented in the kForwardingOffsetBits
1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // most-significant bits.
1017d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  uintptr_t offset = (value_ >> kForwardingOffsetShift) << kObjectAlignmentBits;
1018d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  ASSERT(offset < static_cast<uintptr_t>(Page::kObjectAreaSize));
1019d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return static_cast<int>(offset);
1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromEncodedAddress(Address address) {
1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(address));
1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress MapWord::ToEncodedAddress() {
1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Address>(value_);
1030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::VerifyObjectField(int offset) {
1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(READ_FIELD(this, offset));
1036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
10377f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
10387f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid HeapObject::VerifySmiField(int offset) {
10397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  ASSERT(READ_FIELD(this, offset)->IsSmi());
10407f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
1041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* HeapObject::map() {
1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map_word().ToMap();
1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map(Map* value) {
1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_map_word(MapWord::FromMap(value));
1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord HeapObject::map_word() {
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset)));
1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map_word(MapWord map_word) {
10607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  // WRITE_FIELD does not invoke write barrier, but there is no need
1061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // here.
1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* HeapObject::FromAddress(Address address) {
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_TAG_ALIGNED(address);
1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<HeapObject*>(address + kHeapObjectTag);
1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress HeapObject::address() {
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Address>(this) - kHeapObjectTag;
1074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::Size() {
1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return SizeFromMap(map());
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) {
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)),
1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   reinterpret_cast<Object**>(FIELD_ADDR(this, end)));
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::IteratePointer(ObjectVisitor* v, int offset) {
1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  v->VisitPointer(reinterpret_cast<Object**>(FIELD_ADDR(this, offset)));
1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HeapObject::IsMarked() {
1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map_word().IsMarked();
1095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::SetMark() {
1099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!IsMarked());
1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  MapWord first_word = map_word();
1101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  first_word.SetMark();
1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_map_word(first_word);
1103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::ClearMark() {
1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(IsMarked());
1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  MapWord first_word = map_word();
1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  first_word.ClearMark();
1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_map_word(first_word);
1111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HeapObject::IsOverflowed() {
1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map_word().IsOverflowed();
1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::SetOverflow() {
1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  MapWord first_word = map_word();
1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  first_word.SetOverflow();
1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_map_word(first_word);
1123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::ClearOverflow() {
1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(IsOverflowed());
1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  MapWord first_word = map_word();
1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  first_word.ClearOverflow();
1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_map_word(first_word);
1131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdouble HeapNumber::value() {
1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_DOUBLE_FIELD(this, kValueOffset);
1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapNumber::set_value(double value) {
1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_DOUBLE_FIELD(this, kValueOffset, value);
1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11446ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockint HeapNumber::get_exponent() {
11456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return ((READ_INT_FIELD(this, kExponentOffset) & kExponentMask) >>
11466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block          kExponentShift) - kExponentBias;
11476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
11486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
11496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
11506ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockint HeapNumber::get_sign() {
11516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return READ_INT_FIELD(this, kExponentOffset) & kSignMask;
11526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
11536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
11546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochHeapObject* JSObject::elements() {
1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* array = READ_FIELD(this, kElementsOffset);
1160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // In the assert below Dictionary is covered under FixedArray.
11613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT(array->IsFixedArray() || array->IsPixelArray() ||
11623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block         array->IsExternalArray());
11637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return reinterpret_cast<HeapObject*>(array);
1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) {
11688defd9ff6930b4e24729971a61cf7469daf119beSteve Block  ASSERT(map()->has_fast_elements() ==
1169756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick         (value->map() == Heap::fixed_array_map() ||
1170756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick          value->map() == Heap::fixed_cow_array_map()));
1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // In the assert below Dictionary is covered under FixedArray.
11723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT(value->IsFixedArray() || value->IsPixelArray() ||
11733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block         value->IsExternalArray());
1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kElementsOffset, value);
1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode);
1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_properties() {
1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array()));
1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array());
1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_elements() {
11868defd9ff6930b4e24729971a61cf7469daf119beSteve Block  ASSERT(map()->has_fast_elements());
1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array()));
1188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kElementsOffset, Heap::empty_fixed_array());
1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11928defd9ff6930b4e24729971a61cf7469daf119beSteve BlockObject* JSObject::ResetElements() {
11938defd9ff6930b4e24729971a61cf7469daf119beSteve Block  Object* obj = map()->GetFastElementsMap();
11948defd9ff6930b4e24729971a61cf7469daf119beSteve Block  if (obj->IsFailure()) return obj;
11958defd9ff6930b4e24729971a61cf7469daf119beSteve Block  set_map(Map::cast(obj));
11968defd9ff6930b4e24729971a61cf7469daf119beSteve Block  initialize_elements();
11978defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return this;
11988defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
11998defd9ff6930b4e24729971a61cf7469daf119beSteve Block
12008defd9ff6930b4e24729971a61cf7469daf119beSteve Block
1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_string, String, kToStringOffset)
1202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_number, Object, kToNumberOffset)
1203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSGlobalPropertyCell::value() {
1206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kValueOffset);
1207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) {
1211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The write barrier is not used for global property cells.
1212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!val->IsJSGlobalPropertyCell());
1213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kValueOffset, val);
1214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSObject::GetHeaderSize() {
1218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InstanceType type = map()->instance_type();
1219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check for the most common kind of JavaScript object before
1220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // falling into the generic switch. This speeds up the internal
1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // field operations considerably on average.
1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize;
1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (type) {
1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_PROXY_TYPE:
1225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSGlobalProxy::kSize;
1226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_OBJECT_TYPE:
1227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSGlobalObject::kSize;
1228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_BUILTINS_OBJECT_TYPE:
1229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSBuiltinsObject::kSize;
1230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_FUNCTION_TYPE:
1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSFunction::kSize;
1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_VALUE_TYPE:
1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSValue::kSize;
1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_ARRAY_TYPE:
1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSValue::kSize;
1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_REGEXP_TYPE:
1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSValue::kSize;
1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSObject::kHeaderSize;
1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      UNREACHABLE();
1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return 0;
1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSObject::GetInternalFieldCount() {
1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(1 << kPointerSizeLog2 == kPointerSize);
1249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make sure to adjust for the number of in-object properties. These
1250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // properties do contribute to the size, but are not internal fields.
1251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) -
1252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         map()->inobject_properties();
1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::GetInternalField(int index) {
1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index < GetInternalFieldCount() && index >= 0);
1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Internal objects do follow immediately after the header, whereas in-object
1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // properties are at the end of the object. Therefore there is no need
1260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // to adjust the index here.
1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index));
1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SetInternalField(int index, Object* value) {
1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index < GetInternalFieldCount() && index >= 0);
1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Internal objects do follow immediately after the header, whereas in-object
1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // properties are at the end of the object. Therefore there is no need
1269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // to adjust the index here.
1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = GetHeaderSize() + (kPointerSize * index);
1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
1272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BARRIER(this, offset);
1273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Access fast-case object properties at index. The use of these routines
1277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is needed to correctly distinguish between properties stored in-object and
1278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// properties stored in the properties array.
1279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::FastPropertyAt(int index) {
1280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
1281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  index -= map()->inobject_properties();
1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (index < 0) {
1283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offset = map()->instance_size() + (index * kPointerSize);
1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return READ_FIELD(this, offset);
1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(index < properties()->length());
1287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return properties()->get(index);
1288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::FastPropertyAtPut(int index, Object* value) {
1293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
1294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  index -= map()->inobject_properties();
1295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (index < 0) {
1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offset = map()->instance_size() + (index * kPointerSize);
1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);
1298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_BARRIER(this, offset);
1299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(index < properties()->length());
1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    properties()->set(index, value);
1302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return value;
1304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAt(int index) {
1308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
1309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  index -= map()->inobject_properties();
1310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index < 0);
1311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = map()->instance_size() + (index * kPointerSize);
1312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, offset);
1313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAtPut(int index,
1317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Object* value,
1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        WriteBarrierMode mode) {
1319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
1320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  index -= map()->inobject_properties();
1321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index < 0);
1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = map()->instance_size() + (index * kPointerSize);
1323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
1324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CONDITIONAL_WRITE_BARRIER(this, offset, mode);
1325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return value;
1326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13300d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid JSObject::InitializeBody(int object_size, Object* value) {
13310d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  ASSERT(!value->IsHeapObject() || !Heap::InNewSpace(value));
1332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
1333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);
1334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13388defd9ff6930b4e24729971a61cf7469daf119beSteve Blockbool JSObject::HasFastProperties() {
13398defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return !properties()->IsDictionary();
13408defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
13418defd9ff6930b4e24729971a61cf7469daf119beSteve Block
13428defd9ff6930b4e24729971a61cf7469daf119beSteve Block
13438defd9ff6930b4e24729971a61cf7469daf119beSteve Blockint JSObject::MaxFastProperties() {
13448defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // Allow extra fast properties if the object has more than
13458defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // kMaxFastProperties in-object properties. When this is the case,
13468defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // it is very unlikely that the object is being used as a dictionary
13478defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // and there is a good chance that allowing more map transitions
13488defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // will be worth it.
13498defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return Max(map()->inobject_properties(), kMaxFastProperties);
13508defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
13518defd9ff6930b4e24729971a61cf7469daf119beSteve Block
13528defd9ff6930b4e24729971a61cf7469daf119beSteve Block
1353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Struct::InitializeBody(int object_size) {
1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* value = Heap::undefined_value();
1355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
1356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);
1357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool Object::ToArrayIndex(uint32_t* index) {
13627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsSmi()) {
13637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    int value = Smi::cast(this)->value();
1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (value < 0) return false;
1365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    *index = value;
1366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return true;
1367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
13687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsHeapNumber()) {
13697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    double value = HeapNumber::cast(this)->value();
1370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uint32_t uint_value = static_cast<uint32_t>(value);
1371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (value == static_cast<double>(uint_value)) {
1372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      *index = uint_value;
1373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return true;
1374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return false;
1377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStringObjectWithCharacterAt(uint32_t index) {
1381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!this->IsJSValue()) return false;
1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSValue* js_value = JSValue::cast(this);
1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!js_value->value()->IsString()) return false;
1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  String* str = String::cast(js_value->value());
1387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (index >= (uint32_t)str->length()) return false;
1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
1390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* FixedArray::get(int index) {
1394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kHeaderSize + index * kPointerSize);
1396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Smi* value) {
1400756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(map() != Heap::fixed_cow_array_map());
1401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = kHeaderSize + index * kPointerSize;
1403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
1404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Object* value) {
1408756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(map() != Heap::fixed_cow_array_map());
1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = kHeaderSize + index * kPointerSize;
1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BARRIER(this, offset);
1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
14164515c472dc3e5ed2448a564600976759e569a0a8Leon ClarkeWriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) {
1417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (Heap::InNewSpace(this)) return SKIP_WRITE_BARRIER;
1418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return UPDATE_WRITE_BARRIER;
1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index,
1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     Object* value,
1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     WriteBarrierMode mode) {
1425756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(map() != Heap::fixed_cow_array_map());
1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = kHeaderSize + index * kPointerSize;
1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CONDITIONAL_WRITE_BARRIER(this, offset, mode);
1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::fast_set(FixedArray* array, int index, Object* value) {
1434756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(array->map() != Heap::raw_unchecked_fixed_cow_array_map());
1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < array->length());
14364515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  ASSERT(!Heap::InNewSpace(value));
1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value);
1438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_undefined(int index) {
1442756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(map() != Heap::fixed_cow_array_map());
1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!Heap::InNewSpace(Heap::undefined_value()));
1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kHeaderSize + index * kPointerSize,
1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              Heap::undefined_value());
1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_null(int index) {
1451756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(map() != Heap::fixed_cow_array_map());
1452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!Heap::InNewSpace(Heap::null_value()));
1454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kHeaderSize + index * kPointerSize, Heap::null_value());
1455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_the_hole(int index) {
1459756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(map() != Heap::fixed_cow_array_map());
1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!Heap::InNewSpace(Heap::the_hole_value()));
1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kHeaderSize + index * kPointerSize, Heap::the_hole_value());
1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1466756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedArray::set_unchecked(int index, Smi* value) {
1467756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1468756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  int offset = kHeaderSize + index * kPointerSize;
1469756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  WRITE_FIELD(this, offset, value);
1470756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1471756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1472756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1473f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdochvoid FixedArray::set_unchecked(int index,
1474f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch                               Object* value,
1475f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch                               WriteBarrierMode mode) {
1476f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  int offset = kHeaderSize + index * kPointerSize;
1477f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  WRITE_FIELD(this, offset, value);
1478f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  CONDITIONAL_WRITE_BARRIER(this, offset, mode);
1479f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch}
1480f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1481f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1482756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedArray::set_null_unchecked(int index) {
1483756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(index >= 0 && index < this->length());
1484756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(!Heap::InNewSpace(Heap::null_value()));
1485756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  WRITE_FIELD(this, kHeaderSize + index * kPointerSize, Heap::null_value());
1486756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1487756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1488756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
14896ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockObject** FixedArray::data_start() {
14906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return HeapObject::RawField(this, kHeaderSize);
14916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
14926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
14936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsEmpty() {
1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(this == Heap::empty_descriptor_array() ||
1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         this->length() > 2);
1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this == Heap::empty_descriptor_array();
1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::fast_swap(FixedArray* array, int first, int second) {
1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* tmp = array->get(first);
1503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  fast_set(array, first, array->get(second));
1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  fast_set(array, second, tmp);
1505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint DescriptorArray::Search(String* name) {
1509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  SLOW_ASSERT(IsSortedNoDuplicates());
1510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check for empty descriptor array.
1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int nof = number_of_descriptors();
1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (nof == 0) return kNotFound;
1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Fast case: do linear search for small arrays.
1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const int kMaxElementsForLinearSearch = 8;
1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (StringShape(name).IsSymbol() && nof < kMaxElementsForLinearSearch) {
1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return LinearSearch(name, nof);
1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Slow case: perform binary search.
1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BinarySearch(name, 0, nof - 1);
1523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1526756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint DescriptorArray::SearchWithCache(String* name) {
1527756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  int number = DescriptorLookupCache::Lookup(this, name);
1528756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  if (number == DescriptorLookupCache::kAbsent) {
1529756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    number = Search(name);
1530756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    DescriptorLookupCache::Update(this, name, number);
1531756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  }
1532756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return number;
1533756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1534756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1535756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* DescriptorArray::GetKey(int descriptor_number) {
1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return String::cast(get(ToKeyIndex(descriptor_number)));
1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* DescriptorArray::GetValue(int descriptor_number) {
1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetContentArray()->get(ToValueIndex(descriptor_number));
1545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* DescriptorArray::GetDetails(int descriptor_number) {
1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Smi::cast(GetContentArray()->get(ToDetailsIndex(descriptor_number)));
1551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType DescriptorArray::GetType(int descriptor_number) {
1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return PropertyDetails(GetDetails(descriptor_number)).type();
1557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint DescriptorArray::GetFieldIndex(int descriptor_number) {
1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Descriptor::IndexFromValue(GetValue(descriptor_number));
1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSFunction* DescriptorArray::GetConstantFunction(int descriptor_number) {
1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return JSFunction::cast(GetValue(descriptor_number));
1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* DescriptorArray::GetCallbacksObject(int descriptor_number) {
1571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(GetType(descriptor_number) == CALLBACKS);
1572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetValue(descriptor_number);
1573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) {
1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(GetType(descriptor_number) == CALLBACKS);
1578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Proxy* p = Proxy::cast(GetCallbacksObject(descriptor_number));
1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<AccessorDescriptor*>(p->proxy());
1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsProperty(int descriptor_number) {
1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetType(descriptor_number) < FIRST_PHANTOM_PROPERTY_TYPE;
1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsTransition(int descriptor_number) {
1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PropertyType t = GetType(descriptor_number);
1590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return t == MAP_TRANSITION || t == CONSTANT_TRANSITION;
1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsNullDescriptor(int descriptor_number) {
1595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetType(descriptor_number) == NULL_DESCRIPTOR;
1596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsDontEnum(int descriptor_number) {
1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return PropertyDetails(GetDetails(descriptor_number)).IsDontEnum();
1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
1605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->Init(GetKey(descriptor_number),
1606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             GetValue(descriptor_number),
1607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             GetDetails(descriptor_number));
1608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::Set(int descriptor_number, Descriptor* desc) {
1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Range check.
1613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1615e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // Make sure none of the elements in desc are in new space.
1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!Heap::InNewSpace(desc->GetKey()));
1617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!Heap::InNewSpace(desc->GetValue()));
1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  fast_set(this, ToKeyIndex(descriptor_number), desc->GetKey());
1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray* content_array = GetContentArray();
1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  fast_set(content_array, ToValueIndex(descriptor_number), desc->GetValue());
1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  fast_set(content_array, ToDetailsIndex(descriptor_number),
1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block           desc->GetDetails().AsSmi());
1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::CopyFrom(int index, DescriptorArray* src, int src_index) {
1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Descriptor desc;
1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  src->Get(src_index, &desc);
1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Set(index, &desc);
1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::Swap(int first, int second) {
1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  fast_swap(this, ToKeyIndex(first), ToKeyIndex(second));
1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray* content_array = GetContentArray();
1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  fast_swap(content_array, ToValueIndex(first), ToValueIndex(second));
1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  fast_swap(content_array, ToDetailsIndex(first),  ToDetailsIndex(second));
1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool NumberDictionary::requires_slow_elements() {
1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* max_index_object = get(kMaxNumberKeyIndex);
1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!max_index_object->IsSmi()) return false;
1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return 0 !=
1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t NumberDictionary::max_number_key() {
1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!requires_slow_elements());
1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* max_index_object = get(kMaxNumberKeyIndex);
1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!max_index_object->IsSmi()) return 0;
1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return value >> kRequiresSlowElementsTagSize;
1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid NumberDictionary::set_requires_slow_elements() {
16584515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
1659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ------------------------------------
1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Cast operations
1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(FixedArray)
1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(DescriptorArray)
1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SymbolTable)
16696ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCAST_ACCESSOR(JSFunctionResultCache)
167080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian MonsenCAST_ACCESSOR(NormalizedMapCache)
1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(CompilationCacheTable)
16726ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCAST_ACCESSOR(CodeCacheHashTable)
1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(MapCache)
1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(String)
1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqString)
1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqAsciiString)
1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqTwoByteString)
1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ConsString)
1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalString)
1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalAsciiString)
1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalTwoByteString)
1682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSObject)
1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Smi)
1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Failure)
1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(HeapObject)
1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(HeapNumber)
1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Oddball)
1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalPropertyCell)
1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SharedFunctionInfo)
1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Map)
1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSFunction)
1692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(GlobalObject)
1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalProxy)
1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalObject)
1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSBuiltinsObject)
1696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Code)
1697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSArray)
1698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSRegExp)
1699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Proxy)
1700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ByteArray)
1701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(PixelArray)
17023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalArray)
17033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalByteArray)
17043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedByteArray)
17053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalShortArray)
17063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedShortArray)
17073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalIntArray)
17083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedIntArray)
17093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalFloatArray)
1710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Struct)
1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name)
1714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  STRUCT_LIST(MAKE_STRUCT_CAST)
1715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CAST
1716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename Shape, typename Key>
1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) {
1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(obj->IsHashTable());
1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<HashTable*>(obj);
1722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
17257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(FixedArray, length, kLengthOffset)
17267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(ByteArray, length, kLengthOffset)
17277f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
17287f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochINT_ACCESSORS(PixelArray, length, kLengthOffset)
17297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochINT_ACCESSORS(ExternalArray, length, kLengthOffset)
1730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
17326ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockSMI_ACCESSORS(String, length, kLengthOffset)
1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1735d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockuint32_t String::hash_field() {
1736d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return READ_UINT32_FIELD(this, kHashFieldOffset);
1737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1740d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvoid String::set_hash_field(uint32_t value) {
1741d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  WRITE_UINT32_FIELD(this, kHashFieldOffset, value);
17427f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_64_BIT
17437f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0);
17447f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif
1745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1748d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockbool String::Equals(String* other) {
1749d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (other == this) return true;
1750d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (StringShape(this).IsSymbol() && StringShape(other).IsSymbol()) {
1751d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return false;
1752d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
1753d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return SlowEquals(other);
1754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
17576ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockObject* String::TryFlatten(PretenureFlag pretenure) {
1758f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  if (!StringShape(this).IsCons()) return this;
1759f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  ConsString* cons = ConsString::cast(this);
1760f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  if (cons->second()->length() == 0) return cons->first();
17616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return SlowTryFlatten(pretenure);
1762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1765f7060e27768c550ace7ec48ad8c093466db52dfaLeon ClarkeString* String::TryFlattenGetString(PretenureFlag pretenure) {
1766f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  Object* flat = TryFlatten(pretenure);
1767f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  return flat->IsFailure() ? this : String::cast(flat);
1768f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke}
1769f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
1770f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
1771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t String::Get(int index) {
1772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
1773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (StringShape(this).full_representation_tag()) {
1774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kSeqStringTag | kAsciiStringTag:
1775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return SeqAsciiString::cast(this)->SeqAsciiStringGet(index);
1776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kSeqStringTag | kTwoByteStringTag:
1777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
1778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kConsStringTag | kAsciiStringTag:
1779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kConsStringTag | kTwoByteStringTag:
1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return ConsString::cast(this)->ConsStringGet(index);
1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kExternalStringTag | kAsciiStringTag:
1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
1783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kExternalStringTag | kTwoByteStringTag:
1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
1786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
1787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  UNREACHABLE();
1790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return 0;
1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid String::Set(int index, uint16_t value) {
1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(StringShape(this).IsSequential());
1797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this->IsAsciiRepresentation()
1799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      ? SeqAsciiString::cast(this)->SeqAsciiStringSet(index, value)
1800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value);
1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsFlat() {
1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (StringShape(this).representation_tag()) {
1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kConsStringTag: {
1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      String* second = ConsString::cast(this)->second();
1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Only flattened strings have second part empty.
1809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return second->length() == 0;
1810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return true;
1813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqAsciiString::SeqAsciiStringGet(int index) {
1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqAsciiString::SeqAsciiStringSet(int index, uint16_t value) {
1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length() && value <= kMaxAsciiCharCode);
1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize,
1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   static_cast<byte>(value));
1827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqAsciiString::GetCharsAddress() {
1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
1832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* SeqAsciiString::GetChars() {
1836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<char*>(GetCharsAddress());
1837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqTwoByteString::GetCharsAddress() {
1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc16* SeqTwoByteString::GetChars() {
1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize));
1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) {
1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize);
1853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) {
1857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
1858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value);
1859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) {
18636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return SizeFor(length());
1864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqAsciiString::SeqAsciiStringSize(InstanceType instance_type) {
18686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return SizeFor(length());
1869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::first() {
1873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return String::cast(READ_FIELD(this, kFirstOffset));
1874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_first() {
1878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kFirstOffset);
1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_first(String* value, WriteBarrierMode mode) {
1883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kFirstOffset, value);
1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CONDITIONAL_WRITE_BARRIER(this, kFirstOffset, mode);
1885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::second() {
1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return String::cast(READ_FIELD(this, kSecondOffset));
1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_second() {
1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kSecondOffset);
1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_second(String* value, WriteBarrierMode mode) {
1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kSecondOffset, value);
1900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CONDITIONAL_WRITE_BARRIER(this, kSecondOffset, mode);
1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockExternalAsciiString::Resource* ExternalAsciiString::resource() {
1905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ExternalAsciiString::set_resource(
1910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ExternalAsciiString::Resource* resource) {
1911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)) = resource;
1912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockExternalTwoByteString::Resource* ExternalTwoByteString::resource() {
1916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
1917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ExternalTwoByteString::set_resource(
1921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ExternalTwoByteString::Resource* resource) {
1922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)) = resource;
1923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
19266ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSFunctionResultCache::MakeZeroSize() {
19276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  set(kFingerIndex, Smi::FromInt(kEntriesIndex));
19286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  set(kCacheSizeIndex, Smi::FromInt(kEntriesIndex));
19296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
19306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
19316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
19326ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSFunctionResultCache::Clear() {
19336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int cache_size = Smi::cast(get(kCacheSizeIndex))->value();
19346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex));
19356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  MemsetPointer(entries_start, Heap::the_hole_value(), cache_size);
19366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  MakeZeroSize();
19376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
19386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
19396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte ByteArray::get(int index) {
1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
1943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ByteArray::set(int index, byte value) {
1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint ByteArray::get_int(int index) {
1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && (index * kIntSize) < this->length());
1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_INT_FIELD(this, kHeaderSize + index * kIntSize);
1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockByteArray* ByteArray::FromDataStartAddress(Address address) {
1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_TAG_ALIGNED(address);
1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress ByteArray::GetDataStartAddress() {
1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint8_t* PixelArray::external_pointer() {
1970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
1971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<uint8_t*>(ptr);
1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PixelArray::set_external_pointer(uint8_t* value, WriteBarrierMode mode) {
1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  intptr_t ptr = reinterpret_cast<intptr_t>(value);
1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
1978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint8_t PixelArray::get(int index) {
1982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((index >= 0) && (index < this->length()));
1983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint8_t* ptr = external_pointer();
1984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ptr[index];
1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PixelArray::set(int index, uint8_t value) {
1989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((index >= 0) && (index < this->length()));
1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint8_t* ptr = external_pointer();
1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ptr[index] = value;
1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
19953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid* ExternalArray::external_pointer() {
19963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
19973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return reinterpret_cast<void*>(ptr);
19983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
19993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
20023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  intptr_t ptr = reinterpret_cast<intptr_t>(value);
20033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
20043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockint8_t ExternalByteArray::get(int index) {
20083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int8_t* ptr = static_cast<int8_t*>(external_pointer());
20103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
20113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalByteArray::set(int index, int8_t value) {
20153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int8_t* ptr = static_cast<int8_t*>(external_pointer());
20173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
20183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockuint8_t ExternalUnsignedByteArray::get(int index) {
20223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
20243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
20253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedByteArray::set(int index, uint8_t value) {
20293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
20313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
20323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockint16_t ExternalShortArray::get(int index) {
20363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int16_t* ptr = static_cast<int16_t*>(external_pointer());
20383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
20393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalShortArray::set(int index, int16_t value) {
20433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int16_t* ptr = static_cast<int16_t*>(external_pointer());
20453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
20463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockuint16_t ExternalUnsignedShortArray::get(int index) {
20503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
20523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
20533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedShortArray::set(int index, uint16_t value) {
20573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
20593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
20603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockint32_t ExternalIntArray::get(int index) {
20643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int32_t* ptr = static_cast<int32_t*>(external_pointer());
20663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
20673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalIntArray::set(int index, int32_t value) {
20713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int32_t* ptr = static_cast<int32_t*>(external_pointer());
20733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
20743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockuint32_t ExternalUnsignedIntArray::get(int index) {
20783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
20803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
20813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedIntArray::set(int index, uint32_t value) {
20853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
20873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
20883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockfloat ExternalFloatArray::get(int index) {
20923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
20933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  float* ptr = static_cast<float*>(external_pointer());
20943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
20953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
20963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
20983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalFloatArray::set(int index, float value) {
20993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
21003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  float* ptr = static_cast<float*>(external_pointer());
21013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
21023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
21033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
21043bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
21059ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickint Map::visitor_id() {
21069ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick  return READ_BYTE_FIELD(this, kVisitorIdOffset);
21079ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick}
21089ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
21099ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
21109ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickvoid Map::set_visitor_id(int id) {
21119ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick  ASSERT(0 <= id && id < 256);
21129ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick  WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id));
21139ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick}
21149ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
21153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::instance_size() {
2117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2;
2118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::inobject_properties() {
2122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kInObjectPropertiesOffset);
2123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::pre_allocated_property_fields() {
2127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset);
2128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::SizeFromMap(Map* map) {
2132791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  int instance_size = map->instance_size();
2133791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  if (instance_size != kVariableSizeSentinel) return instance_size;
2134791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  // We can ignore the "symbol" bit becase it is only set for symbols
2135791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  // and implies a string type.
2136791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  int instance_type = static_cast<int>(map->instance_type()) & ~kIsSymbolMask;
2137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Only inline the most frequent cases.
2138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (instance_type == FIXED_ARRAY_TYPE) {
2139756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    return FixedArray::BodyDescriptor::SizeOf(map, this);
2140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2141791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  if (instance_type == ASCII_STRING_TYPE) {
2142791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block    return SeqAsciiString::SizeFor(
2143791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block        reinterpret_cast<SeqAsciiString*>(this)->length());
2144791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  }
2145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (instance_type == BYTE_ARRAY_TYPE) {
2146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return reinterpret_cast<ByteArray*>(this)->ByteArraySize();
2147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2148791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  if (instance_type == STRING_TYPE) {
2149791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block    return SeqTwoByteString::SizeFor(
2150791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block        reinterpret_cast<SeqTwoByteString*>(this)->length());
2151791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  }
2152791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  ASSERT(instance_type == CODE_TYPE);
2153791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return reinterpret_cast<Code*>(this)->CodeSize();
2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_size(int value) {
2158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_EQ(0, value & (kPointerSize - 1));
2159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value >>= kPointerSizeLog2;
2160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= value && value < 256);
2161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value));
2162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_inobject_properties(int value) {
2166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= value && value < 256);
2167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value));
2168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_pre_allocated_property_fields(int value) {
2172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= value && value < 256);
2173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this,
2174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   kPreAllocatedPropertyFieldsOffset,
2175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   static_cast<byte>(value));
2176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInstanceType Map::instance_type() {
2180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
2181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_type(InstanceType value) {
2185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= value && value < 256);
2186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
2187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::unused_property_fields() {
2191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset);
2192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_unused_property_fields(int value) {
2196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255));
2197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte Map::bit_field() {
2201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kBitFieldOffset);
2202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field(byte value) {
2206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kBitFieldOffset, value);
2207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte Map::bit_field2() {
2211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kBitField2Offset);
2212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field2(byte value) {
2216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kBitField2Offset, value);
2217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_non_instance_prototype(bool value) {
2221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (value) {
2222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_bit_field(bit_field() | (1 << kHasNonInstancePrototype));
2223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype));
2225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Map::has_non_instance_prototype() {
2230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((1 << kHasNonInstancePrototype) & bit_field()) != 0;
2231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
22346ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Map::set_function_with_prototype(bool value) {
22356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (value) {
22366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    set_bit_field2(bit_field2() | (1 << kFunctionWithPrototype));
22376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  } else {
22386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    set_bit_field2(bit_field2() & ~(1 << kFunctionWithPrototype));
22396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
22406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
22416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22436ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Map::function_with_prototype() {
22446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return ((1 << kFunctionWithPrototype) & bit_field2()) != 0;
22456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
22466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
22476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_is_access_check_needed(bool access_check_needed) {
2249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (access_check_needed) {
2250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded));
2251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded));
2253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Map::is_access_check_needed() {
2258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0;
2259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
22628defd9ff6930b4e24729971a61cf7469daf119beSteve Blockvoid Map::set_is_extensible(bool value) {
22638defd9ff6930b4e24729971a61cf7469daf119beSteve Block  if (value) {
22648defd9ff6930b4e24729971a61cf7469daf119beSteve Block    set_bit_field2(bit_field2() | (1 << kIsExtensible));
22658defd9ff6930b4e24729971a61cf7469daf119beSteve Block  } else {
22668defd9ff6930b4e24729971a61cf7469daf119beSteve Block    set_bit_field2(bit_field2() & ~(1 << kIsExtensible));
22678defd9ff6930b4e24729971a61cf7469daf119beSteve Block  }
22688defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
22698defd9ff6930b4e24729971a61cf7469daf119beSteve Block
22708defd9ff6930b4e24729971a61cf7469daf119beSteve Blockbool Map::is_extensible() {
22718defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return ((1 << kIsExtensible) & bit_field2()) != 0;
22728defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
22738defd9ff6930b4e24729971a61cf7469daf119beSteve Block
22748defd9ff6930b4e24729971a61cf7469daf119beSteve Block
22750d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Map::set_attached_to_shared_function_info(bool value) {
22760d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  if (value) {
22770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    set_bit_field2(bit_field2() | (1 << kAttachedToSharedFunctionInfo));
22780d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  } else {
22790d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    set_bit_field2(bit_field2() & ~(1 << kAttachedToSharedFunctionInfo));
22800d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
22810d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
22820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22830d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool Map::attached_to_shared_function_info() {
22840d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return ((1 << kAttachedToSharedFunctionInfo) & bit_field2()) != 0;
22850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
22860d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22880d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Map::set_is_shared(bool value) {
22890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  if (value) {
22900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    set_bit_field2(bit_field2() | (1 << kIsShared));
22910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  } else {
22920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    set_bit_field2(bit_field2() & ~(1 << kIsShared));
22930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
22940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
22950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
22960d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool Map::is_shared() {
22970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return ((1 << kIsShared) & bit_field2()) != 0;
22980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
22990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
23000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
23010d5e116f6aee03185f237311a943491bb079a768Kristian MonsenJSFunction* Map::unchecked_constructor() {
23020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return reinterpret_cast<JSFunction*>(READ_FIELD(this, kConstructorOffset));
23030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
23040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
23058defd9ff6930b4e24729971a61cf7469daf119beSteve Block
2306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::flags() {
2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
2308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Code::set_flags(Code::Flags flags) {
2312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  STATIC_ASSERT(Code::NUMBER_OF_KINDS <= (kFlagsKindMask >> kFlagsKindShift)+1);
2313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make sure that all call stubs have an arguments count.
23147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  ASSERT((ExtractKindFromFlags(flags) != CALL_IC &&
23157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch          ExtractKindFromFlags(flags) != KEYED_CALL_IC) ||
2316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         ExtractArgumentsCountFromFlags(flags) >= 0);
2317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_INT_FIELD(this, kFlagsOffset, flags);
2318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::kind() {
2322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ExtractKindFromFlags(flags());
2323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInLoopFlag Code::ic_in_loop() {
2327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ExtractICInLoopFromFlags(flags());
2328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInlineCacheState Code::ic_state() {
2332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InlineCacheState result = ExtractICStateFromFlags(flags());
2333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Only allow uninitialized or debugger states for non-IC code
2334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // objects. This is used in the debugger to determine whether or not
2335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // a call to code object has been replaced with a debug break call.
2336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(is_inline_cache_stub() ||
2337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         result == UNINITIALIZED ||
2338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         result == DEBUG_BREAK ||
2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         result == DEBUG_PREPARE_STEP_IN);
2340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
2341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType Code::type() {
2345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(ic_state() == MONOMORPHIC);
2346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ExtractTypeFromFlags(flags());
2347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::arguments_count() {
23517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB);
2352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ExtractArgumentsCountFromFlags(flags());
2353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
235680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenint Code::major_key() {
23576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(kind() == STUB || kind() == BINARY_OP_IC);
235880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  return READ_BYTE_FIELD(this, kStubMajorKeyOffset);
2359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
236280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid Code::set_major_key(int major) {
23636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(kind() == STUB || kind() == BINARY_OP_IC);
2364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= major && major < 256);
2365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kStubMajorKeyOffset, major);
2366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Code::is_inline_cache_stub() {
2370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Kind kind = this->kind();
2371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND;
2372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::ComputeFlags(Kind kind,
2376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                               InLoopFlag in_loop,
2377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                               InlineCacheState ic_state,
2378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                               PropertyType type,
23798defd9ff6930b4e24729971a61cf7469daf119beSteve Block                               int argc,
23808defd9ff6930b4e24729971a61cf7469daf119beSteve Block                               InlineCacheHolderFlag holder) {
2381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Compute the bit mask.
2382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int bits = kind << kFlagsKindShift;
2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (in_loop) bits |= kFlagsICInLoopMask;
2384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bits |= ic_state << kFlagsICStateShift;
2385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bits |= type << kFlagsTypeShift;
2386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bits |= argc << kFlagsArgumentsCountShift;
23878defd9ff6930b4e24729971a61cf7469daf119beSteve Block  if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask;
2388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Cast to flags and validate result before returning it.
2389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Flags result = static_cast<Flags>(bits);
2390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(ExtractKindFromFlags(result) == kind);
2391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(ExtractICStateFromFlags(result) == ic_state);
2392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(ExtractICInLoopFromFlags(result) == in_loop);
2393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(ExtractTypeFromFlags(result) == type);
2394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(ExtractArgumentsCountFromFlags(result) == argc);
2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::ComputeMonomorphicFlags(Kind kind,
2400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                          PropertyType type,
24018defd9ff6930b4e24729971a61cf7469daf119beSteve Block                                          InlineCacheHolderFlag holder,
2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                          InLoopFlag in_loop,
2403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                          int argc) {
24048defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return ComputeFlags(kind, in_loop, MONOMORPHIC, type, argc, holder);
2405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::ExtractKindFromFlags(Flags flags) {
2409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int bits = (flags & kFlagsKindMask) >> kFlagsKindShift;
2410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<Kind>(bits);
2411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
2415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int bits = (flags & kFlagsICStateMask) >> kFlagsICStateShift;
2416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<InlineCacheState>(bits);
2417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInLoopFlag Code::ExtractICInLoopFromFlags(Flags flags) {
2421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int bits = (flags & kFlagsICInLoopMask);
2422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return bits != 0 ? IN_LOOP : NOT_IN_LOOP;
2423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType Code::ExtractTypeFromFlags(Flags flags) {
2427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int bits = (flags & kFlagsTypeMask) >> kFlagsTypeShift;
2428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<PropertyType>(bits);
2429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::ExtractArgumentsCountFromFlags(Flags flags) {
2433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (flags & kFlagsArgumentsCountMask) >> kFlagsArgumentsCountShift;
2434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24378defd9ff6930b4e24729971a61cf7469daf119beSteve BlockInlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
24388defd9ff6930b4e24729971a61cf7469daf119beSteve Block  int bits = (flags & kFlagsCacheInPrototypeMapMask);
24398defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return bits != 0 ? PROTOTYPE_MAP : OWN_MAP;
24408defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
24418defd9ff6930b4e24729971a61cf7469daf119beSteve Block
24428defd9ff6930b4e24729971a61cf7469daf119beSteve Block
2443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::RemoveTypeFromFlags(Flags flags) {
2444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int bits = flags & ~kFlagsTypeMask;
2445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<Flags>(bits);
2446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* Code::GetCodeFromTargetAddress(Address address) {
2450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
2451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // GetCodeFromTargetAddress might be called when marking objects during mark
2452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // sweep. reinterpret_cast is therefore used instead of the more appropriate
2453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Code::cast. Code::cast does not work when the object's map is
2454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // marked.
2455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Code* result = reinterpret_cast<Code*>(code);
2456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
2457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2460791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve BlockObject* Code::GetObjectFromEntryAddress(Address location_of_address) {
2461791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return HeapObject::
2462791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block      FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize);
2463791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block}
2464791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block
2465791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block
2466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Map::prototype() {
2467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kPrototypeOffset);
2468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_prototype(Object* value, WriteBarrierMode mode) {
2472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(value->IsNull() || value->IsJSObject());
2473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kPrototypeOffset, value);
2474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CONDITIONAL_WRITE_BARRIER(this, kPrototypeOffset, mode);
2475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24788defd9ff6930b4e24729971a61cf7469daf119beSteve BlockObject* Map::GetFastElementsMap() {
24798defd9ff6930b4e24729971a61cf7469daf119beSteve Block  if (has_fast_elements()) return this;
24808defd9ff6930b4e24729971a61cf7469daf119beSteve Block  Object* obj = CopyDropTransitions();
24818defd9ff6930b4e24729971a61cf7469daf119beSteve Block  if (obj->IsFailure()) return obj;
24828defd9ff6930b4e24729971a61cf7469daf119beSteve Block  Map* new_map = Map::cast(obj);
24838defd9ff6930b4e24729971a61cf7469daf119beSteve Block  new_map->set_has_fast_elements(true);
2484756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  Counters::map_slow_to_fast_elements.Increment();
24858defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return new_map;
24868defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
24878defd9ff6930b4e24729971a61cf7469daf119beSteve Block
24888defd9ff6930b4e24729971a61cf7469daf119beSteve Block
24898defd9ff6930b4e24729971a61cf7469daf119beSteve BlockObject* Map::GetSlowElementsMap() {
24908defd9ff6930b4e24729971a61cf7469daf119beSteve Block  if (!has_fast_elements()) return this;
24918defd9ff6930b4e24729971a61cf7469daf119beSteve Block  Object* obj = CopyDropTransitions();
24928defd9ff6930b4e24729971a61cf7469daf119beSteve Block  if (obj->IsFailure()) return obj;
24938defd9ff6930b4e24729971a61cf7469daf119beSteve Block  Map* new_map = Map::cast(obj);
24948defd9ff6930b4e24729971a61cf7469daf119beSteve Block  new_map->set_has_fast_elements(false);
2495756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  Counters::map_fast_to_slow_elements.Increment();
24968defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return new_map;
24978defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
24988defd9ff6930b4e24729971a61cf7469daf119beSteve Block
24998defd9ff6930b4e24729971a61cf7469daf119beSteve Block
2500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Map, instance_descriptors, DescriptorArray,
2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceDescriptorsOffset)
25026ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Map, constructor, Object, kConstructorOffset)
2504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
2506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, literals, FixedArray, kLiteralsOffset)
2507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset)
2509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset)
2510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, global_receiver, JSObject, kGlobalReceiverOffset)
2511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSGlobalProxy, context, Object, kContextOffset)
2513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, getter, Object, kGetterOffset)
2515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, setter, Object, kSetterOffset)
2516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, data, Object, kDataOffset)
2517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, name, Object, kNameOffset)
2518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, flag, Smi, kFlagOffset)
2519d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockACCESSORS(AccessorInfo, load_stub_cache, Object, kLoadStubCacheOffset)
2520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, named_callback, Object, kNamedCallbackOffset)
2522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, indexed_callback, Object, kIndexedCallbackOffset)
2523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
2524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
2526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
2527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
2528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
2529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
2530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, data, Object, kDataOffset)
2531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
2533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
2534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, tag, Object, kTagOffset)
2536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
2537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, serial_number, Object, kSerialNumberOffset)
2539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
2540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, property_accessors, Object,
2541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kPropertyAccessorsOffset)
2542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, prototype_template, Object,
2543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kPrototypeTemplateOffset)
2544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset)
2545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, named_property_handler, Object,
2546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kNamedPropertyHandlerOffset)
2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object,
2548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kIndexedPropertyHandlerOffset)
2549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_template, Object,
2550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceTemplateOffset)
2551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
2552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
2553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_call_handler, Object,
2554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceCallHandlerOffset)
2555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, access_check_info, Object,
2556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kAccessCheckInfoOffset)
2557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, flag, Smi, kFlagOffset)
2558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
2560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, internal_field_count, Object,
2561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInternalFieldCountOffset)
2562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset)
2564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SignatureInfo, args, Object, kArgsOffset)
2565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TypeSwitchInfo, types, Object, kTypesOffset)
2567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, source, Object, kSourceOffset)
2569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, name, Object, kNameOffset)
2570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, id, Object, kIdOffset)
2571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, line_offset, Smi, kLineOffsetOffset)
2572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, column_offset, Smi, kColumnOffsetOffset)
2573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, data, Object, kDataOffset)
2574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, context_data, Object, kContextOffset)
2575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, wrapper, Proxy, kWrapperOffset)
2576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, type, Smi, kTypeOffset)
2577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, compilation_type, Smi, kCompilationTypeOffset)
2578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, line_ends, Object, kLineEndsOffset)
2579d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockACCESSORS(Script, eval_from_shared, Object, kEvalFromSharedOffset)
2580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, eval_from_instructions_offset, Smi,
2581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kEvalFrominstructionsOffsetOffset)
2582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT
2584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex)
2585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex)
2586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, code, Code, kPatchedCodeIndex)
2587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex)
2588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, code_position, Smi, kCodePositionIndex)
2590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, source_position, Smi, kSourcePositionIndex)
2591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, statement_position, Smi, kStatementPositionIndex)
2592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex)
2593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
2594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, name, Object, kNameOffset)
25966ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset)
25970d5e116f6aee03185f237311a943491bb079a768Kristian MonsenACCESSORS(SharedFunctionInfo, initial_map, Object, kInitialMapOffset)
2598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, instance_class_name, Object,
2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceClassNameOffset)
26006ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset)
2601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset)
2602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
2603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset)
2604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, this_property_assignments, Object,
2605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kThisPropertyAssignmentsOffset)
2606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
2608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kHiddenPrototypeBit)
2609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
2610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
2611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kNeedsAccessCheckBit)
2612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression,
2613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kIsExpressionBit)
2614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
2615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kIsTopLevelBit)
2616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_GETTER(SharedFunctionInfo, compiler_hints,
2617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            has_only_simple_this_property_assignments,
2618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            kHasOnlySimpleThisPropertyAssignments)
2619d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockBOOL_ACCESSORS(SharedFunctionInfo,
2620d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block               compiler_hints,
2621d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke               try_full_codegen,
2622d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke               kTryFullCodegen)
26237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochBOOL_ACCESSORS(SharedFunctionInfo,
26247f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch               compiler_hints,
26257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch               allows_lazy_compilation,
26267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch               kAllowLazyCompilation)
2627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2628756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
26297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_32_BIT
26307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
26317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
2632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kFormalParameterCountOffset)
26337f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
2634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kExpectedNofPropertiesOffset)
26357f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
26367f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
2637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kStartPositionAndTypeOffset)
26387f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
26397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, function_token_position,
2640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kFunctionTokenPositionOffset)
26417f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kCompilerHintsOffset)
26437f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
2644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kThisPropertyAssignmentsCountOffset)
26457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#else
26467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
26477f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset)             \
26487f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  int holder::name() {                                            \
26497f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    int value = READ_INT_FIELD(this, offset);                     \
26507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT(kHeapObjectTag == 1);                                  \
26517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT((value & kHeapObjectTag) == 0);                        \
26527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    return value >> 1;                                            \
26537f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }                                                               \
26547f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  void holder::set_##name(int value) {                            \
26557f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT(kHeapObjectTag == 1);                                  \
26567f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT((value & 0xC0000000) == 0xC0000000 ||                  \
26577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch           (value & 0xC0000000) == 0x000000000);                  \
26587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    WRITE_INT_FIELD(this,                                         \
26597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch                    offset,                                       \
26607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch                    (value << 1) & ~kHeapObjectTag);              \
26617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
26627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
26637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \
26647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  INT_ACCESSORS(holder, name, offset)
26657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
26667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
26677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
26687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
26697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, formal_parameter_count,
26707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch              kFormalParameterCountOffset)
26717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
26727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, expected_nof_properties,
26737f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch              kExpectedNofPropertiesOffset)
26747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
26757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
26767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, start_position_and_type,
26777f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch              kStartPositionAndTypeOffset)
26787f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, end_position, kEndPositionOffset)
2679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
26807f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, function_token_position,
26817f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch              kFunctionTokenPositionOffset)
26827f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, compiler_hints,
26837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch              kCompilerHintsOffset)
26847f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
26857f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, this_property_assignments_count,
26867f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch              kThisPropertyAssignmentsCountOffset)
26877f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif
2688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
26890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
26900d5e116f6aee03185f237311a943491bb079a768Kristian Monsenint SharedFunctionInfo::construction_count() {
26910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return READ_BYTE_FIELD(this, kConstructionCountOffset);
26920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
26930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
26940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
26950d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid SharedFunctionInfo::set_construction_count(int value) {
26960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  ASSERT(0 <= value && value < 256);
26970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  WRITE_BYTE_FIELD(this, kConstructionCountOffset, static_cast<byte>(value));
26980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
26990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
27000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
27010d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool SharedFunctionInfo::live_objects_may_exist() {
27020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return (compiler_hints() & (1 << kLiveObjectsMayExist)) != 0;
27030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
27040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
27050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
27060d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid SharedFunctionInfo::set_live_objects_may_exist(bool value) {
27070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  if (value) {
27080d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    set_compiler_hints(compiler_hints() | (1 << kLiveObjectsMayExist));
27090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  } else {
27100d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    set_compiler_hints(compiler_hints() & ~(1 << kLiveObjectsMayExist));
27110d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
27120d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
27130d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
27140d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
27150d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool SharedFunctionInfo::IsInobjectSlackTrackingInProgress() {
27160d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return initial_map() != Heap::undefined_value();
27170d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
27180d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
27190d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
27206ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
27216ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
27226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
27233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Script::HasValidSource() {
27243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Object* src = this->source();
27253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (!src->IsString()) return true;
27263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  String* src_str = String::cast(src);
27273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (!StringShape(src_str).IsExternal()) return true;
27283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (src_str->IsAsciiRepresentation()) {
27293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return ExternalAsciiString::cast(src)->resource() != NULL;
27303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else if (src_str->IsTwoByteRepresentation()) {
27313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return ExternalTwoByteString::cast(src)->resource() != NULL;
27323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
27333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return true;
27343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
27353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
27363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::DontAdaptArguments() {
2738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(code()->kind() == Code::BUILTIN);
2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_formal_parameter_count(kDontAdaptArgumentsSentinel);
2740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SharedFunctionInfo::start_position() {
2744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return start_position_and_type() >> kStartPositionShift;
2745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_start_position(int start_position) {
2749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_start_position_and_type((start_position << kStartPositionShift)
2750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    | (start_position_and_type() & ~kStartPositionMask));
2751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* SharedFunctionInfo::code() {
2755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Code::cast(READ_FIELD(this, kCodeOffset));
2756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2759756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickCode* SharedFunctionInfo::unchecked_code() {
2760756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset));
2761756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
2762756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2763756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
2765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kCodeOffset, value);
2766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, mode);
2767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27703bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben MurdochSerializedScopeInfo* SharedFunctionInfo::scope_info() {
27713bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  return reinterpret_cast<SerializedScopeInfo*>(
27723bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch      READ_FIELD(this, kScopeInfoOffset));
27733bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch}
27743bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
27753bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
27763bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdochvoid SharedFunctionInfo::set_scope_info(SerializedScopeInfo* value,
27773bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch                                        WriteBarrierMode mode) {
27783bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value));
27793bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  CONDITIONAL_WRITE_BARRIER(this, kScopeInfoOffset, mode);
27803bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch}
27813bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
27823bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
2783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool SharedFunctionInfo::is_compiled() {
2784756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return code() != Builtins::builtin(Builtins::LazyCompile);
2785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27886ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool SharedFunctionInfo::IsApiFunction() {
27896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return function_data()->IsFunctionTemplateInfo();
27906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
27916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
27926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
27936ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockFunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
27946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(IsApiFunction());
27956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return FunctionTemplateInfo::cast(function_data());
27966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
27976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
27986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
27996ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool SharedFunctionInfo::HasCustomCallGenerator() {
280025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  return function_data()->IsSmi();
280125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen}
280225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
280325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
280425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsenint SharedFunctionInfo::custom_call_generator_id() {
280525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  ASSERT(HasCustomCallGenerator());
280625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  return Smi::cast(function_data())->value();
2807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2810756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint SharedFunctionInfo::code_age() {
2811756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask;
2812756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
2813756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2814756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2815756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid SharedFunctionInfo::set_code_age(int code_age) {
2816756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  set_compiler_hints(compiler_hints() |
2817756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick                     ((code_age & kCodeAgeMask) << kCodeAgeShift));
2818756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
2819756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2820756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::IsBuiltin() {
2822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return context()->global()->IsJSBuiltinsObject();
2823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* JSFunction::code() {
2827791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return Code::cast(unchecked_code());
2828756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
2829756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2830756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2831756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickCode* JSFunction::unchecked_code() {
2832791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return reinterpret_cast<Code*>(
2833791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block      Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset)));
2834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_code(Code* value) {
2838756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  // Skip the write barrier because code is never in new space.
2839756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(!Heap::InNewSpace(value));
2840791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  Address entry = value->entry();
2841791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
2842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockContext* JSFunction::context() {
2846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Context::cast(READ_FIELD(this, kContextOffset));
2847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::unchecked_context() {
2851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kContextOffset);
2852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2855756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickSharedFunctionInfo* JSFunction::unchecked_shared() {
2856756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return reinterpret_cast<SharedFunctionInfo*>(
2857756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      READ_FIELD(this, kSharedFunctionInfoOffset));
2858756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
2859756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2860756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
2861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_context(Object* value) {
2862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(value == Heap::undefined_value() || value->IsContext());
2863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kContextOffset, value);
2864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BARRIER(this, kContextOffset);
2865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, prototype_or_initial_map, Object,
2868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kPrototypeOrInitialMapOffset)
2869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* JSFunction::initial_map() {
2872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Map::cast(prototype_or_initial_map());
2873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_initial_map(Map* value) {
2877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_prototype_or_initial_map(value);
2878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_initial_map() {
2882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return prototype_or_initial_map()->IsMap();
2883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_instance_prototype() {
2887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return has_initial_map() || !prototype_or_initial_map()->IsTheHole();
2888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_prototype() {
2892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_non_instance_prototype() || has_instance_prototype();
2893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::instance_prototype() {
2897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(has_instance_prototype());
2898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (has_initial_map()) return initial_map()->prototype();
2899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // When there is no initial map and the prototype is a JSObject, the
2900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // initial map field is used for the prototype field.
2901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return prototype_or_initial_map();
2902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::prototype() {
2906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(has_prototype());
2907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If the function's prototype property has been set to a non-JSObject
2908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // value, that value is stored in the constructor field of the map.
2909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (map()->has_non_instance_prototype()) return map()->constructor();
2910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return instance_prototype();
2911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29136ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool JSFunction::should_have_prototype() {
29146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return map()->function_with_prototype();
29156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
29166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::is_compiled() {
2919756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return code() != Builtins::builtin(Builtins::LazyCompile);
2920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSFunction::NumberOfLiterals() {
2924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return literals()->length();
2925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
2929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= id && id < kJSBuiltinsCount);
29306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return READ_FIELD(this, OffsetOfFunctionWithId(id));
2931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
2935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                              Object* value) {
2936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= id && id < kJSBuiltinsCount);
29376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
29386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  WRITE_BARRIER(this, OffsetOfFunctionWithId(id));
29396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
29406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29426ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCode* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
29436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(0 <= id && id < kJSBuiltinsCount);
29446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
29456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
29466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
29486ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
29496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                                   Code* value) {
29506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(0 <= id && id < kJSBuiltinsCount);
29516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
29526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(!Heap::InNewSpace(value));
2953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress Proxy::proxy() {
2957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return AddressFrom<Address>(READ_INTPTR_FIELD(this, kProxyOffset));
2958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Proxy::set_proxy(Address value) {
2962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_INTPTR_FIELD(this, kProxyOffset, OffsetFrom(value));
2963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSValue, value, Object, kValueOffset)
2967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSValue* JSValue::cast(Object* obj) {
2970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(obj->IsJSValue());
2971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize);
2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<JSValue*>(obj);
2973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockINT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
2977ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon ClarkeACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
2978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::instruction_start()  {
2981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
2982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2985ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarkebyte* Code::instruction_end()  {
2986ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return instruction_start() + instruction_size();
2987ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
2988ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
2989ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
2990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::body_size() {
2991ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return RoundUp(instruction_size(), kObjectAlignment);
2992ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
2993ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
2994ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
2995ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon ClarkeByteArray* Code::unchecked_relocation_info() {
2996ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
2997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::relocation_start() {
3001ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return unchecked_relocation_info()->GetDataStartAddress();
3002ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
3003ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
3004ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
3005ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarkeint Code::relocation_size() {
3006ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return unchecked_relocation_info()->length();
3007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::entry() {
3011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return instruction_start();
3012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Code::contains(byte* pc) {
3016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (instruction_start() <= pc) &&
301780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen      (pc <= instruction_start() + instruction_size());
3018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSArray, length, Object, kLengthOffset)
3022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSRegExp, data, Object, kDataOffset)
3025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Type JSRegExp::TypeTag() {
3028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
3029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (data->IsUndefined()) return JSRegExp::NOT_COMPILED;
3030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
3031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<JSRegExp::Type>(smi->value());
3032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSRegExp::CaptureCount() {
3036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (TypeTag()) {
3037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case ATOM:
3038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return 0;
3039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case IRREGEXP:
3040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value();
3041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
3042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      UNREACHABLE();
3043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return -1;
3044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Flags JSRegExp::GetFlags() {
3049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(this->data()->IsFixedArray());
3050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
3051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex));
3052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Flags(smi->value());
3053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* JSRegExp::Pattern() {
3057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(this->data()->IsFixedArray());
3058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
3059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex));
3060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return pattern;
3061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSRegExp::DataAt(int index) {
3065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(TypeTag() != NOT_COMPILED);
3066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FixedArray::cast(data())->get(index);
3067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSRegExp::SetDataAt(int index, Object* value) {
3071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(TypeTag() != NOT_COMPILED);
3072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= kDataIndex);  // Only implementation data can be set this way.
3073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray::cast(data())->set(index, value);
3074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSObject::ElementsKind JSObject::GetElementsKind() {
3078756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  if (map()->has_fast_elements()) {
3079756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    ASSERT(elements()->map() == Heap::fixed_array_map() ||
3080756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick           elements()->map() == Heap::fixed_cow_array_map());
3081756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    return FAST_ELEMENTS;
3082756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  }
30837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  HeapObject* array = elements();
3084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (array->IsFixedArray()) {
3085756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    // FAST_ELEMENTS or DICTIONARY_ELEMENTS are both stored in a
3086756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    // FixedArray, but FAST_ELEMENTS is already handled above.
3087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(array->IsDictionary());
3088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return DICTIONARY_ELEMENTS;
3089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
30903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (array->IsExternalArray()) {
30913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    switch (array->map()->instance_type()) {
30923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case EXTERNAL_BYTE_ARRAY_TYPE:
30933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        return EXTERNAL_BYTE_ELEMENTS;
30943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
30953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        return EXTERNAL_UNSIGNED_BYTE_ELEMENTS;
30963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case EXTERNAL_SHORT_ARRAY_TYPE:
30973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        return EXTERNAL_SHORT_ELEMENTS;
30983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
30993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        return EXTERNAL_UNSIGNED_SHORT_ELEMENTS;
31003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case EXTERNAL_INT_ARRAY_TYPE:
31013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        return EXTERNAL_INT_ELEMENTS;
31023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
31033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        return EXTERNAL_UNSIGNED_INT_ELEMENTS;
31043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      default:
31053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE);
31063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block        return EXTERNAL_FLOAT_ELEMENTS;
31073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    }
31083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
3109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(array->IsPixelArray());
3110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return PIXEL_ELEMENTS;
3111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasFastElements() {
3115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetElementsKind() == FAST_ELEMENTS;
3116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasDictionaryElements() {
3120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetElementsKind() == DICTIONARY_ELEMENTS;
3121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasPixelElements() {
3125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetElementsKind() == PIXEL_ELEMENTS;
3126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalArrayElements() {
31303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return (HasExternalByteElements() ||
31313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block          HasExternalUnsignedByteElements() ||
31323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block          HasExternalShortElements() ||
31333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block          HasExternalUnsignedShortElements() ||
31343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block          HasExternalIntElements() ||
31353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block          HasExternalUnsignedIntElements() ||
31363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block          HasExternalFloatElements());
31373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
31383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalByteElements() {
31413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return GetElementsKind() == EXTERNAL_BYTE_ELEMENTS;
31423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
31433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalUnsignedByteElements() {
31463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return GetElementsKind() == EXTERNAL_UNSIGNED_BYTE_ELEMENTS;
31473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
31483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalShortElements() {
31513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return GetElementsKind() == EXTERNAL_SHORT_ELEMENTS;
31523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
31533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalUnsignedShortElements() {
31563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return GetElementsKind() == EXTERNAL_UNSIGNED_SHORT_ELEMENTS;
31573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
31583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalIntElements() {
31613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return GetElementsKind() == EXTERNAL_INT_ELEMENTS;
31623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
31633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalUnsignedIntElements() {
31663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return GetElementsKind() == EXTERNAL_UNSIGNED_INT_ELEMENTS;
31673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
31683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalFloatElements() {
31713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return GetElementsKind() == EXTERNAL_FLOAT_ELEMENTS;
31723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
31733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
31743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasNamedInterceptor() {
3176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_named_interceptor();
3177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasIndexedInterceptor() {
3181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_indexed_interceptor();
3182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31856ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool JSObject::AllowsSetElementsLength() {
31866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool result = elements()->IsFixedArray();
31876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(result == (!HasPixelElements() && !HasExternalArrayElements()));
31886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return result;
31896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
31906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
31916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3192756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickObject* JSObject::EnsureWritableFastElements() {
3193756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(HasFastElements());
3194756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  FixedArray* elems = FixedArray::cast(elements());
3195756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  if (elems->map() != Heap::fixed_cow_array_map()) return elems;
31960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  Object* writable_elems = Heap::CopyFixedArrayWithMap(elems,
31970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                                                       Heap::fixed_array_map());
3198756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  if (writable_elems->IsFailure()) return writable_elems;
3199756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  set_elements(FixedArray::cast(writable_elems));
3200756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  Counters::cow_arrays_converted.Increment();
3201756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return writable_elems;
3202756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3203756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3204756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringDictionary* JSObject::property_dictionary() {
3206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!HasFastProperties());
3207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringDictionary::cast(properties());
3208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockNumberDictionary* JSObject::element_dictionary() {
3212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(HasDictionaryElements());
3213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return NumberDictionary::cast(elements());
3214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32177f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool String::IsHashFieldComputed(uint32_t field) {
32187f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return (field & kHashNotComputedMask) == 0;
32197f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
32207f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
32217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
3222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::HasHashCode() {
32237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return IsHashFieldComputed(hash_field());
3224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t String::Hash() {
3228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Fast case: has hash code already been computed?
3229d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  uint32_t field = hash_field();
32307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsHashFieldComputed(field)) return field >> kHashShift;
3231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Slow case: compute hash code and set it.
3232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ComputeAndSetHash();
3233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringHasher::StringHasher(int length)
3237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : length_(length),
3238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    raw_running_hash_(0),
3239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    array_index_(0),
3240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize),
3241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    is_first_char_(true),
3242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    is_valid_(true) { }
3243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringHasher::has_trivial_hash() {
3246d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return length_ > String::kMaxHashCalcLength;
3247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid StringHasher::AddCharacter(uc32 c) {
3251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Use the Jenkins one-at-a-time hash function to update the hash
3252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // for the given character.
3253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ += c;
3254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ += (raw_running_hash_ << 10);
3255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ ^= (raw_running_hash_ >> 6);
3256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Incremental array index computation.
3257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (is_array_index_) {
3258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (c < '0' || c > '9') {
3259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      is_array_index_ = false;
3260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
3261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int d = c - '0';
3262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (is_first_char_) {
3263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        is_first_char_ = false;
3264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (c == '0' && length_ > 1) {
3265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          is_array_index_ = false;
3266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          return;
3267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
3268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
3269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (array_index_ > 429496729U - ((d + 2) >> 3)) {
3270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        is_array_index_ = false;
3271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
3272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        array_index_ = array_index_ * 10 + d;
3273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
3274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
3275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid StringHasher::AddCharacterNoIndex(uc32 c) {
3280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!is_array_index());
3281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ += c;
3282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ += (raw_running_hash_ << 10);
3283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ ^= (raw_running_hash_ >> 6);
3284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t StringHasher::GetHash() {
3288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Get the calculated raw hash value and do some more bit ops to distribute
3289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // the hash further. Ensure that we never return zero as the hash value.
3290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t result = raw_running_hash_;
3291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += (result << 3);
3292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result ^= (result >> 11);
3293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += (result << 15);
3294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (result == 0) {
3295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result = 27;
3296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
3298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::AsArrayIndex(uint32_t* index) {
3302d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  uint32_t field = hash_field();
33037f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) {
33047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    return false;
33057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
3306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return SlowAsArrayIndex(index);
3307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::GetPrototype() {
3311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return JSObject::cast(this)->map()->prototype();
3312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyAttributes JSObject::GetPropertyAttribute(String* key) {
3316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetPropertyAttributeWithReceiver(this, key);
3317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3319d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// TODO(504): this may be useful in other places too where JSGlobalProxy
3320d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// is used.
3321d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockObject* JSObject::BypassGlobalProxy() {
3322d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (IsJSGlobalProxy()) {
3323d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    Object* proto = GetPrototype();
3324d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    if (proto->IsNull()) return Heap::undefined_value();
3325d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    ASSERT(proto->IsJSGlobalObject());
3326d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return proto;
3327d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
3328d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return this;
3329d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block}
3330d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
3331d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
3332d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockbool JSObject::HasHiddenPropertiesObject() {
3333d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  ASSERT(!IsJSGlobalProxy());
3334d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return GetPropertyAttributePostInterceptor(this,
3335d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                                             Heap::hidden_symbol(),
3336d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                                             false) != ABSENT;
3337d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block}
3338d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
3339d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
3340d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockObject* JSObject::GetHiddenPropertiesObject() {
3341d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  ASSERT(!IsJSGlobalProxy());
3342d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  PropertyAttributes attributes;
3343d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return GetLocalPropertyPostInterceptor(this,
3344d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                                         Heap::hidden_symbol(),
3345d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                                         &attributes);
3346d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block}
3347d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
3348d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
3349d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockObject* JSObject::SetHiddenPropertiesObject(Object* hidden_obj) {
3350d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  ASSERT(!IsJSGlobalProxy());
3351d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return SetPropertyPostInterceptor(Heap::hidden_symbol(),
3352d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                                    hidden_obj,
3353d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block                                    DONT_ENUM);
3354d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block}
3355d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
3356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasElement(uint32_t index) {
3358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HasElementWithReceiver(this, index);
3359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_read() {
3363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BooleanBit::get(flag(), kAllCanReadBit);
3364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_read(bool value) {
3368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(BooleanBit::set(flag(), kAllCanReadBit, value));
3369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_write() {
3373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BooleanBit::get(flag(), kAllCanWriteBit);
3374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_write(bool value) {
3378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value));
3379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::prohibits_overwriting() {
3383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BooleanBit::get(flag(), kProhibitsOverwritingBit);
3384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_prohibits_overwriting(bool value) {
3388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(BooleanBit::set(flag(), kProhibitsOverwritingBit, value));
3389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyAttributes AccessorInfo::property_attributes() {
3393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return AttributesField::decode(static_cast<uint32_t>(flag()->value()));
3394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_property_attributes(PropertyAttributes attributes) {
3398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(AttributesField::is_valid(attributes));
3399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int rest_value = flag()->value() & ~AttributesField::mask();
3400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(Smi::FromInt(rest_value | AttributesField::encode(attributes)));
3401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Shape, typename Key>
3404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Dictionary<Shape, Key>::SetEntry(int entry,
3405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Object* key,
3406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Object* value,
3407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      PropertyDetails details) {
3408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!key->IsString() || details.IsDeleted() || details.index() > 0);
3409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int index = HashTable<Shape, Key>::EntryToIndex(entry);
34104515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  AssertNoAllocation no_gc;
34114515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
3412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray::set(index, key, mode);
3413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray::set(index+1, value, mode);
3414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray::fast_set(this, index+2, details.AsSmi());
3415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::ClearCodeCache() {
3419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // No write barrier is needed since empty_fixed_array is not in new space.
3420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Please note this function is used during marking:
3421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  //  - MarkCompactCollector::MarkUnmarkedObject
3422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!Heap::InNewSpace(Heap::raw_unchecked_empty_fixed_array()));
3423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kCodeCacheOffset, Heap::raw_unchecked_empty_fixed_array());
3424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSArray::EnsureSize(int required_size) {
3428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(HasFastElements());
34297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  FixedArray* elts = FixedArray::cast(elements());
3430d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  const int kArraySizeThatFitsComfortablyInNewSpace = 128;
3431d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (elts->length() < required_size) {
3432d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // Doubling in size would be overkill, but leave some slack to avoid
3433d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // constantly growing.
3434d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    Expand(required_size + (required_size >> 3));
3435d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // It's a performance benefit to keep a frequently used array in new-space.
3436d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  } else if (!Heap::new_space()->Contains(elts) &&
3437d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block             required_size < kArraySizeThatFitsComfortablyInNewSpace) {
3438d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // Expand will allocate a new backing store in new space even if the size
3439d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // we asked for isn't larger than what we had before.
3440d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    Expand(required_size);
3441d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
3442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
34454515c472dc3e5ed2448a564600976759e569a0a8Leon Clarkevoid JSArray::set_length(Smi* length) {
34464515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
34474515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke}
34484515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke
34494515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke
3450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSArray::SetContent(FixedArray* storage) {
34514515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  set_length(Smi::FromInt(storage->length()));
3452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_elements(storage);
3453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* FixedArray::Copy() {
3457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (length() == 0) return this;
3458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Heap::CopyFixedArray(this);
3459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3462756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) {
3463756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return map->instance_size();
3464756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3465756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3466756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3467756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Proxy::ProxyIterateBody(ObjectVisitor* v) {
3468756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  v->VisitExternalReference(
3469756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Address *>(FIELD_ADDR(this, kProxyOffset)));
3470756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3471756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3472756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3473756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor>
3474756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Proxy::ProxyIterateBody() {
3475756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  StaticVisitor::VisitExternalReference(
3476756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Address *>(FIELD_ADDR(this, kProxyOffset)));
3477756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3478756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3479756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3480756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) {
3481756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  typedef v8::String::ExternalAsciiStringResource Resource;
3482756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  v->VisitExternalAsciiString(
3483756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
3484756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3485756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3486756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3487756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor>
3488756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalAsciiString::ExternalAsciiStringIterateBody() {
3489756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  typedef v8::String::ExternalAsciiStringResource Resource;
3490756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  StaticVisitor::VisitExternalAsciiString(
3491756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
3492756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3493756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3494756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3495756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) {
3496756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  typedef v8::String::ExternalStringResource Resource;
3497756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  v->VisitExternalTwoByteString(
3498756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
3499756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3500756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3501756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3502756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor>
3503756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
3504756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  typedef v8::String::ExternalStringResource Resource;
3505756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  StaticVisitor::VisitExternalTwoByteString(
3506756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
3507756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3508756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3509756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#define SLOT_ADDR(obj, offset) \
3510756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  reinterpret_cast<Object**>((obj)->address() + offset)
3511756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3512756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<int start_offset, int end_offset, int size>
3513756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody(
3514756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    HeapObject* obj,
3515756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    ObjectVisitor* v) {
3516756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, end_offset));
3517756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3518756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3519756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3520756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<int start_offset>
3521756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj,
3522756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick                                                       int object_size,
3523756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick                                                       ObjectVisitor* v) {
3524756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, object_size));
3525756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3526756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3527756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#undef SLOT_ADDR
3528756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3529756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CAST_ACCESSOR
3531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef INT_ACCESSORS
3532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef SMI_ACCESSORS
3533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef ACCESSORS
3534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef FIELD_ADDR
3535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_FIELD
3536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_FIELD
3537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BARRIER
3538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CONDITIONAL_WRITE_BARRIER
3539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_MEMADDR_FIELD
3540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_MEMADDR_FIELD
3541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_DOUBLE_FIELD
3542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_DOUBLE_FIELD
3543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_INT_FIELD
3544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_INT_FIELD
3545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_SHORT_FIELD
3546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_SHORT_FIELD
3547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_BYTE_FIELD
3548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BYTE_FIELD
3549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
3552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_OBJECTS_INL_H_
3554