13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 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
3869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#include "elements.h"
3980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "objects.h"
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "contexts.h"
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "conversions-inl.h"
4280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "heap.h"
4344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "isolate.h"
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "property.h"
4580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "spaces.h"
463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "store-buffer.h"
4744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "v8memory.h"
483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "factory.h"
493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "incremental-marking.h"
50592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails::PropertyDetails(Smi* smi) {
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value_ = smi->value();
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* PropertyDetails::AsSmi() {
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Smi::FromInt(value_);
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails PropertyDetails::AsDeleted() {
651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return PropertyDetails(smi);
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define TYPE_CHECKER(type, instancetype)                                \
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool Object::Is##type() {                                             \
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Object::IsHeapObject() &&                                      \
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HeapObject::cast(this)->map()->instance_type() == instancetype;   \
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CAST_ACCESSOR(type)                     \
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  type* type::cast(Object* object) {            \
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(object->Is##type());                 \
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return reinterpret_cast<type*>(object);     \
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define INT_ACCESSORS(holder, name, offset)                             \
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int holder::name() { return READ_INT_FIELD(this, offset); }           \
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); }
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define ACCESSORS(holder, name, type, offset)                           \
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(type* value, WriteBarrierMode mode) {         \
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);                                   \
933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);    \
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Getter that returns a tagged Smi and setter that writes a tagged Smi.
983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ACCESSORS_TO_SMI(holder, name, offset)                          \
993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Smi* holder::name() { return Smi::cast(READ_FIELD(this, offset)); }   \
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void holder::set_##name(Smi* value, WriteBarrierMode mode) {          \
1015d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch    WRITE_FIELD(this, offset, value);                                   \
1025d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch  }
1035d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
1045d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Getter that returns a Smi as an int and writes an int as a Smi.
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define SMI_ACCESSORS(holder, name, offset)             \
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int holder::name() {                                  \
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    Object* value = READ_FIELD(this, offset);           \
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return Smi::cast(value)->value();                   \
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }                                                     \
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(int value) {                  \
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, Smi::FromInt(value));     \
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_GETTER(holder, field, name, offset)           \
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool holder::name() {                                    \
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return BooleanBit::get(field(), offset);               \
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }                                                        \
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_ACCESSORS(holder, field, name, offset)        \
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool holder::name() {                                    \
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return BooleanBit::get(field(), offset);               \
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }                                                        \
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(bool value) {                    \
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_##field(BooleanBit::set(field(), offset, value));  \
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool IsMoreGeneralElementsKindTransition(ElementsKind from_kind,
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                         ElementsKind to_kind) {
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (to_kind == FAST_ELEMENTS) {
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return from_kind == FAST_SMI_ONLY_ELEMENTS ||
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        from_kind == FAST_DOUBLE_ELEMENTS;
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return to_kind == FAST_DOUBLE_ELEMENTS &&
1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        from_kind == FAST_SMI_ONLY_ELEMENTS;
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsFixedArrayBase() {
1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return IsFixedArray() || IsFixedDoubleArray();
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsInstanceOf(FunctionTemplateInfo* expected) {
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // There is a constraint on the object; check.
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!this->IsJSObject()) return false;
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Fetch the constructor function of the object.
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* cons_obj = JSObject::cast(this)->map()->constructor();
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!cons_obj->IsJSFunction()) return false;
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSFunction* fun = JSFunction::cast(cons_obj);
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Iterate through the chain of inheriting function templates to
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // see if the required one occurs.
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (Object* type = fun->shared()->function_data();
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       type->IsFunctionTemplateInfo();
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block       type = FunctionTemplateInfo::cast(type)->parent_template()) {
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (type == expected) return true;
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Didn't find the required type in the inheritance chain.
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return false;
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSmi() {
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_SMI_TAG(this);
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHeapObject() {
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Internals::HasHeapObjectTag(this);
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::NonFailureIsHeapObject() {
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(!this->IsFailure());
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (reinterpret_cast<intptr_t>(this) & kSmiTagMask) != 0;
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE)
1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsString() {
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Object::IsHeapObject()
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE;
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
19269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool Object::IsSpecObject() {
19369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return Object::IsHeapObject()
19469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    && HeapObject::cast(this)->map()->instance_type() >= FIRST_SPEC_OBJECT_TYPE;
19569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
19669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
19769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsSpecFunction() {
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!Object::IsHeapObject()) return false;
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstanceType type = HeapObject::cast(this)->map()->instance_type();
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return type == JS_FUNCTION_TYPE || type == JS_FUNCTION_PROXY_TYPE;
2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSymbol() {
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!this->IsHeapObject()) return false;
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t type = HeapObject::cast(this)->map()->instance_type();
208e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // Because the symbol tag is non-zero and no non-string types have the
209e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // symbol bit set we can test for symbols with a very simple test
210e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  // operation.
21169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  STATIC_ASSERT(kSymbolTag != 0);
212e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  ASSERT(kNotStringTag + kIsSymbolMask > LAST_TYPE);
213e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  return (type & kIsSymbolMask) != 0;
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsConsString() {
21869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!IsString()) return false;
21969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return StringShape(String::cast(this)).IsCons();
22069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
22169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
22269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
22369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool Object::IsSlicedString() {
22469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!IsString()) return false;
22569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return StringShape(String::cast(this)).IsSliced();
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqString() {
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential();
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqAsciiString() {
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential() &&
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsAsciiRepresentation();
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqTwoByteString() {
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential() &&
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsTwoByteRepresentation();
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalString() {
250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal();
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalAsciiString() {
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal() &&
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsAsciiRepresentation();
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalTwoByteString() {
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal() &&
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsTwoByteRepresentation();
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool Object::HasValidElements() {
2693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  // Dictionary is covered under FixedArray.
2703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return IsFixedArray() || IsFixedDoubleArray() || IsExternalArray();
2713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(String* str)
274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : type_(str->map()->instance_type()) {
275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_valid();
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((type_ & kIsNotStringMask) == kStringTag);
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(Map* map)
281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : type_(map->instance_type()) {
282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_valid();
283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((type_ & kIsNotStringMask) == kStringTag);
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(InstanceType t)
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : type_(static_cast<uint32_t>(t)) {
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_valid();
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((type_ & kIsNotStringMask) == kStringTag);
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSymbol() {
295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(valid());
29669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  STATIC_ASSERT(kSymbolTag != 0);
297e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  return (type_ & kIsSymbolMask) != 0;
298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsAsciiRepresentation() {
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t type = map()->instance_type();
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type & kStringEncodingMask) == kAsciiStringTag;
304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsTwoByteRepresentation() {
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t type = map()->instance_type();
309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type & kStringEncodingMask) == kTwoByteStringTag;
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool String::IsAsciiRepresentationUnderneath() {
31469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  uint32_t type = map()->instance_type();
31569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  STATIC_ASSERT(kIsIndirectStringTag != 0);
31669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
31769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT(IsFlat());
31869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
31969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case kAsciiStringTag:
32069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return true;
32169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case kTwoByteStringTag:
32269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return false;
32369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    default:  // Cons or sliced string.  Need to go deeper.
32469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return GetUnderlying()->IsAsciiRepresentation();
32569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
32669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
32769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
32869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
32969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool String::IsTwoByteRepresentationUnderneath() {
33069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  uint32_t type = map()->instance_type();
33169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  STATIC_ASSERT(kIsIndirectStringTag != 0);
33269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
33369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT(IsFlat());
33469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
33569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case kAsciiStringTag:
33669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return false;
33769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case kTwoByteStringTag:
33869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return true;
33969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    default:  // Cons or sliced string.  Need to go deeper.
34069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return GetUnderlying()->IsTwoByteRepresentation();
34169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
34269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
34369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
34469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3459dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenbool String::HasOnlyAsciiChars() {
3469dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  uint32_t type = map()->instance_type();
3479dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen  return (type & kStringEncodingMask) == kAsciiStringTag ||
3489dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen         (type & kAsciiDataHintMask) == kAsciiDataHintTag;
3496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
3506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsCons() {
353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type_ & kStringRepresentationMask) == kConsStringTag;
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool StringShape::IsSliced() {
35869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return (type_ & kStringRepresentationMask) == kSlicedStringTag;
35969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
36069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
36169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
36269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool StringShape::IsIndirect() {
36369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return (type_ & kIsIndirectStringMask) == kIsIndirectStringTag;
36469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
36569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
36669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternal() {
368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type_ & kStringRepresentationMask) == kExternalStringTag;
369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequential() {
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type_ & kStringRepresentationMask) == kSeqStringTag;
374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringRepresentationTag StringShape::representation_tag() {
378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t tag = (type_ & kStringRepresentationMask);
379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<StringRepresentationTag>(tag);
380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
38369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint32_t StringShape::encoding_tag() {
38469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return type_ & kStringEncodingMask;
38569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
38669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
38769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t StringShape::full_representation_tag() {
389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return (type_ & (kStringRepresentationMask | kStringEncodingMask));
390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSTATIC_CHECK((kStringRepresentationMask | kStringEncodingMask) ==
394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             Internals::kFullStringRepresentationMask);
395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequentialAscii() {
398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return full_representation_tag() == (kSeqStringTag | kAsciiStringTag);
399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequentialTwoByte() {
403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return full_representation_tag() == (kSeqStringTag | kTwoByteStringTag);
404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternalAscii() {
408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return full_representation_tag() == (kExternalStringTag | kAsciiStringTag);
409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternalTwoByte() {
413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag);
414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSTATIC_CHECK((kExternalStringTag | kTwoByteStringTag) ==
418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             Internals::kExternalTwoByteRepresentationTag);
419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc32 FlatStringReader::Get(int index) {
422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= index && index <= length_);
423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (is_ascii_) {
424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return static_cast<const byte*>(start_)[index];
425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return static_cast<const uc16*>(start_)[index];
427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsNumber() {
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsSmi() || IsHeapNumber();
433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE)
4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE)
438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsFiller() {
4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!Object::IsHeapObject()) return false;
4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstanceType instance_type = HeapObject::cast(this)->map()->instance_type();
4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE;
44485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch}
445592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
446592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalPixelArray, EXTERNAL_PIXEL_ARRAY_TYPE)
4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalArray() {
4513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (!Object::IsHeapObject())
4523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return false;
4533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  InstanceType instance_type =
4543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      HeapObject::cast(this)->map()->instance_type();
455e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke  return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE &&
456e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke          instance_type <= LAST_EXTERNAL_ARRAY_TYPE);
4573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
4583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalByteArray, EXTERNAL_BYTE_ARRAY_TYPE)
4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalUnsignedByteArray, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalShortArray, EXTERNAL_SHORT_ARRAY_TYPE)
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalUnsignedShortArray, EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalIntArray, EXTERNAL_INT_ARRAY_TYPE)
4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalUnsignedIntArray, EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalFloatArray, EXTERNAL_FLOAT_ARRAY_TYPE)
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalDoubleArray, EXTERNAL_DOUBLE_ARRAY_TYPE)
468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
469257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4705913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsFailure() {
471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_FAILURE_TAG(this);
472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4755913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsRetryAfterGC() {
476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_FAILURE_TAG(this)
477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC;
478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4815913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsOutOfMemory() {
482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_FAILURE_TAG(this)
4831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      && Failure::cast(this)->IsOutOfMemoryException();
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4875913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsException() {
488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this == Failure::Exception();
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4925913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsTheHole() {
49344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return !IsFailure() && ToObjectUnchecked()->IsTheHole();
4945913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck}
4955913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck
4965913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck
4975913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckFailure* Failure::cast(MaybeObject* obj) {
4985913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  ASSERT(HAS_FAILURE_TAG(obj));
4995913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  return reinterpret_cast<Failure*>(obj);
5005913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck}
5015913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck
5025913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck
5033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool Object::IsJSReceiver() {
5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
5053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return IsHeapObject() &&
5063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_RECEIVER_TYPE;
5073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
5083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
5093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSObject() {
5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE);
5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return IsHeapObject() &&
5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
5143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
5153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
5163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
5173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool Object::IsJSProxy() {
5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!Object::IsHeapObject()) return false;
5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstanceType type = HeapObject::cast(this)->map()->instance_type();
5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return FIRST_JS_PROXY_TYPE <= type && type <= LAST_JS_PROXY_TYPE;
52185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch}
52285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
52385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSFunctionProxy, JS_FUNCTION_PROXY_TYPE)
5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSSet, JS_SET_TYPE)
5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSMap, JS_MAP_TYPE)
5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE)
5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE)
5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(Map, MAP_TYPE)
5303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE)
5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)
5323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
5333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsDescriptorArray() {
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsFixedArray();
536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Object::IsDeoptimizationInputData() {
540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Must be a fixed array.
541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!IsFixedArray()) return false;
542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // There's no sure way to detect the difference between a fixed array and
544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // a deoptimization data array.  Since this is used for asserts we can
545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // check that the length is zero or else the fixed size plus a multiple of
546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the entry size.
547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int length = FixedArray::cast(this)->length();
548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (length == 0) return true;
549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  length -= DeoptimizationInputData::kFirstDeoptEntryIndex;
551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return length >= 0 &&
552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      length % DeoptimizationInputData::kDeoptEntrySize == 0;
553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Object::IsDeoptimizationOutputData() {
557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!IsFixedArray()) return false;
558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // There's actually no way to see the difference between a fixed array and
559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // a deoptimization data array.  Since this is used for asserts we can check
560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // that the length is plausible though.
561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (FixedArray::cast(this)->length() % 2 != 0) return false;
562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return true;
563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsTypeFeedbackCells() {
5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!IsFixedArray()) return false;
5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // There's actually no way to see the difference between a fixed array and
5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // a cache cells array.  Since this is used for asserts we can check that
5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // the length is plausible though.
5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (FixedArray::cast(this)->length() % 2 != 0) return false;
5723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return true;
5733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
5743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsContext() {
57744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (Object::IsHeapObject()) {
5783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    Map* map = HeapObject::cast(this)->map();
5793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    Heap* heap = map->GetHeap();
5803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return (map == heap->function_context_map() ||
5813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            map == heap->catch_context_map() ||
5823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            map == heap->with_context_map() ||
58369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch            map == heap->global_context_map() ||
58469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch            map == heap->block_context_map());
58544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
58644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return false;
587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsGlobalContext() {
59144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return Object::IsHeapObject() &&
59244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      HeapObject::cast(this)->map() ==
59344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      HeapObject::cast(this)->GetHeap()->global_context_map();
594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsScopeInfo() {
59869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return Object::IsHeapObject() &&
59969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      HeapObject::cast(this)->map() ==
6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HeapObject::cast(this)->GetHeap()->scope_info_map();
60169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
60269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
60369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE)
605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> inline bool Is<JSFunction>(Object* obj) {
608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return obj->IsJSFunction();
609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(Code, CODE_TYPE)
6133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(Oddball, ODDBALL_TYPE)
6143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSGlobalPropertyCell, JS_GLOBAL_PROPERTY_CELL_TYPE)
6153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE)
6163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSValue, JS_VALUE_TYPE)
6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSDate, JS_DATE_TYPE)
6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE)
619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStringWrapper() {
622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsJSValue() && JSValue::cast(this)->value()->IsString();
623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(Foreign, FOREIGN_TYPE)
627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsBoolean() {
63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return IsOddball() &&
63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0);
632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSArray, JS_ARRAY_TYPE)
6363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE)
637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> inline bool Is<JSArray>(Object* obj) {
640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return obj->IsJSArray();
641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHashTable() {
64544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return Object::IsHeapObject() &&
64644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      HeapObject::cast(this)->map() ==
64744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      HeapObject::cast(this)->GetHeap()->hash_table_map();
648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsDictionary() {
6523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return IsHashTable() &&
6533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      this != HeapObject::cast(this)->GetHeap()->symbol_table();
654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSymbolTable() {
65844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return IsHashTable() && this ==
65944f0eee88ff00398ff7f715fab053374d808c90dSteve Block         HeapObject::cast(this)->GetHeap()->raw_unchecked_symbol_table();
660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6636ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Object::IsJSFunctionResultCache() {
6646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (!IsFixedArray()) return false;
6656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  FixedArray* self = FixedArray::cast(this);
6666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int length = self->length();
6676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (length < JSFunctionResultCache::kEntriesIndex) return false;
6686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if ((length - JSFunctionResultCache::kEntriesIndex)
6696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      % JSFunctionResultCache::kEntrySize != 0) {
6706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    return false;
6716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
6726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef DEBUG
6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (FLAG_verify_heap) {
6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    reinterpret_cast<JSFunctionResultCache*>(this)->
6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        JSFunctionResultCacheVerify();
6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
6776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif
6786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return true;
6796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
6806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
6816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
68280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenbool Object::IsNormalizedMapCache() {
68380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  if (!IsFixedArray()) return false;
68480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  if (FixedArray::cast(this)->length() != NormalizedMapCache::kEntries) {
68580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen    return false;
68680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  }
68780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#ifdef DEBUG
6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (FLAG_verify_heap) {
6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    reinterpret_cast<NormalizedMapCache*>(this)->NormalizedMapCacheVerify();
6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
69180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#endif
69280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  return true;
69380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
69480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
69580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsCompilationCacheTable() {
697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHashTable();
698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7016ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Object::IsCodeCacheHashTable() {
7026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return IsHashTable();
7036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
7046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
7056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
7063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool Object::IsPolymorphicCodeCacheHashTable() {
7073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return IsHashTable();
7083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
7093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
7103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsMapCache() {
712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHashTable();
713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsPrimitive() {
717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsOddball() || IsNumber() || IsString();
718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSGlobalProxy() {
722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool result = IsHeapObject() &&
723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                (HeapObject::cast(this)->map()->instance_type() ==
724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                 JS_GLOBAL_PROXY_TYPE);
725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!result || IsAccessCheckNeeded());
726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsGlobalObject() {
731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsHeapObject()) return false;
732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InstanceType type = HeapObject::cast(this)->map()->instance_type();
734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return type == JS_GLOBAL_OBJECT_TYPE ||
735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         type == JS_BUILTINS_OBJECT_TYPE;
736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE)
7403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSBuiltinsObject, JS_BUILTINS_OBJECT_TYPE)
741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsUndetectableObject() {
744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHeapObject()
745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->is_undetectable();
746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsAccessCheckNeeded() {
750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsHeapObject()
751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    && HeapObject::cast(this)->map()->is_access_check_needed();
752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStruct() {
756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsHeapObject()) return false;
757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (HeapObject::cast(this)->map()->instance_type()) {
758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true;
759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  STRUCT_LIST(MAKE_STRUCT_CASE)
760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CASE
761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default: return false;
762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_PREDICATE(NAME, Name, name)                  \
767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool Object::Is##Name() {                                      \
768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return Object::IsHeapObject()                                \
769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \
770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  STRUCT_LIST(MAKE_STRUCT_PREDICATE)
772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_PREDICATE
773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsUndefined() {
77644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUndefined;
777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsNull() {
78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kNull;
78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
78544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool Object::IsTheHole() {
78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTheHole;
787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsTrue() {
79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTrue;
792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsFalse() {
79644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse;
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
800086aeeaae12517475c22695a200be45495516549Ben Murdochbool Object::IsArgumentsMarker() {
80144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker;
802086aeeaae12517475c22695a200be45495516549Ben Murdoch}
803086aeeaae12517475c22695a200be45495516549Ben Murdoch
804086aeeaae12517475c22695a200be45495516549Ben Murdoch
805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdouble Object::Number() {
806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(IsNumber());
807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return IsSmi()
808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ? static_cast<double>(reinterpret_cast<Smi*>(this)->value())
809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    : reinterpret_cast<HeapNumber*>(this)->value();
810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsNaN() {
8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this->IsHeapNumber() && isnan(HeapNumber::cast(this)->value());
8153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8185913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* Object::ToSmi() {
819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (IsSmi()) return this;
820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (IsHeapNumber()) {
821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    double value = HeapNumber::cast(this)->value();
822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int int_value = FastD2I(value);
823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (value == FastI2D(int_value) && Smi::IsValid(int_value)) {
824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return Smi::FromInt(int_value);
825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Failure::Exception();
828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::HasSpecificClassOf(String* name) {
832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this->IsJSObject() && (JSObject::cast(this)->class_name() == name);
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8365913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* Object::GetElement(uint32_t index) {
837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // GetElement can trigger a getter which can cause allocation.
838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // This was not always the case. This ASSERT is here to catch
839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  // leftover incorrect uses.
84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(HEAP->IsAllocationAllowed());
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetElementWithReceiver(this, index);
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8455913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckObject* Object::GetElementNoExceptionThrown(uint32_t index) {
8465913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  MaybeObject* maybe = GetElementWithReceiver(this, index);
8475913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  ASSERT(!maybe->IsFailure());
8485913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  Object* result = NULL;  // Initialization to please compiler.
8495913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  maybe->ToObject(&result);
8505913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  return result;
8515913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck}
8525913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck
8535913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck
8545913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* Object::GetProperty(String* key) {
855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  PropertyAttributes attributes;
856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetPropertyWithReceiver(this, key, &attributes);
857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8605913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* Object::GetProperty(String* key, PropertyAttributes* attributes) {
861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetPropertyWithReceiver(this, key, attributes);
862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define FIELD_ADDR(p, offset) \
866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag)
867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_FIELD(p, offset) \
869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)))
870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_FIELD(p, offset, value) \
872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value)
873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define WRITE_BARRIER(heap, object, offset, value)                      \
8753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  heap->incremental_marking()->RecordWrite(                             \
8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      object, HeapObject::RawField(object, offset), value);             \
8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (heap->InNewSpace(value)) {                                        \
8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    heap->RecordWrite(object->address(), offset);                       \
8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode)    \
8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (mode == UPDATE_WRITE_BARRIER) {                                   \
8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    heap->incremental_marking()->RecordWrite(                           \
8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      object, HeapObject::RawField(object, offset), value);             \
8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (heap->InNewSpace(value)) {                                      \
8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      heap->RecordWrite(object->address(), offset);                     \
8873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }                                                                   \
888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
89044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifndef V8_TARGET_ARCH_MIPS
89144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  #define READ_DOUBLE_FIELD(p, offset) \
89244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)))
89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else  // V8_TARGET_ARCH_MIPS
89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Prevent gcc from using load-double (mips ldc1) on (possibly)
89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // non-64-bit aligned HeapNumber::value.
8963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  static inline double read_double_field(void* p, int offset) {
89744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    union conversion {
89844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      double d;
89944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      uint32_t u[2];
90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } c;
90144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    c.u[0] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)));
90244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    c.u[1] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4)));
90344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return c.d;
90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  #define READ_DOUBLE_FIELD(p, offset) read_double_field(p, offset)
90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // V8_TARGET_ARCH_MIPS
90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifndef V8_TARGET_ARCH_MIPS
90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  #define WRITE_DOUBLE_FIELD(p, offset, value) \
91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value)
91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else  // V8_TARGET_ARCH_MIPS
91244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Prevent gcc from using store-double (mips sdc1) on (possibly)
91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // non-64-bit aligned HeapNumber::value.
9143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  static inline void write_double_field(void* p, int offset,
91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                        double value) {
91644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    union conversion {
91744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      double d;
91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      uint32_t u[2];
91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } c;
92044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    c.d = value;
92144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) = c.u[0];
92244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4))) = c.u[1];
92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
92444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  #define WRITE_DOUBLE_FIELD(p, offset, value) \
92544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    write_double_field(p, offset, value)
92644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // V8_TARGET_ARCH_MIPS
927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INT_FIELD(p, offset) \
930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)))
931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INT_FIELD(p, offset, value) \
933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value)
934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INTPTR_FIELD(p, offset) \
936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)))
937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INTPTR_FIELD(p, offset, value) \
939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value)
940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_UINT32_FIELD(p, offset) \
942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)))
943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_UINT32_FIELD(p, offset, value) \
945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value)
946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
9473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define READ_INT64_FIELD(p, offset) \
9483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)))
9493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define WRITE_INT64_FIELD(p, offset, value) \
9513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value)
9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_SHORT_FIELD(p, offset) \
954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)))
955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_SHORT_FIELD(p, offset, value) \
957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value)
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_BYTE_FIELD(p, offset) \
960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)))
961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_BYTE_FIELD(p, offset, value) \
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value)
964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject** HeapObject::RawField(HeapObject* obj, int byte_offset) {
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return &READ_FIELD(obj, byte_offset);
968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Smi::value() {
972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Internals::SmiValue(this);
973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* Smi::FromInt(int value) {
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(Smi::IsValid(value));
9783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  intptr_t tagged_value =
9803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag;
981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Smi*>(tagged_value);
982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* Smi::FromIntptr(intptr_t value) {
986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(Smi::IsValid(value));
9873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
9883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag);
989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure::Type Failure::type() const {
993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<Type>(value() & kFailureTypeTagMask);
994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Failure::IsInternalError() const {
998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return type() == INTERNAL_ERROR;
999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Failure::IsOutOfMemoryException() const {
1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return type() == OUT_OF_MEMORY_EXCEPTION;
1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAllocationSpace Failure::allocation_space() const {
1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_EQ(RETRY_AFTER_GC, type());
1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<AllocationSpace>((value() >> kFailureTypeTagSize)
1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      & kSpaceTagMask);
1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::InternalError() {
1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Construct(INTERNAL_ERROR);
1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::Exception() {
1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Construct(EXCEPTION);
1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::OutOfMemoryException() {
1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Construct(OUT_OF_MEMORY_EXCEPTION);
1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockintptr_t Failure::value() const {
10306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return static_cast<intptr_t>(
10316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      reinterpret_cast<uintptr_t>(this) >> kFailureTagSize);
1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1035f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochFailure* Failure::RetryAfterGC() {
1036f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  return RetryAfterGC(NEW_SPACE);
1037f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch}
1038f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1039f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1040f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochFailure* Failure::RetryAfterGC(AllocationSpace space) {
1041f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  ASSERT((space & ~kSpaceTagMask) == 0);
1042f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  return Construct(RETRY_AFTER_GC, space);
1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockFailure* Failure::Construct(Type type, intptr_t value) {
10476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  uintptr_t info =
10486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block      (static_cast<uintptr_t>(value) << kFailureTypeTagSize) | type;
1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info);
10503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return reinterpret_cast<Failure*>((info << kFailureTagSize) | kFailureTag);
1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Smi::IsValid(intptr_t value) {
1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  bool in_range = (value >= kMinValue) && (value <= kMaxValue);
1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
10583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
10593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#ifdef V8_TARGET_ARCH_X64
10603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  // To be representable as a long smi, the value must be a 32-bit integer.
10613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  bool result = (value == static_cast<int32_t>(value));
10623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#else
1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // To be representable as an tagged small integer, the two
1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // most-significant bits of 'value' must be either 00 or 11 due to
1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // sign-extension. To check this we add 01 to the two
1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // most-significant bits, and check if the most-significant bit is 0
1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  //
1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // CAUTION: The original code below:
1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // bool result = ((value + 0x40000000) & 0x80000000) == 0;
1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // may lead to incorrect results according to the C language spec, and
1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // in fact doesn't work correctly with gcc4.1.1 in some cases: The
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // compiler may produce undefined results in case of signed integer
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // overflow. The computation must be done w/ unsigned ints.
10743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  bool result = (static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U);
1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(result == in_range);
1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromMap(Map* map) {
1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(map));
1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* MapWord::ToMap() {
1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Map*>(value_);
1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool MapWord::IsForwardingAddress() {
1092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_SMI_TAG(reinterpret_cast<Object*>(value_));
1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromForwardingAddress(HeapObject* object) {
1097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag;
1098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(raw));
1099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* MapWord::ToForwardingAddress() {
1103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(IsForwardingAddress());
1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HeapObject::FromAddress(reinterpret_cast<Address>(value_));
1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::VerifyObjectField(int offset) {
1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(READ_FIELD(this, offset));
1111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
11127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
11137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid HeapObject::VerifySmiField(int offset) {
11147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  ASSERT(READ_FIELD(this, offset)->IsSmi());
11157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
111944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockHeap* HeapObject::GetHeap() {
11203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Heap* heap =
11213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      MemoryChunk::FromAddress(reinterpret_cast<Address>(this))->heap();
11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(heap != NULL);
11233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(heap->isolate() == Isolate::Current());
11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return heap;
112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
112844f0eee88ff00398ff7f715fab053374d808c90dSteve BlockIsolate* HeapObject::GetIsolate() {
112944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return GetHeap()->isolate();
113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* HeapObject::map() {
1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map_word().ToMap();
1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map(Map* value) {
1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_map_word(MapWord::FromMap(value));
11403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (value != NULL) {
11413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // TODO(1600) We are passing NULL as a slot because maps can never be on
11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // evacuation candidate.
11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    value->GetHeap()->incremental_marking()->RecordWrite(this, NULL, value);
11443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
11453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
11463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
11483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Unsafe accessor omitting write barrier.
11493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HeapObject::set_map_no_write_barrier(Map* value) {
11503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_map_word(MapWord::FromMap(value));
1151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord HeapObject::map_word() {
1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset)));
1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map_word(MapWord map_word) {
11607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  // WRITE_FIELD does not invoke write barrier, but there is no need
1161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // here.
1162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* HeapObject::FromAddress(Address address) {
1167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_TAG_ALIGNED(address);
1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<HeapObject*>(address + kHeapObjectTag);
1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress HeapObject::address() {
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Address>(this) - kHeapObjectTag;
1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::Size() {
1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return SizeFromMap(map());
1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) {
1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)),
1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   reinterpret_cast<Object**>(FIELD_ADDR(this, end)));
1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::IteratePointer(ObjectVisitor* v, int offset) {
1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  v->VisitPointer(reinterpret_cast<Object**>(FIELD_ADDR(this, offset)));
1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdouble HeapNumber::value() {
11943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return READ_DOUBLE_FIELD(this, kValueOffset);
1195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HeapNumber::set_value(double value) {
11993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_DOUBLE_FIELD(this, kValueOffset, value);
1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint HeapNumber::get_exponent() {
12043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return ((READ_INT_FIELD(this, kExponentOffset) & kExponentMask) >>
12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          kExponentShift) - kExponentBias;
12066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
12076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
12086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint HeapNumber::get_sign() {
12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return READ_INT_FIELD(this, kExponentOffset) & kSignMask;
12116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
12126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
12136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
12153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochObject** FixedArray::GetFirstElementAddress() {
12183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0)));
1219c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
1220c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1221c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
12223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool FixedArray::ContainsOnlySmisOrHoles() {
12233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object* the_hole = GetHeap()->the_hole_value();
12243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object** current = GetFirstElementAddress();
12253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < length(); ++i) {
12263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Object* candidate = *current++;
12273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!candidate->IsSmi() && candidate != the_hole) return false;
12283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return true;
1230c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
1231c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1232c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
12333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFixedArrayBase* JSObject::elements() {
12343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object* array = READ_FIELD(this, kElementsOffset);
12353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return static_cast<FixedArrayBase*>(array);
1236592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1237592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
12383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::ValidateSmiOnlyElements() {
12393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#if DEBUG
12403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (map()->elements_kind() == FAST_SMI_ONLY_ELEMENTS) {
12413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Heap* heap = GetHeap();
12423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Don't use elements, since integrity checks will fail if there
12433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // are filler pointers in the array.
12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    FixedArray* fixed_array =
12453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        reinterpret_cast<FixedArray*>(READ_FIELD(this, kElementsOffset));
12463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Map* map = fixed_array->map();
12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // Arrays that have been shifted in place can't be verified.
12483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (map != heap->raw_unchecked_one_pointer_filler_map() &&
12493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        map != heap->raw_unchecked_two_pointer_filler_map() &&
12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        map != heap->free_space_map()) {
12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      for (int i = 0; i < fixed_array->length(); i++) {
12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        Object* current = fixed_array->get(i);
12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        ASSERT(current->IsSmi() || current->IsTheHole());
12543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
12563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
12583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1259592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
12603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSObject::EnsureCanContainHeapObjectElements() {
12623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#if DEBUG
12633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ValidateSmiOnlyElements();
12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
12653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if ((map()->elements_kind() != FAST_ELEMENTS)) {
12663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return TransitionElementsKind(FAST_ELEMENTS);
12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
1269592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1270592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1271592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSObject::EnsureCanContainElements(Object** objects,
12733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                uint32_t count,
12743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                EnsureElementsMode mode) {
12753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind current_kind = map()->elements_kind();
12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind target_kind = current_kind;
12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (current_kind == FAST_ELEMENTS) return this;
12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Heap* heap = GetHeap();
12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object* the_hole = heap->the_hole_value();
12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object* heap_number_map = heap->heap_number_map();
12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (uint32_t i = 0; i < count; ++i) {
12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Object* current = *objects++;
12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!current->IsSmi() && current != the_hole) {
12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS &&
12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          HeapObject::cast(current)->map() == heap_number_map) {
12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        target_kind = FAST_DOUBLE_ELEMENTS;
12893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      } else {
12903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        target_kind = FAST_ELEMENTS;
12913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        break;
12923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
12933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
12943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (target_kind != current_kind) {
12973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return TransitionElementsKind(target_kind);
12983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
12993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
1300592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1301592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1302592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
13033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSObject::EnsureCanContainElements(FixedArrayBase* elements,
13043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                EnsureElementsMode mode) {
13053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (elements->map() != GetHeap()->fixed_double_array_map()) {
13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(elements->map() == GetHeap()->fixed_array_map() ||
13073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           elements->map() == GetHeap()->fixed_cow_array_map());
13083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (mode == ALLOW_COPIED_DOUBLE_ELEMENTS) {
13093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      mode = DONT_ALLOW_DOUBLE_ELEMENTS;
13103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
13113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Object** objects = FixedArray::cast(elements)->GetFirstElementAddress();
13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return EnsureCanContainElements(objects, elements->length(), mode);
13133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(mode == ALLOW_COPIED_DOUBLE_ELEMENTS);
13163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (GetElementsKind() == FAST_SMI_ONLY_ELEMENTS) {
13173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return TransitionElementsKind(FAST_DOUBLE_ELEMENTS);
13183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
1321592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1322592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSObject::GetElementsTransitionMap(Isolate* isolate,
13253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                ElementsKind to_kind) {
13263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Map* current_map = map();
13273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind from_kind = current_map->elements_kind();
13285d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
13293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (from_kind == to_kind) return current_map;
13305d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
13313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Context* global_context = isolate->context()->global_context();
13323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (current_map == global_context->smi_js_array_map()) {
13333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (to_kind == FAST_ELEMENTS) {
13343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return global_context->object_js_array_map();
13353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
13363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (to_kind == FAST_DOUBLE_ELEMENTS) {
13373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return global_context->double_js_array_map();
13383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      } else {
13393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        ASSERT(to_kind == DICTIONARY_ELEMENTS);
13403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
13413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
13423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return GetElementsTransitionMapSlow(to_kind);
13445d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}
13455d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
13465d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
13473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::set_map_and_elements(Map* new_map,
13483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    FixedArrayBase* value,
13493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    WriteBarrierMode mode) {
13503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(value->HasValidElements());
13513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
13523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ValidateSmiOnlyElements();
13533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
13543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (new_map != NULL) {
13553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (mode == UPDATE_WRITE_BARRIER) {
13563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      set_map(new_map);
13573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    } else {
13583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ASSERT(mode == SKIP_WRITE_BARRIER);
13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      set_map_no_write_barrier(new_map);
13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT((map()->has_fast_elements() ||
13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          map()->has_fast_smi_only_elements() ||
13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          (value == GetHeap()->empty_fixed_array())) ==
136544f0eee88ff00398ff7f715fab053374d808c90dSteve Block         (value->map() == GetHeap()->fixed_array_map() ||
136644f0eee88ff00398ff7f715fab053374d808c90dSteve Block          value->map() == GetHeap()->fixed_cow_array_map()));
13673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT((value == GetHeap()->empty_fixed_array()) ||
13683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         (map()->has_fast_double_elements() == value->IsFixedDoubleArray()));
1369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kElementsOffset, value);
13703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
13713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) {
13753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_map_and_elements(NULL, value, mode);
1376c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
1377c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1378c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_properties() {
138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
138144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array());
1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_elements() {
13869413bcbe2192ed4d701281130490e0ba336debdcBen Murdoch  ASSERT(map()->has_fast_elements() ||
13879413bcbe2192ed4d701281130490e0ba336debdcBen Murdoch         map()->has_fast_smi_only_elements() ||
13889413bcbe2192ed4d701281130490e0ba336debdcBen Murdoch         map()->has_fast_double_elements());
138944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
139044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  WRITE_FIELD(this, kElementsOffset, GetHeap()->empty_fixed_array());
1391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13945913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* JSObject::ResetElements() {
13955913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  Object* obj;
13963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind elements_kind = FLAG_smi_only_arrays
13973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? FAST_SMI_ONLY_ELEMENTS
13983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : FAST_ELEMENTS;
13993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MaybeObject* maybe_obj = GetElementsTransitionMap(GetIsolate(),
14003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                    elements_kind);
14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!maybe_obj->ToObject(&obj)) return maybe_obj;
14028defd9ff6930b4e24729971a61cf7469daf119beSteve Block  set_map(Map::cast(obj));
14038defd9ff6930b4e24729971a61cf7469daf119beSteve Block  initialize_elements();
14048defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return this;
14058defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
14068defd9ff6930b4e24729971a61cf7469daf119beSteve Block
14078defd9ff6930b4e24729971a61cf7469daf119beSteve Block
1408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_string, String, kToStringOffset)
1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_number, Object, kToNumberOffset)
1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
141244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbyte Oddball::kind() {
14133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Smi::cast(READ_FIELD(this, kKindOffset))->value();
141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
141544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Oddball::set_kind(byte value) {
14183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_FIELD(this, kKindOffset, Smi::FromInt(value));
141944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
142044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
142144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSGlobalPropertyCell::value() {
1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kValueOffset);
1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) {
1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // The write barrier is not used for global property cells.
1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!val->IsJSGlobalPropertyCell());
1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kValueOffset, val);
1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSObject::GetHeaderSize() {
1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InstanceType type = map()->instance_type();
1436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check for the most common kind of JavaScript object before
1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // falling into the generic switch. This speeds up the internal
1438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // field operations considerably on average.
1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize;
1440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (type) {
1441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_PROXY_TYPE:
1442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSGlobalProxy::kSize;
1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_OBJECT_TYPE:
1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSGlobalObject::kSize;
1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_BUILTINS_OBJECT_TYPE:
1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSBuiltinsObject::kSize;
1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_FUNCTION_TYPE:
1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSFunction::kSize;
1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_VALUE_TYPE:
1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSValue::kSize;
14513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case JS_DATE_TYPE:
14523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return JSDate::kSize;
1453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_ARRAY_TYPE:
14543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return JSArray::kSize;
145569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case JS_WEAK_MAP_TYPE:
145669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return JSWeakMap::kSize;
1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_REGEXP_TYPE:
14583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return JSRegExp::kSize;
1459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSObject::kHeaderSize;
14611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case JS_MESSAGE_OBJECT_TYPE:
14621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      return JSMessageObject::kSize;
1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      UNREACHABLE();
1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return 0;
1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSObject::GetInternalFieldCount() {
1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(1 << kPointerSizeLog2 == kPointerSize);
1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make sure to adjust for the number of in-object properties. These
1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // properties do contribute to the size, but are not internal fields.
1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) -
1475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         map()->inobject_properties();
1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
147944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint JSObject::GetInternalFieldOffset(int index) {
148044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(index < GetInternalFieldCount() && index >= 0);
148144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return GetHeaderSize() + (kPointerSize * index);
148244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
148344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
148444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::GetInternalField(int index) {
1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index < GetInternalFieldCount() && index >= 0);
1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Internal objects do follow immediately after the header, whereas in-object
1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // properties are at the end of the object. Therefore there is no need
1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // to adjust the index here.
1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index));
1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SetInternalField(int index, Object* value) {
1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index < GetInternalFieldCount() && index >= 0);
1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Internal objects do follow immediately after the header, whereas in-object
1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // properties are at the end of the object. Therefore there is no need
1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // to adjust the index here.
1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = GetHeaderSize() + (kPointerSize * index);
1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BARRIER(GetHeap(), this, offset, value);
15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::SetInternalField(int index, Smi* value) {
15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(index < GetInternalFieldCount() && index >= 0);
15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Internal objects do follow immediately after the header, whereas in-object
15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // properties are at the end of the object. Therefore there is no need
15093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // to adjust the index here.
15103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int offset = GetHeaderSize() + (kPointerSize * index);
15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_FIELD(this, offset, value);
1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Access fast-case object properties at index. The use of these routines
1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is needed to correctly distinguish between properties stored in-object and
1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// properties stored in the properties array.
1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::FastPropertyAt(int index) {
1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  index -= map()->inobject_properties();
1521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (index < 0) {
1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offset = map()->instance_size() + (index * kPointerSize);
1523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return READ_FIELD(this, offset);
1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(index < properties()->length());
1526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return properties()->get(index);
1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::FastPropertyAtPut(int index, Object* value) {
1532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  index -= map()->inobject_properties();
1534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (index < 0) {
1535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int offset = map()->instance_size() + (index * kPointerSize);
1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);
15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    WRITE_BARRIER(GetHeap(), this, offset, value);
1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    ASSERT(index < properties()->length());
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    properties()->set(index, value);
1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return value;
1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
154644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint JSObject::GetInObjectPropertyOffset(int index) {
154744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Adjust for the number of properties stored in the object.
154844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  index -= map()->inobject_properties();
154944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(index < 0);
155044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return map()->instance_size() + (index * kPointerSize);
155144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
155244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
155344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAt(int index) {
1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  index -= map()->inobject_properties();
1557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index < 0);
1558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = map()->instance_size() + (index * kPointerSize);
1559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, offset);
1560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAtPut(int index,
1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Object* value,
1565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        WriteBarrierMode mode) {
1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  index -= map()->inobject_properties();
1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index < 0);
1569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = map()->instance_size() + (index * kPointerSize);
1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
15713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
1572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return value;
1573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::InitializeBody(Map* map,
15783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              Object* pre_allocated_value,
15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              Object* filler_value) {
15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(!filler_value->IsHeapObject() ||
15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         !GetHeap()->InNewSpace(filler_value));
15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(!pre_allocated_value->IsHeapObject() ||
15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         !GetHeap()->InNewSpace(pre_allocated_value));
15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int size = map->instance_size();
15853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int offset = kHeaderSize;
15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (filler_value != pre_allocated_value) {
15873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int pre_allocated = map->pre_allocated_property_fields();
15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(pre_allocated * kPointerSize + kHeaderSize <= size);
15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    for (int i = 0; i < pre_allocated; i++) {
15903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      WRITE_FIELD(this, offset, pre_allocated_value);
15913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      offset += kPointerSize;
15923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (offset < size) {
15953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    WRITE_FIELD(this, offset, filler_value);
15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    offset += kPointerSize;
1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16018defd9ff6930b4e24729971a61cf7469daf119beSteve Blockbool JSObject::HasFastProperties() {
16028defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return !properties()->IsDictionary();
16038defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
16048defd9ff6930b4e24729971a61cf7469daf119beSteve Block
16058defd9ff6930b4e24729971a61cf7469daf119beSteve Block
16068defd9ff6930b4e24729971a61cf7469daf119beSteve Blockint JSObject::MaxFastProperties() {
16078defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // Allow extra fast properties if the object has more than
16088defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // kMaxFastProperties in-object properties. When this is the case,
16098defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // it is very unlikely that the object is being used as a dictionary
16108defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // and there is a good chance that allowing more map transitions
16118defd9ff6930b4e24729971a61cf7469daf119beSteve Block  // will be worth it.
16128defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return Max(map()->inobject_properties(), kMaxFastProperties);
16138defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
16148defd9ff6930b4e24729971a61cf7469daf119beSteve Block
16158defd9ff6930b4e24729971a61cf7469daf119beSteve Block
1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Struct::InitializeBody(int object_size) {
161744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Object* value = GetHeap()->undefined_value();
1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
1619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);
1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16247f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool Object::ToArrayIndex(uint32_t* index) {
16257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsSmi()) {
16267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    int value = Smi::cast(this)->value();
1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (value < 0) return false;
1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    *index = value;
1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return true;
1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
16317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsHeapNumber()) {
16327f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    double value = HeapNumber::cast(this)->value();
1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    uint32_t uint_value = static_cast<uint32_t>(value);
1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (value == static_cast<double>(uint_value)) {
1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      *index = uint_value;
1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return true;
1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return false;
1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStringObjectWithCharacterAt(uint32_t index) {
1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!this->IsJSValue()) return false;
1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  JSValue* js_value = JSValue::cast(this);
1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!js_value->value()->IsString()) return false;
1648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  String* str = String::cast(js_value->value());
1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (index >= (uint32_t)str->length()) return false;
1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return true;
1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16563fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFixedArrayBase* FixedArrayBase::cast(Object* object) {
16573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray());
16583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return reinterpret_cast<FixedArrayBase*>(object);
16593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
16603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* FixedArray::get(int index) {
1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kHeaderSize + index * kPointerSize);
1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Smi* value) {
166944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(map() != HEAP->fixed_cow_array_map());
167069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT(index >= 0 && index < this->length());
1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = kHeaderSize + index * kPointerSize;
1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Object* value) {
167844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(map() != HEAP->fixed_cow_array_map());
1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = kHeaderSize + index * kPointerSize;
1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
16823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BARRIER(GetHeap(), this, offset, value);
1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline bool FixedDoubleArray::is_the_hole_nan(double value) {
16873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return BitCast<uint64_t, double>(value) == kHoleNanInt64;
16883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
16893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline double FixedDoubleArray::hole_nan_as_double() {
16923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return BitCast<double, uint64_t>(kHoleNanInt64);
16933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
16943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() {
16973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(BitCast<uint64_t>(OS::nan_value()) != kHoleNanInt64);
16983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT((BitCast<uint64_t>(OS::nan_value()) >> 32) != kHoleNanUpper32);
16993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return OS::nan_value();
17003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
170369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochdouble FixedDoubleArray::get_scalar(int index) {
17043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(map() != HEAP->fixed_cow_array_map() &&
17053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch         map() != HEAP->fixed_array_map());
17063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(index >= 0 && index < this->length());
17073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize);
17083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(!is_the_hole_nan(result));
17093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return result;
17103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint64_t FixedDoubleArray::get_representation(int index) {
17133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(map() != HEAP->fixed_cow_array_map() &&
17143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         map() != HEAP->fixed_array_map());
17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(index >= 0 && index < this->length());
17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize);
17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
171969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* FixedDoubleArray::get(int index) {
172069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (is_the_hole(index)) {
172169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return GetHeap()->the_hole_value();
172269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  } else {
172369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return GetHeap()->NumberFromDouble(get_scalar(index));
172469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
172569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
172669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
172769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
17283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid FixedDoubleArray::set(int index, double value) {
17293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(map() != HEAP->fixed_cow_array_map() &&
17303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch         map() != HEAP->fixed_array_map());
17313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int offset = kHeaderSize + index * kDoubleSize;
17323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (isnan(value)) value = canonical_not_the_hole_nan_as_double();
17333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  WRITE_DOUBLE_FIELD(this, offset, value);
17343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid FixedDoubleArray::set_the_hole(int index) {
17383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(map() != HEAP->fixed_cow_array_map() &&
17393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch         map() != HEAP->fixed_array_map());
17403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int offset = kHeaderSize + index * kDoubleSize;
17413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double());
17423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool FixedDoubleArray::is_the_hole(int index) {
17463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int offset = kHeaderSize + index * kDoubleSize;
17473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset));
17483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17514515c472dc3e5ed2448a564600976759e569a0a8Leon ClarkeWriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) {
17523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Heap* heap = GetHeap();
17533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
17543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
1755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return UPDATE_WRITE_BARRIER;
1756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index,
1760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     Object* value,
1761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                     WriteBarrierMode mode) {
176285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  ASSERT(map() != HEAP->fixed_cow_array_map());
176385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  ASSERT(index >= 0 && index < this->length());
1764c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  int offset = kHeaderSize + index * kPointerSize;
17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_FIELD(this, offset, value);
17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
17683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array,
17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                              int index,
17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                              Object* value) {
17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map());
17743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(index >= 0 && index < array->length());
17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int offset = kHeaderSize + index * kPointerSize;
17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_FIELD(array, offset, value);
17773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Heap* heap = array->GetHeap();
17783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (heap->InNewSpace(value)) {
17793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    heap->RecordWrite(array->address(), offset);
17803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1781c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
1782c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1783c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
17843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid FixedArray::NoWriteBarrierSet(FixedArray* array,
17853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                   int index,
17863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                   Object* value) {
178744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map());
1788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < array->length());
178944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!HEAP->InNewSpace(value));
1790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value);
1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_undefined(int index) {
179544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(map() != HEAP->fixed_cow_array_map());
179644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  set_undefined(GetHeap(), index);
179744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
179844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
179944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
180044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid FixedArray::set_undefined(Heap* heap, int index) {
1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
180244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!heap->InNewSpace(heap->undefined_value()));
1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kHeaderSize + index * kPointerSize,
180444f0eee88ff00398ff7f715fab053374d808c90dSteve Block              heap->undefined_value());
1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_null(int index) {
180944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  set_null(GetHeap(), index);
181044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
181144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
181244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
181344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid FixedArray::set_null(Heap* heap, int index) {
1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
181544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!heap->InNewSpace(heap->null_value()));
181644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_the_hole(int index) {
182144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(map() != HEAP->fixed_cow_array_map());
1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
182344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!HEAP->InNewSpace(HEAP->the_hole_value()));
182444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  WRITE_FIELD(this,
182544f0eee88ff00398ff7f715fab053374d808c90dSteve Block              kHeaderSize + index * kPointerSize,
182644f0eee88ff00398ff7f715fab053374d808c90dSteve Block              GetHeap()->the_hole_value());
1827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1830756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedArray::set_unchecked(int index, Smi* value) {
1831756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1832756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  int offset = kHeaderSize + index * kPointerSize;
1833756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  WRITE_FIELD(this, offset, value);
1834756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1835756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1836756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
183744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid FixedArray::set_unchecked(Heap* heap,
183844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                               int index,
1839f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch                               Object* value,
1840f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch                               WriteBarrierMode mode) {
1841f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  int offset = kHeaderSize + index * kPointerSize;
1842f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch  WRITE_FIELD(this, offset, value);
18433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode);
1844f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch}
1845f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
1846f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch
184744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid FixedArray::set_null_unchecked(Heap* heap, int index) {
1848756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  ASSERT(index >= 0 && index < this->length());
184944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!HEAP->InNewSpace(heap->null_value()));
185044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
1851756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1852756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1853756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
18546ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockObject** FixedArray::data_start() {
18556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return HeapObject::RawField(this, kHeaderSize);
18566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
18576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
18586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsEmpty() {
1860257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(this->IsSmi() ||
1861257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         this->length() > kFirstIndex ||
186244f0eee88ff00398ff7f715fab053374d808c90dSteve Block         this == HEAP->empty_descriptor_array());
1863257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return this->IsSmi() || length() <= kFirstIndex;
1864257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1865257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint DescriptorArray::bit_field3_storage() {
1868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Object* storage = READ_FIELD(this, kBitField3StorageOffset);
1869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return Smi::cast(storage)->value();
1870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid DescriptorArray::set_bit_field3_storage(int value) {
1873257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(!IsEmpty());
1874257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value));
1875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid DescriptorArray::NoIncrementalWriteBarrierSwap(FixedArray* array,
18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                    int first,
18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                    int second) {
1881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* tmp = array->get(first);
18823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NoIncrementalWriteBarrierSet(array, first, array->get(second));
18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NoIncrementalWriteBarrierSet(array, second, tmp);
1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint DescriptorArray::Search(String* name) {
1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  SLOW_ASSERT(IsSortedNoDuplicates());
1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check for empty descriptor array.
1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int nof = number_of_descriptors();
1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (nof == 0) return kNotFound;
1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Fast case: do linear search for small arrays.
1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const int kMaxElementsForLinearSearch = 8;
1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (StringShape(name).IsSymbol() && nof < kMaxElementsForLinearSearch) {
1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return LinearSearch(name, nof);
1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Slow case: perform binary search.
1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BinarySearch(name, 0, nof - 1);
1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1905756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint DescriptorArray::SearchWithCache(String* name) {
190644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int number = GetIsolate()->descriptor_lookup_cache()->Lookup(this, name);
1907756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  if (number == DescriptorLookupCache::kAbsent) {
1908756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    number = Search(name);
190944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    GetIsolate()->descriptor_lookup_cache()->Update(this, name, number);
1910756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  }
1911756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return number;
1912756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
1913756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1914756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
1915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* DescriptorArray::GetKey(int descriptor_number) {
1916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return String::cast(get(ToKeyIndex(descriptor_number)));
1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* DescriptorArray::GetValue(int descriptor_number) {
1922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetContentArray()->get(ToValueIndex(descriptor_number));
1924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* DescriptorArray::GetDetails(int descriptor_number) {
1928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Smi::cast(GetContentArray()->get(ToDetailsIndex(descriptor_number)));
1930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType DescriptorArray::GetType(int descriptor_number) {
1934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return PropertyDetails(GetDetails(descriptor_number)).type();
1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint DescriptorArray::GetFieldIndex(int descriptor_number) {
1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Descriptor::IndexFromValue(GetValue(descriptor_number));
1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSFunction* DescriptorArray::GetConstantFunction(int descriptor_number) {
1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return JSFunction::cast(GetValue(descriptor_number));
1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* DescriptorArray::GetCallbacksObject(int descriptor_number) {
1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(GetType(descriptor_number) == CALLBACKS);
1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetValue(descriptor_number);
1952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) {
1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(GetType(descriptor_number) == CALLBACKS);
1957257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number));
19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return reinterpret_cast<AccessorDescriptor*>(p->foreign_address());
1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsProperty(int descriptor_number) {
19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Entry entry(this, descriptor_number);
19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return IsPropertyDescriptor(&entry);
1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
19683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool DescriptorArray::IsTransitionOnly(int descriptor_number) {
19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  switch (GetType(descriptor_number)) {
19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case MAP_TRANSITION:
19713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case CONSTANT_TRANSITION:
19723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case ELEMENTS_TRANSITION:
19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return true;
19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case CALLBACKS: {
19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      Object* value = GetValue(descriptor_number);
19763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (!value->IsAccessorPair()) return false;
19773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      AccessorPair* accessors = AccessorPair::cast(value);
19783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return accessors->getter()->IsMap() && accessors->setter()->IsMap();
19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case NORMAL:
19813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case FIELD:
19823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case CONSTANT_FUNCTION:
19833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case HANDLER:
19843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case INTERCEPTOR:
19853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case NULL_DESCRIPTOR:
19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return false;
19873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
19883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  UNREACHABLE();  // Keep the compiler happy.
19893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return false;
1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsNullDescriptor(int descriptor_number) {
1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetType(descriptor_number) == NULL_DESCRIPTOR;
1995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsDontEnum(int descriptor_number) {
1999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return PropertyDetails(GetDetails(descriptor_number)).IsDontEnum();
2000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
2004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  desc->Init(GetKey(descriptor_number),
2005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             GetValue(descriptor_number),
20068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch             PropertyDetails(GetDetails(descriptor_number)));
2007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid DescriptorArray::Set(int descriptor_number,
20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                          Descriptor* desc,
20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                          const WhitenessWitness&) {
2013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Range check.
2014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(descriptor_number < number_of_descriptors());
2015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
20163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NoIncrementalWriteBarrierSet(this,
20173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ToKeyIndex(descriptor_number),
20183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               desc->GetKey());
20193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  FixedArray* content_array = GetContentArray();
20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NoIncrementalWriteBarrierSet(content_array,
20213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ToValueIndex(descriptor_number),
20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               desc->GetValue());
20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NoIncrementalWriteBarrierSet(content_array,
20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               ToDetailsIndex(descriptor_number),
20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                               desc->GetDetails().AsSmi());
20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
20273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
20293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid DescriptorArray::NoIncrementalWriteBarrierSwapDescriptors(
20303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    int first, int second) {
20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NoIncrementalWriteBarrierSwap(this, ToKeyIndex(first), ToKeyIndex(second));
2032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray* content_array = GetContentArray();
20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NoIncrementalWriteBarrierSwap(content_array,
20343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                ToValueIndex(first),
20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                ToValueIndex(second));
20363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  NoIncrementalWriteBarrierSwap(content_array,
20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                ToDetailsIndex(first),
20383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                ToDetailsIndex(second));
2039592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
2040592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2041592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
20423ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array)
20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    : marking_(array->GetHeap()->incremental_marking()) {
20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  marking_->EnterNoMarkingScope();
20453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (array->number_of_descriptors() > 0) {
20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT);
20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(Marking::Color(array->GetContentArray()) == Marking::WHITE_OBJECT);
20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2049592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
2050592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2051592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDescriptorArray::WhitenessWitness::~WhitenessWitness() {
20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  marking_->LeaveNoMarkingScope();
2054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
205744f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktemplate<typename Shape, typename Key>
205869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint HashTable<Shape, Key>::ComputeCapacity(int at_least_space_for) {
205969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  const int kMinCapacity = 32;
206069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  int capacity = RoundUpToPowerOf2(at_least_space_for * 2);
206169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (capacity < kMinCapacity) {
206269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    capacity = kMinCapacity;  // Guarantee min capacity.
206369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
206469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return capacity;
206569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
206669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
206769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
206869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochtemplate<typename Shape, typename Key>
206944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint HashTable<Shape, Key>::FindEntry(Key key) {
207044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return FindEntry(GetIsolate(), key);
207144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
207244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
207344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
207444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Find entry for key otherwise return kNotFound.
207544f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktemplate<typename Shape, typename Key>
207644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint HashTable<Shape, Key>::FindEntry(Isolate* isolate, Key key) {
207744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  uint32_t capacity = Capacity();
2078c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  uint32_t entry = FirstProbe(HashTable<Shape, Key>::Hash(key), capacity);
207944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  uint32_t count = 1;
208044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // EnsureCapacity will guarantee the hash table is never full.
208144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  while (true) {
208244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Object* element = KeyAt(entry);
2083c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    // Empty entry.
2084c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    if (element == isolate->heap()->raw_unchecked_undefined_value()) break;
20853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (element != isolate->heap()->raw_unchecked_the_hole_value() &&
208644f0eee88ff00398ff7f715fab053374d808c90dSteve Block        Shape::IsMatch(key, element)) return entry;
208744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    entry = NextProbe(entry, count++, capacity);
208844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
208944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return kNotFound;
209044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
209144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
209244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2093c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochbool SeededNumberDictionary::requires_slow_elements() {
2094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* max_index_object = get(kMaxNumberKeyIndex);
2095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!max_index_object->IsSmi()) return false;
2096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return 0 !=
2097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
2098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2100c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t SeededNumberDictionary::max_number_key() {
2101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!requires_slow_elements());
2102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* max_index_object = get(kMaxNumberKeyIndex);
2103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!max_index_object->IsSmi()) return 0;
2104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
2105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return value >> kRequiresSlowElementsTagSize;
2106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2108c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochvoid SeededNumberDictionary::set_requires_slow_elements() {
21094515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
2110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ------------------------------------
2114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Cast operations
2115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(FixedArray)
21183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochCAST_ACCESSOR(FixedDoubleArray)
2119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(DescriptorArray)
2120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochCAST_ACCESSOR(DeoptimizationInputData)
2121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochCAST_ACCESSOR(DeoptimizationOutputData)
21223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(TypeFeedbackCells)
2123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SymbolTable)
21246ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCAST_ACCESSOR(JSFunctionResultCache)
212580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian MonsenCAST_ACCESSOR(NormalizedMapCache)
21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(ScopeInfo)
2127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(CompilationCacheTable)
21286ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCAST_ACCESSOR(CodeCacheHashTable)
21293fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochCAST_ACCESSOR(PolymorphicCodeCacheHashTable)
2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(MapCache)
2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(String)
2132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqString)
2133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqAsciiString)
2134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqTwoByteString)
213569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochCAST_ACCESSOR(SlicedString)
2136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ConsString)
2137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalString)
2138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalAsciiString)
2139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalTwoByteString)
21403fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochCAST_ACCESSOR(JSReceiver)
2141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSObject)
2142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Smi)
2143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(HeapObject)
2144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(HeapNumber)
2145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Oddball)
2146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalPropertyCell)
2147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SharedFunctionInfo)
2148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Map)
2149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSFunction)
2150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(GlobalObject)
2151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalProxy)
2152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalObject)
2153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSBuiltinsObject)
2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Code)
2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSArray)
2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSRegExp)
2157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochCAST_ACCESSOR(JSProxy)
21583fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochCAST_ACCESSOR(JSFunctionProxy)
21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(JSSet)
21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(JSMap)
216169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochCAST_ACCESSOR(JSWeakMap)
2162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochCAST_ACCESSOR(Foreign)
2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ByteArray)
21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(FreeSpace)
21653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalArray)
21663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalByteArray)
21673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedByteArray)
21683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalShortArray)
21693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedShortArray)
21703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalIntArray)
21713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedIntArray)
21723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalFloatArray)
2173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochCAST_ACCESSOR(ExternalDoubleArray)
217444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockCAST_ACCESSOR(ExternalPixelArray)
2175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Struct)
2176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name)
2179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  STRUCT_LIST(MAKE_STRUCT_CAST)
2180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CAST
2181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename Shape, typename Key>
2184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) {
2185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(obj->IsHashTable());
2186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<HashTable*>(obj);
2187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
21903fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochSMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
21913ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(FreeSpace, size, kSizeOffset)
2192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
21936ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockSMI_ACCESSORS(String, length, kLengthOffset)
2194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2196d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockuint32_t String::hash_field() {
2197d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return READ_UINT32_FIELD(this, kHashFieldOffset);
2198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2201d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvoid String::set_hash_field(uint32_t value) {
2202d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  WRITE_UINT32_FIELD(this, kHashFieldOffset, value);
22037f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_64_BIT
22047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0);
22057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif
2206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2209d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockbool String::Equals(String* other) {
2210d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (other == this) return true;
2211d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (StringShape(this).IsSymbol() && StringShape(other).IsSymbol()) {
2212d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return false;
2213d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
2214d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return SlowEquals(other);
2215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
22185913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* String::TryFlatten(PretenureFlag pretenure) {
2219f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  if (!StringShape(this).IsCons()) return this;
2220f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke  ConsString* cons = ConsString::cast(this);
222169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (cons->IsFlat()) return cons->first();
22226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return SlowTryFlatten(pretenure);
2223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2226f7060e27768c550ace7ec48ad8c093466db52dfaLeon ClarkeString* String::TryFlattenGetString(PretenureFlag pretenure) {
22275913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  MaybeObject* flat = TryFlatten(pretenure);
22285913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  Object* successfully_flattened;
222969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!flat->ToObject(&successfully_flattened)) return this;
223069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return String::cast(successfully_flattened);
2231f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke}
2232f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
2233f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
2234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t String::Get(int index) {
2235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
2236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (StringShape(this).full_representation_tag()) {
2237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kSeqStringTag | kAsciiStringTag:
2238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return SeqAsciiString::cast(this)->SeqAsciiStringGet(index);
2239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kSeqStringTag | kTwoByteStringTag:
2240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
2241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kConsStringTag | kAsciiStringTag:
2242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kConsStringTag | kTwoByteStringTag:
2243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return ConsString::cast(this)->ConsStringGet(index);
2244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kExternalStringTag | kAsciiStringTag:
2245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
2246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kExternalStringTag | kTwoByteStringTag:
2247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
224869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case kSlicedStringTag | kAsciiStringTag:
224969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case kSlicedStringTag | kTwoByteStringTag:
225069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return SlicedString::cast(this)->SlicedStringGet(index);
2251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
2252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
2253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  UNREACHABLE();
2256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return 0;
2257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid String::Set(int index, uint16_t value) {
2261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
2262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(StringShape(this).IsSequential());
2263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this->IsAsciiRepresentation()
2265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      ? SeqAsciiString::cast(this)->SeqAsciiStringSet(index, value)
2266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value);
2267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsFlat() {
227169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!StringShape(this).IsCons()) return true;
227269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return ConsString::cast(this)->second()->length() == 0;
227369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
227469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
227569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
227669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochString* String::GetUnderlying() {
227769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Giving direct access to underlying string only makes sense if the
227869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // wrapping string is already flattened.
227969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT(this->IsFlat());
228069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT(StringShape(this).IsIndirect());
228169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset);
228269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  const int kUnderlyingOffset = SlicedString::kParentOffset;
228369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return String::cast(READ_FIELD(this, kUnderlyingOffset));
2284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqAsciiString::SeqAsciiStringGet(int index) {
2288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
2289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
2290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqAsciiString::SeqAsciiStringSet(int index, uint16_t value) {
2294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length() && value <= kMaxAsciiCharCode);
2295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize,
2296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   static_cast<byte>(value));
2297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqAsciiString::GetCharsAddress() {
2301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
2302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* SeqAsciiString::GetChars() {
2306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<char*>(GetCharsAddress());
2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqTwoByteString::GetCharsAddress() {
2311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
2312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc16* SeqTwoByteString::GetChars() {
2316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize));
2317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) {
2321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
2322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize);
2323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) {
2327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < length());
2328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value);
2329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) {
23336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return SizeFor(length());
2334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqAsciiString::SeqAsciiStringSize(InstanceType instance_type) {
23386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return SizeFor(length());
2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
234269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochString* SlicedString::parent() {
234369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return String::cast(READ_FIELD(this, kParentOffset));
234469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
234569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
234669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
234769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid SlicedString::set_parent(String* parent) {
23483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(parent->IsSeqString() || parent->IsExternalString());
234969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  WRITE_FIELD(this, kParentOffset, parent);
235069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
235169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
235269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
235369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochSMI_ACCESSORS(SlicedString, offset, kOffsetOffset)
235469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
235569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::first() {
2357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return String::cast(READ_FIELD(this, kFirstOffset));
2358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_first() {
2362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kFirstOffset);
2363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_first(String* value, WriteBarrierMode mode) {
2367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kFirstOffset, value);
23683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode);
2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::second() {
2373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return String::cast(READ_FIELD(this, kSecondOffset));
2374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_second() {
2378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kSecondOffset);
2379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_second(String* value, WriteBarrierMode mode) {
2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kSecondOffset, value);
23843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode);
23853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
23863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
23883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool ExternalString::is_short() {
23893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstanceType type = map()->instance_type();
23903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (type & kShortExternalStringMask) == kShortExternalStringTag;
2391592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
2392592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2393592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
23943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst ExternalAsciiString::Resource* ExternalAsciiString::resource() {
2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
23993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid ExternalAsciiString::update_data_cache() {
24003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (is_short()) return;
24013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const char** data_field =
24023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset));
24033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  *data_field = resource()->data();
24043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ExternalAsciiString::set_resource(
24083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    const ExternalAsciiString::Resource* resource) {
24093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  *reinterpret_cast<const Resource**>(
24103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      FIELD_ADDR(this, kResourceOffset)) = resource;
24113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (resource != NULL) update_data_cache();
24123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* ExternalAsciiString::GetChars() {
24163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return resource()->data();
2417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochuint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) {
24213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(index >= 0 && index < length());
24223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return GetChars()[index];
24233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst ExternalTwoByteString::Resource* ExternalTwoByteString::resource() {
2427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
2428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid ExternalTwoByteString::update_data_cache() {
24323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (is_short()) return;
24333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const uint16_t** data_field =
24343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset));
24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  *data_field = resource()->data();
24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ExternalTwoByteString::set_resource(
24403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    const ExternalTwoByteString::Resource* resource) {
24413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  *reinterpret_cast<const Resource**>(
24423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      FIELD_ADDR(this, kResourceOffset)) = resource;
24433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (resource != NULL) update_data_cache();
24443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint16_t* ExternalTwoByteString::GetChars() {
24483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return resource()->data();
24493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochuint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) {
24533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(index >= 0 && index < length());
24543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return GetChars()[index];
24553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData(
24593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      unsigned start) {
24603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return GetChars() + start;
2461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24646ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSFunctionResultCache::MakeZeroSize() {
2465b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  set_finger_index(kEntriesIndex);
2466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  set_size(kEntriesIndex);
24676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
24686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
24696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
24706ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSFunctionResultCache::Clear() {
2471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  int cache_size = size();
24726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex));
24733e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu  MemsetPointer(entries_start,
247444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                GetHeap()->the_hole_value(),
24753e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                cache_size - kEntriesIndex);
24766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  MakeZeroSize();
24776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
24786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
24796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint JSFunctionResultCache::size() {
2481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Smi::cast(get(kCacheSizeIndex))->value();
2482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid JSFunctionResultCache::set_size(int size) {
2486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  set(kCacheSizeIndex, Smi::FromInt(size));
2487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint JSFunctionResultCache::finger_index() {
2491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return Smi::cast(get(kFingerIndex))->value();
2492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2495b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid JSFunctionResultCache::set_finger_index(int finger_index) {
2496b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  set(kFingerIndex, Smi::FromInt(finger_index));
2497b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte ByteArray::get(int index) {
2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
2502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ByteArray::set(int index, byte value) {
2507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && index < this->length());
2508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
2509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint ByteArray::get_int(int index) {
2513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= 0 && (index * kIntSize) < this->length());
2514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_INT_FIELD(this, kHeaderSize + index * kIntSize);
2515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockByteArray* ByteArray::FromDataStartAddress(Address address) {
2519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_TAG_ALIGNED(address);
2520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
2521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress ByteArray::GetDataStartAddress() {
2525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
2526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
252944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockuint8_t* ExternalPixelArray::external_pixel_pointer() {
253044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return reinterpret_cast<uint8_t*>(external_pointer());
2531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
253469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint8_t ExternalPixelArray::get_scalar(int index) {
2535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((index >= 0) && (index < this->length()));
253644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  uint8_t* ptr = external_pixel_pointer();
2537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ptr[index];
2538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
254169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalPixelArray::get(int index) {
254269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return Smi::FromInt(static_cast<int>(get_scalar(index)));
254369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
254469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
254569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
254644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid ExternalPixelArray::set(int index, uint8_t value) {
2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT((index >= 0) && (index < this->length()));
254844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  uint8_t* ptr = external_pixel_pointer();
2549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ptr[index] = value;
2550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
25533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid* ExternalArray::external_pointer() {
25543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
25553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return reinterpret_cast<void*>(ptr);
25563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
25573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
25583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
25593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
25603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  intptr_t ptr = reinterpret_cast<intptr_t>(value);
25613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
25623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
25633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
25643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
256569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint8_t ExternalByteArray::get_scalar(int index) {
25663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
25673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int8_t* ptr = static_cast<int8_t*>(external_pointer());
25683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
25693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
25703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
25713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
257269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalByteArray::get(int index) {
257369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return Smi::FromInt(static_cast<int>(get_scalar(index)));
257469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
257569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
257669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
25773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalByteArray::set(int index, int8_t value) {
25783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
25793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int8_t* ptr = static_cast<int8_t*>(external_pointer());
25803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
25813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
25823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
25833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
258469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint8_t ExternalUnsignedByteArray::get_scalar(int index) {
25853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
25863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
25873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
25883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
25893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
25903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
259169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalUnsignedByteArray::get(int index) {
259269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return Smi::FromInt(static_cast<int>(get_scalar(index)));
259369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
259469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
259569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
25963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedByteArray::set(int index, uint8_t value) {
25973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
25983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
25993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
26003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
260369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint16_t ExternalShortArray::get_scalar(int index) {
26043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int16_t* ptr = static_cast<int16_t*>(external_pointer());
26063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
26073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
261069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalShortArray::get(int index) {
261169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return Smi::FromInt(static_cast<int>(get_scalar(index)));
261269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
261369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
261469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
26153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalShortArray::set(int index, int16_t value) {
26163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int16_t* ptr = static_cast<int16_t*>(external_pointer());
26183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
26193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
262269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint16_t ExternalUnsignedShortArray::get_scalar(int index) {
26233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
26253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
26263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
262969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalUnsignedShortArray::get(int index) {
263069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return Smi::FromInt(static_cast<int>(get_scalar(index)));
263169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
263269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
263369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
26343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedShortArray::set(int index, uint16_t value) {
26353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
26373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
26383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
264169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint32_t ExternalIntArray::get_scalar(int index) {
26423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int32_t* ptr = static_cast<int32_t*>(external_pointer());
26443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
26453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
264869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalIntArray::get(int index) {
264969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return GetHeap()->NumberFromInt32(get_scalar(index));
265069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
265169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
265269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
26533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalIntArray::set(int index, int32_t value) {
26543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  int32_t* ptr = static_cast<int32_t*>(external_pointer());
26563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
26573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
266069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint32_t ExternalUnsignedIntArray::get_scalar(int index) {
26613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
26633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
26643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
266769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalUnsignedIntArray::get(int index) {
266869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return GetHeap()->NumberFromUint32(get_scalar(index));
266969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
267069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
267169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
26723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedIntArray::set(int index, uint32_t value) {
26733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
26753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
26763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
267969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfloat ExternalFloatArray::get_scalar(int index) {
26803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  float* ptr = static_cast<float*>(external_pointer());
26823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return ptr[index];
26833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
268669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalFloatArray::get(int index) {
268769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return GetHeap()->NumberFromDouble(get_scalar(index));
268869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
268969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
269069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
26913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalFloatArray::set(int index, float value) {
26923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ASSERT((index >= 0) && (index < this->length()));
26933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  float* ptr = static_cast<float*>(external_pointer());
26943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  ptr[index] = value;
26953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
26963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
26973bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
269869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochdouble ExternalDoubleArray::get_scalar(int index) {
2699257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT((index >= 0) && (index < this->length()));
2700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  double* ptr = static_cast<double*>(external_pointer());
2701257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return ptr[index];
2702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
270569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalDoubleArray::get(int index) {
270669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return GetHeap()->NumberFromDouble(get_scalar(index));
270769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
270869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
270969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid ExternalDoubleArray::set(int index, double value) {
2711257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT((index >= 0) && (index < this->length()));
2712257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  double* ptr = static_cast<double*>(external_pointer());
2713257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ptr[index] = value;
2714257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2716257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
27179ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickint Map::visitor_id() {
27189ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick  return READ_BYTE_FIELD(this, kVisitorIdOffset);
27199ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick}
27209ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
27219ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
27229ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickvoid Map::set_visitor_id(int id) {
27239ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick  ASSERT(0 <= id && id < 256);
27249ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick  WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id));
27259ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick}
27269ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
27273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
2728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::instance_size() {
2729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2;
2730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::inobject_properties() {
2734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kInObjectPropertiesOffset);
2735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::pre_allocated_property_fields() {
2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset);
2740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::SizeFromMap(Map* map) {
2744791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  int instance_size = map->instance_size();
2745791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  if (instance_size != kVariableSizeSentinel) return instance_size;
2746791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  // We can ignore the "symbol" bit becase it is only set for symbols
2747791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  // and implies a string type.
2748791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  int instance_type = static_cast<int>(map->instance_type()) & ~kIsSymbolMask;
2749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Only inline the most frequent cases.
2750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (instance_type == FIXED_ARRAY_TYPE) {
2751756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    return FixedArray::BodyDescriptor::SizeOf(map, this);
2752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2753791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  if (instance_type == ASCII_STRING_TYPE) {
2754791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block    return SeqAsciiString::SizeFor(
2755791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block        reinterpret_cast<SeqAsciiString*>(this)->length());
2756791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  }
2757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (instance_type == BYTE_ARRAY_TYPE) {
2758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return reinterpret_cast<ByteArray*>(this)->ByteArraySize();
2759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
27603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instance_type == FREE_SPACE_TYPE) {
27613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return reinterpret_cast<FreeSpace*>(this)->size();
27623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2763791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  if (instance_type == STRING_TYPE) {
2764791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block    return SeqTwoByteString::SizeFor(
2765791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block        reinterpret_cast<SeqTwoByteString*>(this)->length());
2766791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  }
27673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
27683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return FixedDoubleArray::SizeFor(
27693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        reinterpret_cast<FixedDoubleArray*>(this)->length());
27703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
2771791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  ASSERT(instance_type == CODE_TYPE);
2772791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return reinterpret_cast<Code*>(this)->CodeSize();
2773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_size(int value) {
2777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT_EQ(0, value & (kPointerSize - 1));
2778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value >>= kPointerSizeLog2;
2779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= value && value < 256);
2780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value));
2781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_inobject_properties(int value) {
2785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= value && value < 256);
2786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value));
2787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_pre_allocated_property_fields(int value) {
2791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= value && value < 256);
2792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this,
2793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   kPreAllocatedPropertyFieldsOffset,
2794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   static_cast<byte>(value));
2795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInstanceType Map::instance_type() {
2799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
2800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_type(InstanceType value) {
2804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
2805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::unused_property_fields() {
2809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset);
2810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_unused_property_fields(int value) {
2814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255));
2815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte Map::bit_field() {
2819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kBitFieldOffset);
2820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field(byte value) {
2824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kBitFieldOffset, value);
2825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte Map::bit_field2() {
2829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kBitField2Offset);
2830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field2(byte value) {
2834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kBitField2Offset, value);
2835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_non_instance_prototype(bool value) {
2839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (value) {
2840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_bit_field(bit_field() | (1 << kHasNonInstancePrototype));
2841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype));
2843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Map::has_non_instance_prototype() {
2848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((1 << kHasNonInstancePrototype) & bit_field()) != 0;
2849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28526ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Map::set_function_with_prototype(bool value) {
28536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (value) {
28546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    set_bit_field2(bit_field2() | (1 << kFunctionWithPrototype));
28556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  } else {
28566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    set_bit_field2(bit_field2() & ~(1 << kFunctionWithPrototype));
28576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
28586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
28596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
28606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
28616ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Map::function_with_prototype() {
28626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return ((1 << kFunctionWithPrototype) & bit_field2()) != 0;
28636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
28646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
28656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_is_access_check_needed(bool access_check_needed) {
2867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (access_check_needed) {
2868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded));
2869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded));
2871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Map::is_access_check_needed() {
2876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0;
2877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28808defd9ff6930b4e24729971a61cf7469daf119beSteve Blockvoid Map::set_is_extensible(bool value) {
28818defd9ff6930b4e24729971a61cf7469daf119beSteve Block  if (value) {
28828defd9ff6930b4e24729971a61cf7469daf119beSteve Block    set_bit_field2(bit_field2() | (1 << kIsExtensible));
28838defd9ff6930b4e24729971a61cf7469daf119beSteve Block  } else {
28848defd9ff6930b4e24729971a61cf7469daf119beSteve Block    set_bit_field2(bit_field2() & ~(1 << kIsExtensible));
28858defd9ff6930b4e24729971a61cf7469daf119beSteve Block  }
28868defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
28878defd9ff6930b4e24729971a61cf7469daf119beSteve Block
28888defd9ff6930b4e24729971a61cf7469daf119beSteve Blockbool Map::is_extensible() {
28898defd9ff6930b4e24729971a61cf7469daf119beSteve Block  return ((1 << kIsExtensible) & bit_field2()) != 0;
28908defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
28918defd9ff6930b4e24729971a61cf7469daf119beSteve Block
28928defd9ff6930b4e24729971a61cf7469daf119beSteve Block
28930d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Map::set_attached_to_shared_function_info(bool value) {
28940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  if (value) {
28950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    set_bit_field2(bit_field2() | (1 << kAttachedToSharedFunctionInfo));
28960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  } else {
28970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    set_bit_field2(bit_field2() & ~(1 << kAttachedToSharedFunctionInfo));
28980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
28990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
29000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
29010d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool Map::attached_to_shared_function_info() {
29020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return ((1 << kAttachedToSharedFunctionInfo) & bit_field2()) != 0;
29030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
29040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
29050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
29060d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Map::set_is_shared(bool value) {
29070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  if (value) {
2908257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_bit_field3(bit_field3() | (1 << kIsShared));
29090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  } else {
2910257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    set_bit_field3(bit_field3() & ~(1 << kIsShared));
29110d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
29120d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
29130d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
29140d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool Map::is_shared() {
2915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return ((1 << kIsShared) & bit_field3()) != 0;
29160d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
29170d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
29180d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
29190d5e116f6aee03185f237311a943491bb079a768Kristian MonsenJSFunction* Map::unchecked_constructor() {
29200d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return reinterpret_cast<JSFunction*>(READ_FIELD(this, kConstructorOffset));
29210d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
29220d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
29238defd9ff6930b4e24729971a61cf7469daf119beSteve Block
2924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::flags() {
2925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
2926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Code::set_flags(Code::Flags flags) {
2930589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
2931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Make sure that all call stubs have an arguments count.
29327f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  ASSERT((ExtractKindFromFlags(flags) != CALL_IC &&
29337f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch          ExtractKindFromFlags(flags) != KEYED_CALL_IC) ||
2934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         ExtractArgumentsCountFromFlags(flags) >= 0);
2935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_INT_FIELD(this, kFlagsOffset, flags);
2936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::kind() {
2940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ExtractKindFromFlags(flags());
2941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInlineCacheState Code::ic_state() {
2945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  InlineCacheState result = ExtractICStateFromFlags(flags());
2946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Only allow uninitialized or debugger states for non-IC code
2947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // objects. This is used in the debugger to determine whether or not
2948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // a call to code object has been replaced with a debug break call.
2949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(is_inline_cache_stub() ||
2950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         result == UNINITIALIZED ||
2951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         result == DEBUG_BREAK ||
2952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         result == DEBUG_PREPARE_STEP_IN);
2953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
2954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochCode::ExtraICState Code::extra_ic_state() {
2958b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(is_inline_cache_stub());
2959b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return ExtractExtraICStateFromFlags(flags());
2960b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
2961b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
2963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType Code::type() {
2964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ExtractTypeFromFlags(flags());
2965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::arguments_count() {
29697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB);
2970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ExtractArgumentsCountFromFlags(flags());
2971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
297480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenint Code::major_key() {
2975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == STUB ||
2976257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         kind() == UNARY_OP_IC ||
2977257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         kind() == BINARY_OP_IC ||
297869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch         kind() == COMPARE_IC ||
297969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch         kind() == TO_BOOLEAN_IC);
298080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen  return READ_BYTE_FIELD(this, kStubMajorKeyOffset);
2981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
298480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid Code::set_major_key(int major) {
2985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == STUB ||
2986257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         kind() == UNARY_OP_IC ||
2987257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch         kind() == BINARY_OP_IC ||
298869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch         kind() == COMPARE_IC ||
298969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch         kind() == TO_BOOLEAN_IC);
2990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(0 <= major && major < 256);
2991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kStubMajorKeyOffset, major);
2992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
29953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::is_pregenerated() {
29963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return kind() == STUB && IsPregeneratedField::decode(flags());
29973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
29983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
29993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::set_is_pregenerated(bool value) {
30013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(kind() == STUB);
30023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Flags f = flags();
30033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  f = static_cast<Flags>(IsPregeneratedField::update(f, value));
30043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_flags(f);
30053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
30063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Code::optimizable() {
3009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == FUNCTION);
3010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return READ_BYTE_FIELD(this, kOptimizableOffset) == 1;
3011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_optimizable(bool value) {
3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == FUNCTION);
3016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0);
3017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Code::has_deoptimization_support() {
3021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == FUNCTION);
3022589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3023589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return FullCodeFlagsHasDeoptimizationSupportField::decode(flags);
3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_has_deoptimization_support(bool value) {
3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == FUNCTION);
3029589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3030589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value);
3031589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
3032589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
3033589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
3034589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
3035589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochbool Code::has_debug_break_slots() {
3036589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ASSERT(kind() == FUNCTION);
3037589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3038589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return FullCodeFlagsHasDebugBreakSlotsField::decode(flags);
3039589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
3040589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
3041589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
3042589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid Code::set_has_debug_break_slots(bool value) {
3043589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ASSERT(kind() == FUNCTION);
3044589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3045589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  flags = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value);
3046589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::is_compiled_optimizable() {
30513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(kind() == FUNCTION);
30523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
30533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return FullCodeFlagsIsCompiledOptimizable::decode(flags);
30543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
30553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::set_compiled_optimizable(bool value) {
30583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(kind() == FUNCTION);
30593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
30603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value);
30613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
30623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
30633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::has_self_optimization_header() {
30663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(kind() == FUNCTION);
30673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
30683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return FullCodeFlagsHasSelfOptimizationHeader::decode(flags);
30693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
30703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::set_self_optimization_header(bool value) {
30733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(kind() == FUNCTION);
30743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
30753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  flags = FullCodeFlagsHasSelfOptimizationHeader::update(flags, value);
30763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
30773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
30783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
30793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochint Code::allow_osr_at_loop_nesting_level() {
3081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == FUNCTION);
3082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return READ_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset);
3083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_allow_osr_at_loop_nesting_level(int level) {
3087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == FUNCTION);
3088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(level >= 0 && level <= kMaxLoopNestingMarker);
3089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  WRITE_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset, level);
3090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30938f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdochint Code::profiler_ticks() {
30948f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch  ASSERT(kind() == FUNCTION);
30958f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch  return READ_BYTE_FIELD(this, kProfilerTicksOffset);
30968f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch}
30978f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
30988f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
30998f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdochvoid Code::set_profiler_ticks(int ticks) {
31008f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch  ASSERT(kind() == FUNCTION);
31018f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch  ASSERT(ticks < 256);
31028f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch  WRITE_BYTE_FIELD(this, kProfilerTicksOffset, ticks);
31038f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch}
31048f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
31058f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
3106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochunsigned Code::stack_slots() {
3107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == OPTIMIZED_FUNCTION);
3108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return READ_UINT32_FIELD(this, kStackSlotsOffset);
3109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_stack_slots(unsigned slots) {
3113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == OPTIMIZED_FUNCTION);
3114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  WRITE_UINT32_FIELD(this, kStackSlotsOffset, slots);
3115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockunsigned Code::safepoint_table_offset() {
3119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == OPTIMIZED_FUNCTION);
31201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return READ_UINT32_FIELD(this, kSafepointTableOffsetOffset);
3121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Code::set_safepoint_table_offset(unsigned offset) {
3125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == OPTIMIZED_FUNCTION);
3126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
31271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  WRITE_UINT32_FIELD(this, kSafepointTableOffsetOffset, offset);
3128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockunsigned Code::stack_check_table_offset() {
3132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == FUNCTION);
31331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return READ_UINT32_FIELD(this, kStackCheckTableOffsetOffset);
3134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Code::set_stack_check_table_offset(unsigned offset) {
3138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(kind() == FUNCTION);
3139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
31401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  WRITE_UINT32_FIELD(this, kStackCheckTableOffsetOffset, offset);
3141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochCheckType Code::check_type() {
3145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(is_call_stub() || is_keyed_call_stub());
3146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  byte type = READ_BYTE_FIELD(this, kCheckTypeOffset);
3147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return static_cast<CheckType>(type);
3148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_check_type(CheckType value) {
3152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(is_call_stub() || is_keyed_call_stub());
3153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  WRITE_BYTE_FIELD(this, kCheckTypeOffset, value);
3154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbyte Code::unary_op_type() {
3158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(is_unary_op_stub());
3159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return READ_BYTE_FIELD(this, kUnaryOpTypeOffset);
3160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Code::set_unary_op_type(byte value) {
3164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(is_unary_op_stub());
3165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  WRITE_BYTE_FIELD(this, kUnaryOpTypeOffset, value);
3166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbyte Code::binary_op_type() {
3170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(is_binary_op_stub());
3171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return READ_BYTE_FIELD(this, kBinaryOpTypeOffset);
3172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Code::set_binary_op_type(byte value) {
3176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(is_binary_op_stub());
3177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value);
3178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbyte Code::binary_op_result_type() {
3182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(is_binary_op_stub());
3183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return READ_BYTE_FIELD(this, kBinaryOpReturnTypeOffset);
3184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Code::set_binary_op_result_type(byte value) {
3188257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(is_binary_op_stub());
3189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  WRITE_BYTE_FIELD(this, kBinaryOpReturnTypeOffset, value);
3190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbyte Code::compare_state() {
3194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(is_compare_ic_stub());
3195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return READ_BYTE_FIELD(this, kCompareStateOffset);
3196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_compare_state(byte value) {
3200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(is_compare_ic_stub());
3201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  WRITE_BYTE_FIELD(this, kCompareStateOffset, value);
3202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
320569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbyte Code::to_boolean_state() {
320669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT(is_to_boolean_ic_stub());
320769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return READ_BYTE_FIELD(this, kToBooleanTypeOffset);
320869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
320969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
321069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
321169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Code::set_to_boolean_state(byte value) {
321269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  ASSERT(is_to_boolean_ic_stub());
321369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  WRITE_BYTE_FIELD(this, kToBooleanTypeOffset, value);
321469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
321569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
32163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
32173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::has_function_cache() {
32183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(kind() == STUB);
32193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return READ_BYTE_FIELD(this, kHasFunctionCacheOffset) != 0;
32203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
32213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
32223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
32233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::set_has_function_cache(bool flag) {
32243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(kind() == STUB);
32253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BYTE_FIELD(this, kHasFunctionCacheOffset, flag);
32263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
32273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
32283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Code::is_inline_cache_stub() {
3230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Kind kind = this->kind();
3231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND;
3232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::ComputeFlags(Kind kind,
3236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                               InlineCacheState ic_state,
3237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                               ExtraICState extra_ic_state,
3238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                               PropertyType type,
32398defd9ff6930b4e24729971a61cf7469daf119beSteve Block                               int argc,
32408defd9ff6930b4e24729971a61cf7469daf119beSteve Block                               InlineCacheHolderFlag holder) {
3241257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Extra IC state is only allowed for call IC stubs or for store IC
3242257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // stubs.
3243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(extra_ic_state == kNoExtraICState ||
3244589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch         kind == CALL_IC ||
3245589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch         kind == STORE_IC ||
3246589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch         kind == KEYED_STORE_IC);
3247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Compute the bit mask.
3248589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  int bits = KindField::encode(kind)
3249589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      | ICStateField::encode(ic_state)
3250589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      | TypeField::encode(type)
3251589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      | ExtraICStateField::encode(extra_ic_state)
3252589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      | (argc << kArgumentsCountShift)
3253589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      | CacheHolderField::encode(holder);
3254589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return static_cast<Flags>(bits);
3255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::ComputeMonomorphicFlags(Kind kind,
3259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                          PropertyType type,
3260b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch                                          ExtraICState extra_ic_state,
32618defd9ff6930b4e24729971a61cf7469daf119beSteve Block                                          InlineCacheHolderFlag holder,
3262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                          int argc) {
3263589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder);
3264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::ExtractKindFromFlags(Flags flags) {
3268589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return KindField::decode(flags);
3269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
3273589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return ICStateField::decode(flags);
3274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3277b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochCode::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
3278589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return ExtraICStateField::decode(flags);
3279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType Code::ExtractTypeFromFlags(Flags flags) {
3283589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return TypeField::decode(flags);
3284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::ExtractArgumentsCountFromFlags(Flags flags) {
3288589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return (flags & kArgumentsCountMask) >> kArgumentsCountShift;
3289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32928defd9ff6930b4e24729971a61cf7469daf119beSteve BlockInlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
3293589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return CacheHolderField::decode(flags);
32948defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
32958defd9ff6930b4e24729971a61cf7469daf119beSteve Block
32968defd9ff6930b4e24729971a61cf7469daf119beSteve Block
3297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::RemoveTypeFromFlags(Flags flags) {
3298589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  int bits = flags & ~TypeField::kMask;
3299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<Flags>(bits);
3300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* Code::GetCodeFromTargetAddress(Address address) {
3304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
3305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // GetCodeFromTargetAddress might be called when marking objects during mark
3306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // sweep. reinterpret_cast is therefore used instead of the more appropriate
3307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Code::cast. Code::cast does not work when the object's map is
3308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // marked.
3309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Code* result = reinterpret_cast<Code*>(code);
3310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
3311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3314791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve BlockObject* Code::GetObjectFromEntryAddress(Address location_of_address) {
3315791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return HeapObject::
3316791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block      FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize);
3317791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block}
3318791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block
3319791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block
3320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Map::prototype() {
3321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kPrototypeOffset);
3322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_prototype(Object* value, WriteBarrierMode mode) {
33263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ASSERT(value->IsNull() || value->IsJSReceiver());
3327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kPrototypeOffset, value);
33283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode);
33291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
33301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
33311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
3332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochDescriptorArray* Map::instance_descriptors() {
3333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
3334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (object->IsSmi()) {
33353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return GetHeap()->empty_descriptor_array();
3336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
3337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return DescriptorArray::cast(object);
3338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Map::init_instance_descriptors() {
3343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, Smi::FromInt(0));
3344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3345257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3346257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Map::clear_instance_descriptors() {
3348257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Object* object = READ_FIELD(this,
3349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                              kInstanceDescriptorsOrBitField3Offset);
3350257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (!object->IsSmi()) {
3351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    WRITE_FIELD(
3352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        this,
3353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        kInstanceDescriptorsOrBitField3Offset,
3354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        Smi::FromInt(DescriptorArray::cast(object)->bit_field3_storage()));
3355257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3356257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3358257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3359257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Map::set_instance_descriptors(DescriptorArray* value,
3360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                   WriteBarrierMode mode) {
3361257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Object* object = READ_FIELD(this,
3362257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                              kInstanceDescriptorsOrBitField3Offset);
33633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Heap* heap = GetHeap();
33643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (value == heap->empty_descriptor_array()) {
3365257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    clear_instance_descriptors();
3366257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return;
3367257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
3368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (object->IsSmi()) {
3369257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      value->set_bit_field3_storage(Smi::cast(object)->value());
3370257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    } else {
3371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      value->set_bit_field3_storage(
3372257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          DescriptorArray::cast(object)->bit_field3_storage());
3373257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
3374257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3375257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(!is_shared());
3376257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value);
33773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(
33783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode);
3379257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3381257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3382257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Map::bit_field3() {
3383257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Object* object = READ_FIELD(this,
3384257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                              kInstanceDescriptorsOrBitField3Offset);
3385257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (object->IsSmi()) {
3386257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return Smi::cast(object)->value();
3387257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
3388257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    return DescriptorArray::cast(object)->bit_field3_storage();
3389257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Map::set_bit_field3(int value) {
3394257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(Smi::IsValid(value));
3395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Object* object = READ_FIELD(this,
3396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                              kInstanceDescriptorsOrBitField3Offset);
3397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (object->IsSmi()) {
3398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    WRITE_FIELD(this,
3399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                kInstanceDescriptorsOrBitField3Offset,
3400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                Smi::FromInt(value));
3401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
3402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    DescriptorArray::cast(object)->set_bit_field3_storage(value);
3403257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
3404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
3405257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
3406257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
34073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFixedArray* Map::unchecked_prototype_transitions() {
34083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return reinterpret_cast<FixedArray*>(
34093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      READ_FIELD(this, kPrototypeTransitionsOffset));
34103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
34113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
34123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
34136ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
3414053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve BlockACCESSORS(Map, prototype_transitions, FixedArray, kPrototypeTransitionsOffset)
3415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Map, constructor, Object, kConstructorOffset)
3416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
34183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSFunction, literals_or_bindings, FixedArray, kLiteralsOffset)
34193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSFunction,
34203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          next_function_link,
34213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          Object,
34223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          kNextFunctionLinkOffset)
3423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset)
3425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset)
3426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, global_receiver, JSObject, kGlobalReceiverOffset)
3427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSGlobalProxy, context, Object, kContextOffset)
3429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, getter, Object, kGetterOffset)
3431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, setter, Object, kSetterOffset)
3432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, data, Object, kDataOffset)
3433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, name, Object, kNameOffset)
34343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(AccessorInfo, flag, kFlagOffset)
34353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
34363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(AccessorPair, getter, Object, kGetterOffset)
34373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(AccessorPair, setter, Object, kSetterOffset)
3438c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
3439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, named_callback, Object, kNamedCallbackOffset)
3440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, indexed_callback, Object, kIndexedCallbackOffset)
3441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
3442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
3444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
3445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
3446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
3447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
3448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, data, Object, kDataOffset)
3449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
3451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
3452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, tag, Object, kTagOffset)
3454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
3455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, serial_number, Object, kSerialNumberOffset)
3457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
3458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, property_accessors, Object,
3459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kPropertyAccessorsOffset)
3460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, prototype_template, Object,
3461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kPrototypeTemplateOffset)
3462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset)
3463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, named_property_handler, Object,
3464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kNamedPropertyHandlerOffset)
3465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object,
3466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kIndexedPropertyHandlerOffset)
3467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_template, Object,
3468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceTemplateOffset)
3469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
3470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
3471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_call_handler, Object,
3472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceCallHandlerOffset)
3473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, access_check_info, Object,
3474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kAccessCheckInfoOffset)
34753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(FunctionTemplateInfo, flag, kFlagOffset)
3476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
3478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, internal_field_count, Object,
3479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInternalFieldCountOffset)
3480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset)
3482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SignatureInfo, args, Object, kArgsOffset)
3483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TypeSwitchInfo, types, Object, kTypesOffset)
3485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, source, Object, kSourceOffset)
3487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, name, Object, kNameOffset)
3488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, id, Object, kIdOffset)
34893ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, line_offset, kLineOffsetOffset)
34903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, column_offset, kColumnOffsetOffset)
3491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, data, Object, kDataOffset)
3492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, context_data, Object, kContextOffset)
3493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochACCESSORS(Script, wrapper, Foreign, kWrapperOffset)
34943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, type, kTypeOffset)
34953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, compilation_type, kCompilationTypeOffset)
34963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, compilation_state, kCompilationStateOffset)
3497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, line_ends, Object, kLineEndsOffset)
3498d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockACCESSORS(Script, eval_from_shared, Object, kEvalFromSharedOffset)
34993ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, eval_from_instructions_offset,
35003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                 kEvalFrominstructionsOffsetOffset)
3501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT
3503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex)
3504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex)
3505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, code, Code, kPatchedCodeIndex)
3506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex)
3507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(BreakPointInfo, code_position, kCodePositionIndex)
35093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(BreakPointInfo, source_position, kSourcePositionIndex)
35103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(BreakPointInfo, statement_position, kStatementPositionIndex)
3511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex)
3512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
3513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, name, Object, kNameOffset)
35153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset)
35163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(SharedFunctionInfo, initial_map, Object, kInitialMapOffset)
3517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, instance_class_name, Object,
3518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceClassNameOffset)
35196ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset)
3520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset)
3521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
3522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset)
3523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, this_property_assignments, Object,
3524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kThisPropertyAssignmentsOffset)
35258f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben MurdochSMI_ACCESSORS(SharedFunctionInfo, ic_age, kICAgeOffset)
3526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
3529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kHiddenPrototypeBit)
3530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
3531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
3532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kNeedsAccessCheckBit)
353369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochBOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
353469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch               kReadOnlyPrototypeBit)
3535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression,
3536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kIsExpressionBit)
3537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
3538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kIsTopLevelBit)
35393fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_GETTER(SharedFunctionInfo,
35403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            compiler_hints,
3541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            has_only_simple_this_property_assignments,
3542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block            kHasOnlySimpleThisPropertyAssignments)
3543d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockBOOL_ACCESSORS(SharedFunctionInfo,
3544d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block               compiler_hints,
35457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch               allows_lazy_compilation,
35467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch               kAllowLazyCompilation)
35473fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo,
35483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               compiler_hints,
35493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               uses_arguments,
35503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               kUsesArguments)
35513fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo,
35523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               compiler_hints,
35533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               has_duplicate_parameters,
35543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               kHasDuplicateParameters)
3555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3556756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
35577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_32_BIT
35587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
35597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
3560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kFormalParameterCountOffset)
35617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
3562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kExpectedNofPropertiesOffset)
35637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
35647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
3565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kStartPositionAndTypeOffset)
35667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
35677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, function_token_position,
3568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kFunctionTokenPositionOffset)
35697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
3570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kCompilerHintsOffset)
35717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
3572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kThisPropertyAssignmentsCountOffset)
3573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochSMI_ACCESSORS(SharedFunctionInfo, opt_count, kOptCountOffset)
35743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
35753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(SharedFunctionInfo, deopt_counter, kDeoptCounterOffset)
35767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#else
35777f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
35787f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset)             \
35793e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu  STATIC_ASSERT(holder::offset % kPointerSize == 0);              \
35807f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  int holder::name() {                                            \
35817f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    int value = READ_INT_FIELD(this, offset);                     \
35827f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT(kHeapObjectTag == 1);                                  \
35837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT((value & kHeapObjectTag) == 0);                        \
35847f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    return value >> 1;                                            \
35857f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }                                                               \
35867f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  void holder::set_##name(int value) {                            \
35877f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT(kHeapObjectTag == 1);                                  \
35887f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    ASSERT((value & 0xC0000000) == 0xC0000000 ||                  \
35897f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch           (value & 0xC0000000) == 0x000000000);                  \
35907f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    WRITE_INT_FIELD(this,                                         \
35917f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch                    offset,                                       \
35927f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch                    (value << 1) & ~kHeapObjectTag);              \
35937f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
35947f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
35953e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset)             \
35963e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu  STATIC_ASSERT(holder::offset % kPointerSize == kIntSize);       \
35977f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  INT_ACCESSORS(holder, name, offset)
35987f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
35997f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
36007f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
36013e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
36023e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        formal_parameter_count,
36033e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kFormalParameterCountOffset)
36047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
36053e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
36063e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        expected_nof_properties,
36073e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kExpectedNofPropertiesOffset)
36087f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
36097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
36103e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, end_position, kEndPositionOffset)
36113e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
36123e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        start_position_and_type,
36133e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kStartPositionAndTypeOffset)
36143e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu
36153e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
36163e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        function_token_position,
36173e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kFunctionTokenPositionOffset)
36183e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
36193e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        compiler_hints,
36203e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kCompilerHintsOffset)
36213e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu
36223e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
36233e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        this_property_assignments_count,
36243e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kThisPropertyAssignmentsCountOffset)
3625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, opt_count, kOptCountOffset)
36263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
36283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, deopt_counter, kDeoptCounterOffset)
36297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif
3630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36310d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36320d5e116f6aee03185f237311a943491bb079a768Kristian Monsenint SharedFunctionInfo::construction_count() {
36330d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  return READ_BYTE_FIELD(this, kConstructionCountOffset);
36340d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
36350d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36360d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36370d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid SharedFunctionInfo::set_construction_count(int value) {
36380d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  ASSERT(0 <= value && value < 256);
36390d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  WRITE_BYTE_FIELD(this, kConstructionCountOffset, static_cast<byte>(value));
36400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
36410d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36433fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo,
36443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               compiler_hints,
36453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               live_objects_may_exist,
36463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               kLiveObjectsMayExist)
36470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36490d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool SharedFunctionInfo::IsInobjectSlackTrackingInProgress() {
36503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return initial_map() != GetHeap()->undefined_value();
36510d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
36520d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36530d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
36543fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_GETTER(SharedFunctionInfo,
36553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            compiler_hints,
36563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            optimization_disabled,
36573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch            kOptimizationDisabled)
3658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid SharedFunctionInfo::set_optimization_disabled(bool disable) {
3661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  set_compiler_hints(BooleanBit::set(compiler_hints(),
3662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     kOptimizationDisabled,
3663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     disable));
3664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // If disabling optimizations we reflect that in the code object so
3665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it will not be counted as optimizable code.
3666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if ((code()->kind() == Code::FUNCTION) && disable) {
3667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    code()->set_optimizable(false);
3668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
36723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLanguageMode SharedFunctionInfo::language_mode() {
36733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int hints = compiler_hints();
36743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (BooleanBit::get(hints, kExtendedModeFunction)) {
36753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(BooleanBit::get(hints, kStrictModeFunction));
36763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return EXTENDED_MODE;
36773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
36783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return BooleanBit::get(hints, kStrictModeFunction)
36793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? STRICT_MODE : CLASSIC_MODE;
36803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
36813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid SharedFunctionInfo::set_language_mode(LanguageMode language_mode) {
36843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // We only allow language mode transitions that go set the same language mode
36853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // again or go up in the chain:
36863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //   CLASSIC_MODE -> STRICT_MODE -> EXTENDED_MODE.
36873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(this->language_mode() == CLASSIC_MODE ||
36883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         this->language_mode() == language_mode ||
36893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         language_mode == EXTENDED_MODE);
36903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int hints = compiler_hints();
36913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  hints = BooleanBit::set(
36923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      hints, kStrictModeFunction, language_mode != CLASSIC_MODE);
36933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  hints = BooleanBit::set(
36943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      hints, kExtendedModeFunction, language_mode == EXTENDED_MODE);
36953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_compiler_hints(hints);
36963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
36973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
36993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool SharedFunctionInfo::is_classic_mode() {
37003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return !BooleanBit::get(compiler_hints(), kStrictModeFunction);
37013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
37023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
37033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBOOL_GETTER(SharedFunctionInfo, compiler_hints, is_extended_mode,
37043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            kExtendedModeFunction)
37053fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative)
37063fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints,
37073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               name_should_print_as_anonymous,
37083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch               kNameShouldPrintAsAnonymous)
37093fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, bound, kBoundFunction)
37103fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_anonymous, kIsAnonymous)
37113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_function, kIsFunction)
37123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_optimize,
37133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch               kDontOptimize)
37143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_inline, kDontInline)
3715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
37166ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
37176ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
37186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
37193fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochACCESSORS(PolymorphicCodeCache, cache, Object, kCacheOffset)
37203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
37213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Script::HasValidSource() {
37223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Object* src = this->source();
37233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (!src->IsString()) return true;
37243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  String* src_str = String::cast(src);
37253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (!StringShape(src_str).IsExternal()) return true;
37263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (src_str->IsAsciiRepresentation()) {
37273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return ExternalAsciiString::cast(src)->resource() != NULL;
37283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else if (src_str->IsTwoByteRepresentation()) {
37293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return ExternalTwoByteString::cast(src)->resource() != NULL;
37303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
37313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return true;
37323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
37333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
37343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::DontAdaptArguments() {
3736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(code()->kind() == Code::BUILTIN);
3737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_formal_parameter_count(kDontAdaptArgumentsSentinel);
3738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SharedFunctionInfo::start_position() {
3742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return start_position_and_type() >> kStartPositionShift;
3743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_start_position(int start_position) {
3747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_start_position_and_type((start_position << kStartPositionShift)
3748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    | (start_position_and_type() & ~kStartPositionMask));
3749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* SharedFunctionInfo::code() {
3753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Code::cast(READ_FIELD(this, kCodeOffset));
3754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3757756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickCode* SharedFunctionInfo::unchecked_code() {
3758756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset));
3759756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3760756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3761756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
3763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kCodeOffset, value);
37643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
3765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochScopeInfo* SharedFunctionInfo::scope_info() {
37693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset));
37703bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch}
37713bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
37723bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
37733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid SharedFunctionInfo::set_scope_info(ScopeInfo* value,
37743bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch                                        WriteBarrierMode mode) {
37753bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value));
37763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(),
37773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            this,
37783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            kScopeInfoOffset,
37793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            reinterpret_cast<Object*>(value),
37803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            mode);
37813bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch}
37823bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
37833bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
3784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool SharedFunctionInfo::is_compiled() {
378544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return code() !=
378644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Isolate::Current()->builtins()->builtin(Builtins::kLazyCompile);
3787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37906ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool SharedFunctionInfo::IsApiFunction() {
37916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return function_data()->IsFunctionTemplateInfo();
37926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
37936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
37946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
37956ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockFunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
37966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  ASSERT(IsApiFunction());
37976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return FunctionTemplateInfo::cast(function_data());
37986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
37996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
38006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
3801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool SharedFunctionInfo::HasBuiltinFunctionId() {
380225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  return function_data()->IsSmi();
380325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen}
380425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
380525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
3806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochBuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
3807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasBuiltinFunctionId());
3808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value());
3809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3812756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint SharedFunctionInfo::code_age() {
3813756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask;
3814756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3815756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3816756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3817756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid SharedFunctionInfo::set_code_age(int code_age) {
38183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int hints = compiler_hints() & ~(kCodeAgeMask << kCodeAgeShift);
38193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_compiler_hints(hints | ((code_age & kCodeAgeMask) << kCodeAgeShift));
3820756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3821756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3822756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool SharedFunctionInfo::has_deoptimization_support() {
3824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Code* code = this->code();
3825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return code->kind() == Code::FUNCTION && code->has_deoptimization_support();
3826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::IsBuiltin() {
3830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return context()->global()->IsJSBuiltinsObject();
3831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool JSFunction::NeedsArgumentsAdaption() {
3835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return shared()->formal_parameter_count() !=
3836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SharedFunctionInfo::kDontAdaptArgumentsSentinel;
3837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool JSFunction::IsOptimized() {
3841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return code()->kind() == Code::OPTIMIZED_FUNCTION;
3842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
38458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochbool JSFunction::IsOptimizable() {
38468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return code()->kind() == Code::FUNCTION && code()->optimizable();
38478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
38488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
38498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
3850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool JSFunction::IsMarkedForLazyRecompilation() {
385144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return code() == GetIsolate()->builtins()->builtin(Builtins::kLazyRecompile);
3852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* JSFunction::code() {
3856791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return Code::cast(unchecked_code());
3857756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3858756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3859756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3860756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickCode* JSFunction::unchecked_code() {
3861791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return reinterpret_cast<Code*>(
3862791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block      Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset)));
3863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_code(Code* value) {
386744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!HEAP->InNewSpace(value));
3868791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  Address entry = value->entry();
3869791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
38703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GetHeap()->incremental_marking()->RecordWriteOfCodeEntry(
38713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      this,
38723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HeapObject::RawField(this, kCodeEntryOffset),
38733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      value);
3874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid JSFunction::ReplaceCode(Code* code) {
3878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool was_optimized = IsOptimized();
3879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
3880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  set_code(code);
3882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Add/remove the function from the list of optimized functions for this
3884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // context based on the state change.
3885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!was_optimized && is_optimized) {
3886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    context()->global_context()->AddOptimizedFunction(this);
3887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (was_optimized && !is_optimized) {
3889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    context()->global_context()->RemoveOptimizedFunction(this);
3890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
3891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
3892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
3894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockContext* JSFunction::context() {
3895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Context::cast(READ_FIELD(this, kContextOffset));
3896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::unchecked_context() {
3900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kContextOffset);
3901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3904756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickSharedFunctionInfo* JSFunction::unchecked_shared() {
3905756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return reinterpret_cast<SharedFunctionInfo*>(
3906756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      READ_FIELD(this, kSharedFunctionInfoOffset));
3907756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
3908756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3909756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
3910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_context(Object* value) {
391144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(value->IsUndefined() || value->IsContext());
3912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kContextOffset, value);
39133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
3914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, prototype_or_initial_map, Object,
3917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kPrototypeOrInitialMapOffset)
3918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* JSFunction::initial_map() {
3921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Map::cast(prototype_or_initial_map());
3922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_initial_map(Map* value) {
3926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_prototype_or_initial_map(value);
3927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
39303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSFunction::set_initial_map_and_cache_transitions(
39313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Map* initial_map) {
39323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Context* global_context = context()->global_context();
39333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object* array_function =
39343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      global_context->get(Context::ARRAY_FUNCTION_INDEX);
39353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (array_function->IsJSFunction() &&
39363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      this == JSFunction::cast(array_function)) {
39373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(initial_map->elements_kind() == FAST_SMI_ONLY_ELEMENTS);
39383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
39393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    MaybeObject* maybe_map = initial_map->CopyDropTransitions();
39403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Map* new_double_map = NULL;
39413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!maybe_map->To<Map>(&new_double_map)) return maybe_map;
39423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    new_double_map->set_elements_kind(FAST_DOUBLE_ELEMENTS);
39433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    maybe_map = initial_map->AddElementsTransition(FAST_DOUBLE_ELEMENTS,
39443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                   new_double_map);
39453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (maybe_map->IsFailure()) return maybe_map;
39463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
39473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    maybe_map = new_double_map->CopyDropTransitions();
39483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Map* new_object_map = NULL;
39493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!maybe_map->To<Map>(&new_object_map)) return maybe_map;
39503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    new_object_map->set_elements_kind(FAST_ELEMENTS);
39513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    maybe_map = new_double_map->AddElementsTransition(FAST_ELEMENTS,
39523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                      new_object_map);
39533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (maybe_map->IsFailure()) return maybe_map;
39543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
39553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    global_context->set_smi_js_array_map(initial_map);
39563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    global_context->set_double_js_array_map(new_double_map);
39573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    global_context->set_object_js_array_map(new_object_map);
39583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
39593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_initial_map(initial_map);
39603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
39613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
39623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
39633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_initial_map() {
3965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return prototype_or_initial_map()->IsMap();
3966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_instance_prototype() {
3970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return has_initial_map() || !prototype_or_initial_map()->IsTheHole();
3971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_prototype() {
3975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_non_instance_prototype() || has_instance_prototype();
3976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::instance_prototype() {
3980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(has_instance_prototype());
3981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (has_initial_map()) return initial_map()->prototype();
3982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // When there is no initial map and the prototype is a JSObject, the
3983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // initial map field is used for the prototype field.
3984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return prototype_or_initial_map();
3985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::prototype() {
3989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(has_prototype());
3990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If the function's prototype property has been set to a non-JSObject
3991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // value, that value is stored in the constructor field of the map.
3992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (map()->has_non_instance_prototype()) return map()->constructor();
3993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return instance_prototype();
3994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
39966ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool JSFunction::should_have_prototype() {
39976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return map()->function_with_prototype();
39986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
39996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
4000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::is_compiled() {
400244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return code() != GetIsolate()->builtins()->builtin(Builtins::kLazyCompile);
4003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFixedArray* JSFunction::literals() {
40073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(!shared()->bound());
40083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return literals_or_bindings();
40093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
40103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSFunction::set_literals(FixedArray* literals) {
40133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(!shared()->bound());
40143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_literals_or_bindings(literals);
40153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
40163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFixedArray* JSFunction::function_bindings() {
40193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(shared()->bound());
40203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return literals_or_bindings();
40213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
40223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSFunction::set_function_bindings(FixedArray* bindings) {
40253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(shared()->bound());
40263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Bound function literal may be initialized to the empty fixed array
40273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // before the bindings are set.
40283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(bindings == GetHeap()->empty_fixed_array() ||
40293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         bindings->map() == GetHeap()->fixed_cow_array_map());
40303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_literals_or_bindings(bindings);
40313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
40323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
40333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSFunction::NumberOfLiterals() {
40353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(!shared()->bound());
4036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return literals()->length();
4037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
4041b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(id < kJSBuiltinsCount);  // id is unsigned.
40426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return READ_FIELD(this, OffsetOfFunctionWithId(id));
4043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
4047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                              Object* value) {
4048b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(id < kJSBuiltinsCount);  // id is unsigned.
40496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
40503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value);
40516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
40526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
40536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
40546ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCode* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
4055b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(id < kJSBuiltinsCount);  // id is unsigned.
40566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
40576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
40586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
40596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
40606ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
40616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block                                                   Code* value) {
4062b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  ASSERT(id < kJSBuiltinsCount);  // id is unsigned.
40636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
406444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!HEAP->InNewSpace(value));
4065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4068257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochACCESSORS(JSProxy, handler, Object, kHandlerOffset)
40693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSProxy, hash, Object, kHashOffset)
4070589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochACCESSORS(JSFunctionProxy, call_trap, Object, kCallTrapOffset)
4071589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset)
4072589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
4073589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
4074589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid JSProxy::InitializeBody(int object_size, Object* value) {
4075589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  ASSERT(!value->IsHeapObject() || !GetHeap()->InNewSpace(value));
4076589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
4077589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    WRITE_FIELD(this, offset, value);
4078589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  }
4079589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
4080257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4081257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
40823ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSSet, table, Object, kTableOffset)
40833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSMap, table, Object, kTableOffset)
40843ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSWeakMap, table, Object, kTableOffset)
40853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSWeakMap, next, Object, kNextOffset)
408669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
408769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
40883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochAddress Foreign::foreign_address() {
40893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AddressFrom<Address>(READ_INTPTR_FIELD(this, kForeignAddressOffset));
409069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
409169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
409269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
40933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Foreign::set_foreign_address(Address value) {
40943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_INTPTR_FIELD(this, kForeignAddressOffset, OffsetFrom(value));
4095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSValue, value, Object, kValueOffset)
4099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSValue* JSValue::cast(Object* obj) {
4102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(obj->IsJSValue());
4103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize);
4104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<JSValue*>(obj);
4105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
41083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, value, Object, kValueOffset)
41093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset)
41103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, year, Object, kYearOffset)
41113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, month, Object, kMonthOffset)
41123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, day, Object, kDayOffset)
41133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, weekday, Object, kWeekdayOffset)
41143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, hour, Object, kHourOffset)
41153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, min, Object, kMinOffset)
41163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, sec, Object, kSecOffset)
41173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
41183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
41193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochJSDate* JSDate::cast(Object* obj) {
41203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(obj->IsJSDate());
41213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(HeapObject::cast(obj)->Size() == JSDate::kSize);
41223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return reinterpret_cast<JSDate*>(obj);
41233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
41243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
41253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
41261e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, type, String, kTypeOffset)
41271e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
41281e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, script, Object, kScriptOffset)
41291e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset)
41301e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
41311e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockSMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
41321e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockSMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
41331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
41341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
41351e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockJSMessageObject* JSMessageObject::cast(Object* obj) {
41361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(obj->IsJSMessageObject());
41371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize);
41381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return reinterpret_cast<JSMessageObject*>(obj);
41391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
41401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
41411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
4142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockINT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
4143ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon ClarkeACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
41443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset)
4145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
41463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(Code, type_feedback_info, Object, kTypeFeedbackInfoOffset)
41473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset)
41483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochINT_ACCESSORS(Code, ic_age, kICAgeOffset)
4149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::instruction_start()  {
4151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
4152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4155ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarkebyte* Code::instruction_end()  {
4156ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return instruction_start() + instruction_size();
4157ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
4158ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
4159ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
4160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::body_size() {
4161ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return RoundUp(instruction_size(), kObjectAlignment);
4162ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
4163ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
4164ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
4165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochFixedArray* Code::unchecked_deoptimization_data() {
4166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return reinterpret_cast<FixedArray*>(
4167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      READ_FIELD(this, kDeoptimizationDataOffset));
4168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
4169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4171ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon ClarkeByteArray* Code::unchecked_relocation_info() {
4172ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
4173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::relocation_start() {
4177ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return unchecked_relocation_info()->GetDataStartAddress();
4178ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
4179ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
4180ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
4181ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarkeint Code::relocation_size() {
4182ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke  return unchecked_relocation_info()->length();
4183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::entry() {
4187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return instruction_start();
4188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
41913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::contains(byte* inner_pointer) {
41923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (address() <= inner_pointer) && (inner_pointer <= address() + Size());
4193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSArray, length, Object, kLengthOffset)
4197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSRegExp, data, Object, kDataOffset)
4200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Type JSRegExp::TypeTag() {
4203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
4204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (data->IsUndefined()) return JSRegExp::NOT_COMPILED;
4205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
4206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<JSRegExp::Type>(smi->value());
4207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochJSRegExp::Type JSRegExp::TypeTagUnchecked() {
4211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Smi* smi = Smi::cast(DataAtUnchecked(kTagIndex));
4212257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return static_cast<JSRegExp::Type>(smi->value());
4213257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
4214257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4215257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSRegExp::CaptureCount() {
4217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (TypeTag()) {
4218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case ATOM:
4219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return 0;
4220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case IRREGEXP:
4221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value();
4222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
4223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      UNREACHABLE();
4224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return -1;
4225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Flags JSRegExp::GetFlags() {
4230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(this->data()->IsFixedArray());
4231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
4232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex));
4233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Flags(smi->value());
4234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* JSRegExp::Pattern() {
4238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(this->data()->IsFixedArray());
4239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
4240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex));
4241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return pattern;
4242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSRegExp::DataAt(int index) {
4246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(TypeTag() != NOT_COMPILED);
4247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FixedArray::cast(data())->get(index);
4248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochObject* JSRegExp::DataAtUnchecked(int index) {
4252257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  FixedArray* fa = reinterpret_cast<FixedArray*>(data());
4253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int offset = FixedArray::kHeaderSize + index * kPointerSize;
4254257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return READ_FIELD(fa, offset);
4255257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
4256257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4257257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSRegExp::SetDataAt(int index, Object* value) {
4259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(TypeTag() != NOT_COMPILED);
4260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(index >= kDataIndex);  // Only implementation data can be set this way.
4261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray::cast(data())->set(index, value);
4262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4265257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid JSRegExp::SetDataAtUnchecked(int index, Object* value, Heap* heap) {
4266257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(index >= kDataIndex);  // Only implementation data can be set this way.
4267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  FixedArray* fa = reinterpret_cast<FixedArray*>(data());
4268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (value->IsSmi()) {
4269257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    fa->set_unchecked(index, Smi::cast(value));
4270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
42713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // We only do this during GC, so we don't need to notify the write barrier.
4272257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    fa->set_unchecked(heap, index, value, SKIP_WRITE_BARRIER);
4273257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
4274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
4275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4277589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochElementsKind JSObject::GetElementsKind() {
42783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ElementsKind kind = map()->elements_kind();
42793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#if DEBUG
42803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  FixedArrayBase* fixed_array =
42813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset));
42823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Map* map = fixed_array->map();
42833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(((kind == FAST_ELEMENTS || kind == FAST_SMI_ONLY_ELEMENTS) &&
42843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            (map == GetHeap()->fixed_array_map() ||
42853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch             map == GetHeap()->fixed_cow_array_map())) ||
42863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           (kind == FAST_DOUBLE_ELEMENTS &&
42873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            (fixed_array->IsFixedDoubleArray() ||
42883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            fixed_array == GetHeap()->empty_fixed_array())) ||
42893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           (kind == DICTIONARY_ELEMENTS &&
42903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            fixed_array->IsFixedArray() &&
42913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            fixed_array->IsDictionary()) ||
42923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           (kind > DICTIONARY_ELEMENTS));
42933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT((kind != NON_STRICT_ARGUMENTS_ELEMENTS) ||
42943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           (elements()->IsFixedArray() && elements()->length() >= 2));
42953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
42963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return kind;
4297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
430069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochElementsAccessor* JSObject::GetElementsAccessor() {
430169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return ElementsAccessor::ForKind(GetElementsKind());
430269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
430369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
430469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasFastElements() {
4306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetElementsKind() == FAST_ELEMENTS;
4307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSObject::HasFastSmiOnlyElements() {
43113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return GetElementsKind() == FAST_SMI_ONLY_ELEMENTS;
43123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
43133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSObject::HasFastTypeElements() {
43163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ElementsKind elements_kind = GetElementsKind();
43173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return elements_kind == FAST_SMI_ONLY_ELEMENTS ||
43183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      elements_kind == FAST_ELEMENTS;
43193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
43203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool JSObject::HasFastDoubleElements() {
43233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return GetElementsKind() == FAST_DOUBLE_ELEMENTS;
43243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
43253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
43263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasDictionaryElements() {
4328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetElementsKind() == DICTIONARY_ELEMENTS;
4329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSObject::HasNonStrictArgumentsElements() {
43333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS;
43343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
43353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
43373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalArrayElements() {
433844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HeapObject* array = elements();
433944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(array != NULL);
434044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return array->IsExternalArray();
43413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
43423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
43433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
434444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define EXTERNAL_ELEMENTS_CHECK(name, type)          \
434544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool JSObject::HasExternal##name##Elements() {       \
434644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HeapObject* array = elements();                    \
434744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(array != NULL);                             \
434844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (!array->IsHeapObject())                        \
434944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return false;                                    \
435044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return array->map()->instance_type() == type;      \
43513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
43523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
43533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
435444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE)
435544f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
435644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE)
435744f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(UnsignedShort,
435844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
435944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE)
436044f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(UnsignedInt,
436144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
436244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Float,
436344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        EXTERNAL_FLOAT_ARRAY_TYPE)
4364257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochEXTERNAL_ELEMENTS_CHECK(Double,
4365257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                        EXTERNAL_DOUBLE_ARRAY_TYPE)
436644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE)
43673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
43683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasNamedInterceptor() {
4370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_named_interceptor();
4371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasIndexedInterceptor() {
4375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_indexed_interceptor();
4376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43795913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* JSObject::EnsureWritableFastElements() {
43803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(HasFastTypeElements());
4381756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  FixedArray* elems = FixedArray::cast(elements());
438244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate = GetIsolate();
438344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems;
43845913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  Object* writable_elems;
438544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  { MaybeObject* maybe_writable_elems = isolate->heap()->CopyFixedArrayWithMap(
438644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      elems, isolate->heap()->fixed_array_map());
43875913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck    if (!maybe_writable_elems->ToObject(&writable_elems)) {
43885913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck      return maybe_writable_elems;
43895913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck    }
43905913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck  }
4391756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  set_elements(FixedArray::cast(writable_elems));
439244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  isolate->counters()->cow_arrays_converted()->Increment();
4393756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return writable_elems;
4394756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4395756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4396756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringDictionary* JSObject::property_dictionary() {
4398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!HasFastProperties());
4399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringDictionary::cast(properties());
4400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4403c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochSeededNumberDictionary* JSObject::element_dictionary() {
4404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(HasDictionaryElements());
4405c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return SeededNumberDictionary::cast(elements());
4406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool String::IsHashFieldComputed(uint32_t field) {
44107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return (field & kHashNotComputedMask) == 0;
44117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
44127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
44137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
4414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::HasHashCode() {
44157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return IsHashFieldComputed(hash_field());
4416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t String::Hash() {
4420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Fast case: has hash code already been computed?
4421d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  uint32_t field = hash_field();
44227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsHashFieldComputed(field)) return field >> kHashShift;
4423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Slow case: compute hash code and set it.
4424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ComputeAndSetHash();
4425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4428c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochStringHasher::StringHasher(int length, uint32_t seed)
4429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : length_(length),
4430c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    raw_running_hash_(seed),
4431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    array_index_(0),
4432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize),
4433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    is_first_char_(true),
4434c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    is_valid_(true) {
4435c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  ASSERT(FLAG_randomize_hashes || raw_running_hash_ == 0);
4436c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
4437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringHasher::has_trivial_hash() {
4440d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return length_ > String::kMaxHashCalcLength;
4441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid StringHasher::AddCharacter(uint32_t c) {
44453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
44463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    AddSurrogatePair(c);  // Not inlined.
44473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return;
44483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Use the Jenkins one-at-a-time hash function to update the hash
4450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // for the given character.
4451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ += c;
4452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ += (raw_running_hash_ << 10);
4453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ ^= (raw_running_hash_ >> 6);
4454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Incremental array index computation.
4455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (is_array_index_) {
4456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (c < '0' || c > '9') {
4457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      is_array_index_ = false;
4458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    } else {
4459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      int d = c - '0';
4460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (is_first_char_) {
4461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        is_first_char_ = false;
4462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        if (c == '0' && length_ > 1) {
4463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          is_array_index_ = false;
4464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          return;
4465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        }
4466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
4467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      if (array_index_ > 429496729U - ((d + 2) >> 3)) {
4468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        is_array_index_ = false;
4469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      } else {
4470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        array_index_ = array_index_ * 10 + d;
4471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
4472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
4473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid StringHasher::AddCharacterNoIndex(uint32_t c) {
4478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!is_array_index());
44793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
44803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    AddSurrogatePairNoIndex(c);  // Not inlined.
44813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return;
44823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ += c;
4484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ += (raw_running_hash_ << 10);
4485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  raw_running_hash_ ^= (raw_running_hash_ >> 6);
4486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t StringHasher::GetHash() {
4490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Get the calculated raw hash value and do some more bit ops to distribute
4491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // the hash further. Ensure that we never return zero as the hash value.
4492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  uint32_t result = raw_running_hash_;
4493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += (result << 3);
4494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result ^= (result >> 11);
4495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  result += (result << 15);
4496c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  if ((result & String::kHashBitMask) == 0) {
4497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    result = 27;
4498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
4500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
450344f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktemplate <typename schar>
4504c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t HashSequentialString(const schar* chars, int length, uint32_t seed) {
4505c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  StringHasher hasher(length, seed);
450644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (!hasher.has_trivial_hash()) {
450744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    int i;
450844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    for (i = 0; hasher.is_array_index() && (i < length); i++) {
450944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      hasher.AddCharacter(chars[i]);
451044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
451144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    for (; i < length; i++) {
451244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      hasher.AddCharacterNoIndex(chars[i]);
451344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
451444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
451544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return hasher.GetHashField();
451644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
451744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
451844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::AsArrayIndex(uint32_t* index) {
4520d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  uint32_t field = hash_field();
45217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) {
45227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    return false;
45237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
4524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return SlowAsArrayIndex(index);
4525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45283fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochObject* JSReceiver::GetPrototype() {
45293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return HeapObject::cast(this)->map()->prototype();
45303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
45313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
45323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
45333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool JSReceiver::HasProperty(String* name) {
45343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (IsJSProxy()) {
45353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return JSProxy::cast(this)->HasPropertyWithHandler(name);
45363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
45373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return GetPropertyAttribute(name) != ABSENT;
45383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
45393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
45403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
45413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool JSReceiver::HasLocalProperty(String* name) {
45423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (IsJSProxy()) {
45433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return JSProxy::cast(this)->HasPropertyWithHandler(name);
45443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
45453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return GetLocalPropertyAttribute(name) != ABSENT;
4546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45493fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochPropertyAttributes JSReceiver::GetPropertyAttribute(String* key) {
4550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetPropertyAttributeWithReceiver(this, key);
4551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4553d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// TODO(504): this may be useful in other places too where JSGlobalProxy
4554d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// is used.
4555d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockObject* JSObject::BypassGlobalProxy() {
4556d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (IsJSGlobalProxy()) {
4557d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    Object* proto = GetPrototype();
455844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (proto->IsNull()) return GetHeap()->undefined_value();
4559d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    ASSERT(proto->IsJSGlobalObject());
4560d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return proto;
4561d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
4562d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return this;
4563d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block}
4564d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
4565d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
45663ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSReceiver::GetIdentityHash(CreationFlag flag) {
45673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return IsJSProxy()
45683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? JSProxy::cast(this)->GetIdentityHash(flag)
45693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : JSObject::cast(this)->GetIdentityHash(flag);
457085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch}
457185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
457285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
45733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSReceiver::HasElement(uint32_t index) {
45743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (IsJSProxy()) {
45753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return JSProxy::cast(this)->HasElementWithHandler(index);
45763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
45773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return JSObject::cast(this)->HasElementWithReceiver(this, index);
4578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_read() {
4582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BooleanBit::get(flag(), kAllCanReadBit);
4583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_read(bool value) {
4587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(BooleanBit::set(flag(), kAllCanReadBit, value));
4588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_write() {
4592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BooleanBit::get(flag(), kAllCanWriteBit);
4593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_write(bool value) {
4597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value));
4598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::prohibits_overwriting() {
4602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BooleanBit::get(flag(), kProhibitsOverwritingBit);
4603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_prohibits_overwriting(bool value) {
4607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(BooleanBit::set(flag(), kProhibitsOverwritingBit, value));
4608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyAttributes AccessorInfo::property_attributes() {
4612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return AttributesField::decode(static_cast<uint32_t>(flag()->value()));
4613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_property_attributes(PropertyAttributes attributes) {
4617589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  set_flag(Smi::FromInt(AttributesField::update(flag()->value(), attributes)));
4618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
46218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochtemplate<typename Shape, typename Key>
46228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid Dictionary<Shape, Key>::SetEntry(int entry,
46238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                                      Object* key,
46248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch                                      Object* value) {
46258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
46268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
46278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
46288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
4629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Shape, typename Key>
4630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Dictionary<Shape, Key>::SetEntry(int entry,
4631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Object* key,
4632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      Object* value,
4633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                      PropertyDetails details) {
4634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  ASSERT(!key->IsString() || details.IsDeleted() || details.index() > 0);
4635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int index = HashTable<Shape, Key>::EntryToIndex(entry);
46364515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  AssertNoAllocation no_gc;
46374515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
4638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray::set(index, key, mode);
4639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray::set(index+1, value, mode);
46403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  FixedArray::set(index+2, details.AsSmi());
4641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
464444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
464544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(other->IsNumber());
464644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return key == static_cast<uint32_t>(other->Number());
464744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
464844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
464944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4650c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) {
4651c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return ComputeIntegerHash(key, 0);
465244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
465344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
465444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4655c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key,
4656c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                                                      Object* other) {
465744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(other->IsNumber());
4658c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0);
4659c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
4660c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
4661c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) {
4662c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return ComputeIntegerHash(key, seed);
466344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
466444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4665c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key,
4666c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                                                          uint32_t seed,
4667c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                                                          Object* other) {
4668c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  ASSERT(other->IsNumber());
4669c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed);
4670c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
467144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
467244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockMaybeObject* NumberDictionaryShape::AsObject(uint32_t key) {
467344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return Isolate::Current()->heap()->NumberFromUint32(key);
467444f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
467544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
467644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
467744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool StringDictionaryShape::IsMatch(String* key, Object* other) {
467844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // We know that all entries in a hash table had their hash keys created.
467944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Use that knowledge to have fast failure.
468044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (key->Hash() != String::cast(other)->Hash()) return false;
468144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return key->Equals(String::cast(other));
468244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
468344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
468444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
468544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockuint32_t StringDictionaryShape::Hash(String* key) {
468644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return key->Hash();
468744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
468844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
468944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
469044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockuint32_t StringDictionaryShape::HashForObject(String* key, Object* other) {
469144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return String::cast(other)->Hash();
469244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
469344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
469444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
469544f0eee88ff00398ff7f715fab053374d808c90dSteve BlockMaybeObject* StringDictionaryShape::AsObject(String* key) {
469644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return key;
469744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
469844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
469944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
47003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize>
47013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool ObjectHashTableShape<entrysize>::IsMatch(Object* key, Object* other) {
47023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return key->SameValue(other);
470369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
470469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
470569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
47063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize>
47073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochuint32_t ObjectHashTableShape<entrysize>::Hash(Object* key) {
47083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MaybeObject* maybe_hash = key->GetHash(OMIT_CREATION);
47093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Smi::cast(maybe_hash->ToObjectChecked())->value();
471069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
471169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
471269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
47133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize>
47143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochuint32_t ObjectHashTableShape<entrysize>::HashForObject(Object* key,
47153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                                        Object* other) {
47163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MaybeObject* maybe_hash = other->GetHash(OMIT_CREATION);
47173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Smi::cast(maybe_hash->ToObjectChecked())->value();
471869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
471969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
472069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
47213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize>
47223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* ObjectHashTableShape<entrysize>::AsObject(Object* key) {
472369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return key;
472469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
472569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
472669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
472744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Map::ClearCodeCache(Heap* heap) {
4728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // No write barrier is needed since empty_fixed_array is not in new space.
4729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Please note this function is used during marking:
4730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  //  - MarkCompactCollector::MarkUnmarkedObject
47313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //  - IncrementalMarking::Step
473244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(!heap->InNewSpace(heap->raw_unchecked_empty_fixed_array()));
473344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  WRITE_FIELD(this, kCodeCacheOffset, heap->raw_unchecked_empty_fixed_array());
4734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSArray::EnsureSize(int required_size) {
47383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(HasFastTypeElements());
47397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  FixedArray* elts = FixedArray::cast(elements());
4740d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  const int kArraySizeThatFitsComfortablyInNewSpace = 128;
4741d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (elts->length() < required_size) {
4742d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // Doubling in size would be overkill, but leave some slack to avoid
4743d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // constantly growing.
4744d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    Expand(required_size + (required_size >> 3));
4745d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // It's a performance benefit to keep a frequently used array in new-space.
474644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else if (!GetHeap()->new_space()->Contains(elts) &&
4747d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block             required_size < kArraySizeThatFitsComfortablyInNewSpace) {
4748d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // Expand will allocate a new backing store in new space even if the size
4749d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    // we asked for isn't larger than what we had before.
4750d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    Expand(required_size);
4751d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
4752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
47554515c472dc3e5ed2448a564600976759e569a0a8Leon Clarkevoid JSArray::set_length(Smi* length) {
47563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Don't need a write barrier for a Smi.
47574515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
47584515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke}
47594515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke
47604515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke
47613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSArray::AllowsSetElementsLength() {
47623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray();
47633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT(result == !HasExternalArrayElements());
47643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return result;
47653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
47663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSArray::SetContent(FixedArrayBase* storage) {
47693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MaybeObject* maybe_result = EnsureCanContainElements(
47703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      storage, ALLOW_COPIED_DOUBLE_ELEMENTS);
47713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (maybe_result->IsFailure()) return maybe_result;
47723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  ASSERT((storage->map() == GetHeap()->fixed_double_array_map() &&
47733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          GetElementsKind() == FAST_DOUBLE_ELEMENTS) ||
47743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         ((storage->map() != GetHeap()->fixed_double_array_map()) &&
47753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          ((GetElementsKind() == FAST_ELEMENTS) ||
47763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           (GetElementsKind() == FAST_SMI_ONLY_ELEMENTS &&
47773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            FixedArray::cast(storage)->ContainsOnlySmisOrHoles()))));
477885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  set_elements(storage);
47793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_length(Smi::FromInt(storage->length()));
47803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
4781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
47845913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* FixedArray::Copy() {
4785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (length() == 0) return this;
478644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return GetHeap()->CopyFixedArray(this);
478744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
478844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
478944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
47903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* FixedDoubleArray::Copy() {
47913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (length() == 0) return this;
47923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return GetHeap()->CopyFixedDoubleArray(this);
47933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
47943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
47963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid TypeFeedbackCells::SetAstId(int index, Smi* id) {
47973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set(1 + index * 2, id);
47983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
47993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSmi* TypeFeedbackCells::AstId(int index) {
48023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Smi::cast(get(1 + index * 2));
48033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
48043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid TypeFeedbackCells::SetCell(int index, JSGlobalPropertyCell* cell) {
48073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set(index * 2, cell);
48083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
48093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochJSGlobalPropertyCell* TypeFeedbackCells::Cell(int index) {
48123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return JSGlobalPropertyCell::cast(get(index * 2));
48133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
48143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> TypeFeedbackCells::UninitializedSentinel(Isolate* isolate) {
48173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return isolate->factory()->the_hole_value();
48183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
48193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> TypeFeedbackCells::MegamorphicSentinel(Isolate* isolate) {
48223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return isolate->factory()->undefined_value();
48233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
48243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochObject* TypeFeedbackCells::RawUninitializedSentinel(Heap* heap) {
48273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return heap->raw_unchecked_the_hole_value();
48283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
48293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(TypeFeedbackInfo, ic_total_count, kIcTotalCountOffset)
48328f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben MurdochSMI_ACCESSORS(TypeFeedbackInfo, ic_with_type_info_count,
48333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch              kIcWithTypeinfoCountOffset)
48343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(TypeFeedbackInfo, type_feedback_cells, TypeFeedbackCells,
48353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          kTypeFeedbackCellsOffset)
48363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot)
48393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
48403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
484144f0eee88ff00398ff7f715fab053374d808c90dSteve BlockRelocatable::Relocatable(Isolate* isolate) {
484244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(isolate == Isolate::Current());
484344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  isolate_ = isolate;
484444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  prev_ = isolate->relocatable_top();
484544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  isolate->set_relocatable_top(this);
484644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
484744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
484844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
484944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockRelocatable::~Relocatable() {
485044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT(isolate_ == Isolate::Current());
485144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ASSERT_EQ(isolate_->relocatable_top(), this);
485244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  isolate_->set_relocatable_top(prev_);
4853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4856756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) {
4857756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  return map->instance_size();
4858756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4859756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4860756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4861257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Foreign::ForeignIterateBody(ObjectVisitor* v) {
4862756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  v->VisitExternalReference(
48633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
4864756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4865756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4866756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4867756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor>
4868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Foreign::ForeignIterateBody() {
4869756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  StaticVisitor::VisitExternalReference(
48703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
4871756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4872756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4873756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4874756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) {
4875756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  typedef v8::String::ExternalAsciiStringResource Resource;
4876756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  v->VisitExternalAsciiString(
4877756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
4878756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4879756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4880756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4881756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor>
4882756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalAsciiString::ExternalAsciiStringIterateBody() {
4883756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  typedef v8::String::ExternalAsciiStringResource Resource;
4884756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  StaticVisitor::VisitExternalAsciiString(
4885756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
4886756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4887756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4888756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4889756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) {
4890756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  typedef v8::String::ExternalStringResource Resource;
4891756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  v->VisitExternalTwoByteString(
4892756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
4893756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4894756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4895756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4896756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor>
4897756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
4898756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  typedef v8::String::ExternalStringResource Resource;
4899756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  StaticVisitor::VisitExternalTwoByteString(
4900756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
4901756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4902756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4903756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#define SLOT_ADDR(obj, offset) \
4904756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  reinterpret_cast<Object**>((obj)->address() + offset)
4905756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4906756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<int start_offset, int end_offset, int size>
4907756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody(
4908756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    HeapObject* obj,
4909756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    ObjectVisitor* v) {
4910756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick    v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, end_offset));
4911756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4912756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4913756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4914756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<int start_offset>
4915756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj,
4916756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick                                                       int object_size,
4917756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick                                                       ObjectVisitor* v) {
4918756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick  v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, object_size));
4919756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
4920756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
4921756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#undef SLOT_ADDR
4922756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
49233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef TYPE_CHECKER
4924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CAST_ACCESSOR
4925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef INT_ACCESSORS
492685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch#undef ACCESSORS
49273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef ACCESSORS_TO_SMI
49283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef SMI_ACCESSORS
49293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef BOOL_GETTER
49303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef BOOL_ACCESSORS
4931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef FIELD_ADDR
4932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_FIELD
4933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_FIELD
4934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BARRIER
4935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CONDITIONAL_WRITE_BARRIER
4936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_DOUBLE_FIELD
4937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_DOUBLE_FIELD
4938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_INT_FIELD
4939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_INT_FIELD
49403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef READ_INTPTR_FIELD
49413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef WRITE_INTPTR_FIELD
49423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef READ_UINT32_FIELD
49433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef WRITE_UINT32_FIELD
4944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_SHORT_FIELD
4945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_SHORT_FIELD
4946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_BYTE_FIELD
4947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BYTE_FIELD
4948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
4951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_OBJECTS_INL_H_
4953