1fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Review notes:
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
73291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// - The use of macros in these inline functions may seem superfluous
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// but it is absolutely needed to make sure gcc generates optimal
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// code. gcc is not happy when attempting to inline too deep.
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_OBJECTS_INL_H_
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_OBJECTS_INL_H_
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#include "src/base/atomicops.h"
16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/elements.h"
17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/objects.h"
18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/contexts.h"
19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/conversions-inl.h"
20e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org#include "src/field-index-inl.h"
21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/heap.h"
22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate.h"
23196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/heap-inl.h"
24196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/property.h"
25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/spaces.h"
26196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/store-buffer.h"
27196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8memory.h"
28196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
29196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/incremental-marking.h"
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/transitions-inl.h"
31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/objects-visiting.h"
328ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org#include "src/lookup.h"
33c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyDetails::PropertyDetails(Smi* smi) {
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  value_ = smi->value();
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgSmi* PropertyDetails::AsSmi() const {
4379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  // Ensure the upper 2 bits have the same value by sign extending it. This is
4479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  // necessary to be able to use the 31st bit of the property details.
4579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  int value = value_ << 1;
4679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  return Smi::FromInt(value >> 1);
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgPropertyDetails PropertyDetails::AsDeleted() const {
51378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
522abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org  return PropertyDetails(smi);
532abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org}
542abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
552abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
56394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com#define TYPE_CHECKER(type, instancetype)                                \
57394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  bool Object::Is##type() {                                             \
58394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  return Object::IsHeapObject() &&                                      \
59394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      HeapObject::cast(this)->map()->instance_type() == instancetype;   \
60394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
61394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
62394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define CAST_ACCESSOR(type)                     \
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  type* type::cast(Object* object) {            \
65ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org    SLOW_ASSERT(object->Is##type());            \
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return reinterpret_cast<type*>(object);     \
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define INT_ACCESSORS(holder, name, offset)                             \
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int holder::name() { return READ_INT_FIELD(this, offset); }           \
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); }
7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define ACCESSORS(holder, name, type, offset)                           \
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \
775a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  void holder::set_##name(type* value, WriteBarrierMode mode) {         \
7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    WRITE_FIELD(this, offset, value);                                   \
79c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);    \
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
832c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// Getter that returns a tagged Smi and setter that writes a tagged Smi.
842c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#define ACCESSORS_TO_SMI(holder, name, offset)                          \
852c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  Smi* holder::name() { return Smi::cast(READ_FIELD(this, offset)); }   \
862c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  void holder::set_##name(Smi* value, WriteBarrierMode mode) {          \
872c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org    WRITE_FIELD(this, offset, value);                                   \
882c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  }
892c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
902c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
912c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org// Getter that returns a Smi as an int and writes an int as a Smi.
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define SMI_ACCESSORS(holder, name, offset)             \
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int holder::name() {                                  \
9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Object* value = READ_FIELD(this, offset);           \
9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Smi::cast(value)->value();                   \
9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }                                                     \
9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void holder::set_##name(int value) {                  \
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    WRITE_FIELD(this, offset, Smi::FromInt(value));     \
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org#define SYNCHRONIZED_SMI_ACCESSORS(holder, name, offset)    \
10263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  int holder::synchronized_##name() {                       \
10363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    Object* value = ACQUIRE_READ_FIELD(this, offset);       \
10463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    return Smi::cast(value)->value();                       \
10563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  }                                                         \
10663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  void holder::synchronized_set_##name(int value) {         \
10763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    RELEASE_WRITE_FIELD(this, offset, Smi::FromInt(value)); \
10863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  }
10963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
1109e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org#define NOBARRIER_SMI_ACCESSORS(holder, name, offset)          \
1119e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  int holder::nobarrier_##name() {                             \
1129e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    Object* value = NOBARRIER_READ_FIELD(this, offset);        \
1139e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    return Smi::cast(value)->value();                          \
1149e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  }                                                            \
1159e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  void holder::nobarrier_set_##name(int value) {               \
1169e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    NOBARRIER_WRITE_FIELD(this, offset, Smi::FromInt(value));  \
1179e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  }
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
119911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#define BOOL_GETTER(holder, field, name, offset)           \
120911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  bool holder::name() {                                    \
121911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org    return BooleanBit::get(field(), offset);               \
122911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  }                                                        \
123911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
124911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
125911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#define BOOL_ACCESSORS(holder, field, name, offset)        \
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool holder::name() {                                    \
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return BooleanBit::get(field(), offset);               \
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }                                                        \
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  void holder::set_##name(bool value) {                    \
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_##field(BooleanBit::set(field(), offset, value));  \
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
134394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.combool Object::IsFixedArrayBase() {
1355c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return IsFixedArray() || IsFixedDoubleArray() || IsConstantPoolArray() ||
1365c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org         IsFixedTypedArrayBase() || IsExternalArray();
137394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
138394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
139394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
140eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org// External objects are not extensible, so the map check is enough.
141eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgbool Object::IsExternal() {
142eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org  return Object::IsHeapObject() &&
143eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      HeapObject::cast(this)->map() ==
144eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org      HeapObject::cast(this)->GetHeap()->external_map();
145eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org}
146eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
147eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org
1487c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgbool Object::IsAccessorInfo() {
1497c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  return IsExecutableAccessorInfo() || IsDeclaredAccessorInfo();
1507c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}
1517c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
1527c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsSmi() {
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return HAS_SMI_TAG(this);
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsHeapObject() {
15918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return Internals::HasHeapObjectTag(this);
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
163394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE)
1644a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgTYPE_CHECKER(Symbol, SYMBOL_TYPE)
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsString() {
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Object::IsHeapObject()
16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE;
17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1734a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgbool Object::IsName() {
1744a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  return IsString() || IsSymbol();
1754a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}
1764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
1774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
1784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgbool Object::IsUniqueName() {
1794a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  return IsInternalizedString() || IsSymbol();
1804a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}
1814a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
1824a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
1839fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.orgbool Object::IsSpecObject() {
1849fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org  return Object::IsHeapObject()
1859fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org    && HeapObject::cast(this)->map()->instance_type() >= FIRST_SPEC_OBJECT_TYPE;
1869fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org}
1879fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org
1889fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org
189c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool Object::IsSpecFunction() {
190c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (!Object::IsHeapObject()) return false;
191c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  InstanceType type = HeapObject::cast(this)->map()->instance_type();
192c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return type == JS_FUNCTION_TYPE || type == JS_FUNCTION_PROXY_TYPE;
193c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
194c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
195c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1963484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.orgbool Object::IsTemplateInfo() {
1973484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  return IsObjectTemplateInfo() || IsFunctionTemplateInfo();
1983484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org}
1993484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
2003484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org
2014a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgbool Object::IsInternalizedString() {
202870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  if (!this->IsHeapObject()) return false;
203870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  uint32_t type = HeapObject::cast(this)->map()->instance_type();
204ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  STATIC_ASSERT(kNotInternalizedTag != 0);
205ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return (type & (kIsNotStringMask | kIsNotInternalizedMask)) ==
206ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      (kStringTag | kInternalizedTag);
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
210870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool Object::IsConsString() {
2114668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  if (!IsString()) return false;
2124668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  return StringShape(String::cast(this)).IsCons();
2134668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}
2144668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
2154668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
2164668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgbool Object::IsSlicedString() {
2174668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  if (!IsString()) return false;
2184668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  return StringShape(String::cast(this)).IsSliced();
21943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
222870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool Object::IsSeqString() {
223870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  if (!IsString()) return false;
224870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return StringShape(String::cast(this)).IsSequential();
225870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
226870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
227870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
228fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgbool Object::IsSeqOneByteString() {
229870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  if (!IsString()) return false;
230bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return StringShape(String::cast(this)).IsSequential() &&
2318e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org         String::cast(this)->IsOneByteRepresentation();
2325a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
2335a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
2345a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
2357c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgbool Object::IsSeqTwoByteString() {
236870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  if (!IsString()) return false;
237bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return StringShape(String::cast(this)).IsSequential() &&
2385ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org         String::cast(this)->IsTwoByteRepresentation();
2397c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
2407c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
2417c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
242870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool Object::IsExternalString() {
243870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  if (!IsString()) return false;
244870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return StringShape(String::cast(this)).IsExternal();
2457c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
2467c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
2477c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
248870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool Object::IsExternalAsciiString() {
249870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  if (!IsString()) return false;
250bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return StringShape(String::cast(this)).IsExternal() &&
2518e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org         String::cast(this)->IsOneByteRepresentation();
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
255870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool Object::IsExternalTwoByteString() {
256870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  if (!IsString()) return false;
257bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return StringShape(String::cast(this)).IsExternal() &&
2585ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org         String::cast(this)->IsTwoByteRepresentation();
25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
261e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org
2626d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgbool Object::HasValidElements() {
2636d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  // Dictionary is covered under FixedArray.
2645c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return IsFixedArray() || IsFixedDoubleArray() || IsExternalArray() ||
2655c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org         IsFixedTypedArrayBase();
2666d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
269e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.orgHandle<Object> Object::NewStorageFor(Isolate* isolate,
270e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org                                     Handle<Object> object,
271e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org                                     Representation representation) {
272e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  if (representation.IsSmi() && object->IsUninitialized()) {
273e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org    return handle(Smi::FromInt(0), isolate);
27471ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  }
275e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  if (!representation.IsDouble()) return object;
276e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  if (object->IsUninitialized()) {
277e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org    return isolate->factory()->NewHeapNumber(0);
2781fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
279e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  return isolate->factory()->NewHeapNumber(object->Number());
28057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org}
28157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
28257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org
283870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgStringShape::StringShape(String* str)
284870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  : type_(str->map()->instance_type()) {
285870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  set_valid();
286870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  ASSERT((type_ & kIsNotStringMask) == kStringTag);
28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
290870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgStringShape::StringShape(Map* map)
291870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  : type_(map->instance_type()) {
292870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  set_valid();
293870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  ASSERT((type_ & kIsNotStringMask) == kStringTag);
29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
297870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgStringShape::StringShape(InstanceType t)
298870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  : type_(static_cast<uint32_t>(t)) {
299870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  set_valid();
300870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  ASSERT((type_ & kIsNotStringMask) == kStringTag);
30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3044a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgbool StringShape::IsInternalized() {
305870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  ASSERT(valid());
306ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  STATIC_ASSERT(kNotInternalizedTag != 0);
307ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return (type_ & (kIsNotStringMask | kIsNotInternalizedMask)) ==
308ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      (kStringTag | kInternalizedTag);
30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgbool String::IsOneByteRepresentation() {
3135ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  uint32_t type = map()->instance_type();
314e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return (type & kStringEncodingMask) == kOneByteStringTag;
31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3185ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgbool String::IsTwoByteRepresentation() {
3195ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  uint32_t type = map()->instance_type();
3205ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org  return (type & kStringEncodingMask) == kTwoByteStringTag;
32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3248e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgbool String::IsOneByteRepresentationUnderneath() {
3254668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  uint32_t type = map()->instance_type();
3264668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  STATIC_ASSERT(kIsIndirectStringTag != 0);
3274668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
3284668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  ASSERT(IsFlat());
3294668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
330e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    case kOneByteStringTag:
3314668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org      return true;
3324668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    case kTwoByteStringTag:
3334668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org      return false;
3344668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    default:  // Cons or sliced string.  Need to go deeper.
3358e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org      return GetUnderlying()->IsOneByteRepresentation();
3364668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  }
3374668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}
3384668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
3394668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
3404668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgbool String::IsTwoByteRepresentationUnderneath() {
3414668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  uint32_t type = map()->instance_type();
3424668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  STATIC_ASSERT(kIsIndirectStringTag != 0);
3434668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
3444668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  ASSERT(IsFlat());
3454668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
346e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    case kOneByteStringTag:
3474668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org      return false;
3484668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    case kTwoByteStringTag:
3494668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org      return true;
3504668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    default:  // Cons or sliced string.  Need to go deeper.
3514668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org      return GetUnderlying()->IsTwoByteRepresentation();
3524668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  }
3534668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}
3544668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
3554668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
356ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgbool String::HasOnlyOneByteChars() {
3575ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org  uint32_t type = map()->instance_type();
358f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return (type & kOneByteDataHintMask) == kOneByteDataHintTag ||
359f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org         IsOneByteRepresentation();
36059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org}
36159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
36259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
363870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool StringShape::IsCons() {
364870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return (type_ & kStringRepresentationMask) == kConsStringTag;
365870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
366870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
367870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
3684668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgbool StringShape::IsSliced() {
3694668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  return (type_ & kStringRepresentationMask) == kSlicedStringTag;
3704668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}
3714668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
3724668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
3734668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgbool StringShape::IsIndirect() {
3744668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  return (type_ & kIsIndirectStringMask) == kIsIndirectStringTag;
3754668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}
3764668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
3774668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
378870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool StringShape::IsExternal() {
379870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return (type_ & kStringRepresentationMask) == kExternalStringTag;
380870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
381870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
382870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
383870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool StringShape::IsSequential() {
384870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return (type_ & kStringRepresentationMask) == kSeqStringTag;
385870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
386870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
387870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
388870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgStringRepresentationTag StringShape::representation_tag() {
389870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  uint32_t tag = (type_ & kStringRepresentationMask);
390870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return static_cast<StringRepresentationTag>(tag);
391870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
392870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
393870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
394ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.orguint32_t StringShape::encoding_tag() {
395ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  return type_ & kStringEncodingMask;
396ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org}
397ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
398ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
399870a0b67c822d289024711912e2512af01b66c3bager@chromium.orguint32_t StringShape::full_representation_tag() {
400870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return (type_ & (kStringRepresentationMask | kStringEncodingMask));
401870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
402870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
403870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
404d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT((kStringRepresentationMask | kStringEncodingMask) ==
40518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org             Internals::kFullStringRepresentationMask);
40618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
407d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT(static_cast<uint32_t>(kStringEncodingMask) ==
40856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org             Internals::kStringEncodingMask);
40956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
41018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
411870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool StringShape::IsSequentialAscii() {
412e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return full_representation_tag() == (kSeqStringTag | kOneByteStringTag);
413870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
414870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
415870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
416870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool StringShape::IsSequentialTwoByte() {
41780787b746bb069464275b81973655617c0c62872ager@chromium.org  return full_representation_tag() == (kSeqStringTag | kTwoByteStringTag);
418870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
419870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
420870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
421870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool StringShape::IsExternalAscii() {
422e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return full_representation_tag() == (kExternalStringTag | kOneByteStringTag);
423870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
424870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
425870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
426d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT((kExternalStringTag | kOneByteStringTag) ==
42756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org             Internals::kExternalAsciiRepresentationTag);
42856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
429d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT(v8::String::ASCII_ENCODING == kOneByteStringTag);
43056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
43156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
432870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool StringShape::IsExternalTwoByte() {
43380787b746bb069464275b81973655617c0c62872ager@chromium.org  return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag);
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
437d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT((kExternalStringTag | kTwoByteStringTag) ==
43818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org             Internals::kExternalTwoByteRepresentationTag);
43918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
440d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgSTATIC_ASSERT(v8::String::TWO_BYTE_ENCODING == kTwoByteStringTag);
44118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org
442a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orguc32 FlatStringReader::Get(int index) {
443a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ASSERT(0 <= index && index <= length_);
444a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  if (is_ascii_) {
445a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    return static_cast<const byte*>(start_)[index];
446a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  } else {
447a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    return static_cast<const uc16*>(start_)[index];
448a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
449a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
450a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
451a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
452865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgHandle<Object> StringTableShape::AsHandle(Isolate* isolate, HashTableKey* key) {
453865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return key->AsHandle(isolate);
454b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org}
455b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org
456b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org
457865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgHandle<Object> MapCacheShape::AsHandle(Isolate* isolate, HashTableKey* key) {
458865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return key->AsHandle(isolate);
459865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
460865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
461865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
462865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgHandle<Object> CompilationCacheShape::AsHandle(Isolate* isolate,
463865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                               HashTableKey* key) {
464865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return key->AsHandle(isolate);
465865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
466865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
467865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
468865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgHandle<Object> CodeCacheHashTableShape::AsHandle(Isolate* isolate,
469865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                                 HashTableKey* key) {
470865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return key->AsHandle(isolate);
471865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org}
472865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
47343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgtemplate <typename Char>
47443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgclass SequentialStringKey : public HashTableKey {
47543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org public:
47643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  explicit SequentialStringKey(Vector<const Char> string, uint32_t seed)
47743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      : string_(string), hash_field_(0), seed_(seed) { }
47843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
479b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual uint32_t Hash() V8_OVERRIDE {
48043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    hash_field_ = StringHasher::HashSequentialString<Char>(string_.start(),
48143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org                                                           string_.length(),
48243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org                                                           seed_);
48343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
48443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    uint32_t result = hash_field_ >> String::kHashShift;
48543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    ASSERT(result != 0);  // Ensure that the hash value of 0 is never computed.
48643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return result;
48743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
48843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
48943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
490b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual uint32_t HashForObject(Object* other) V8_OVERRIDE {
49143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return String::cast(other)->Hash();
49243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
49343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
49443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  Vector<const Char> string_;
49543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  uint32_t hash_field_;
49643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  uint32_t seed_;
49743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org};
49843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
49943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
50043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgclass OneByteStringKey : public SequentialStringKey<uint8_t> {
50143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org public:
50243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  OneByteStringKey(Vector<const uint8_t> str, uint32_t seed)
50343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      : SequentialStringKey<uint8_t>(str, seed) { }
50443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
505b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual bool IsMatch(Object* string) V8_OVERRIDE {
50643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return String::cast(string)->IsOneByteEqualTo(string_);
50743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
50843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
509865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE;
51043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org};
51143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
51243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
51309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.orgtemplate<class Char>
51409cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.orgclass SubStringKey : public HashTableKey {
51543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org public:
51609cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org  SubStringKey(Handle<String> string, int from, int length)
51709cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      : string_(string), from_(from), length_(length) {
51809cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org    if (string_->IsSlicedString()) {
51909cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      string_ = Handle<String>(Unslice(*string_, &from_));
52009cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org    }
52109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org    ASSERT(string_->IsSeqString() || string->IsExternalString());
52209cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org  }
52343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
524b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual uint32_t Hash() V8_OVERRIDE {
52543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    ASSERT(length_ >= 0);
52643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    ASSERT(from_ + length_ <= string_->length());
52709cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org    const Char* chars = GetChars() + from_;
52843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    hash_field_ = StringHasher::HashSequentialString(
52943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org        chars, length_, string_->GetHeap()->HashSeed());
53043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    uint32_t result = hash_field_ >> String::kHashShift;
53143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    ASSERT(result != 0);  // Ensure that the hash value of 0 is never computed.
53243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return result;
53343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
53443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
535b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual uint32_t HashForObject(Object* other) V8_OVERRIDE {
53643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return String::cast(other)->Hash();
53743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
53843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
539b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual bool IsMatch(Object* string) V8_OVERRIDE;
540865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE;
54143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
54243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org private:
54309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org  const Char* GetChars();
54409cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org  String* Unslice(String* string, int* offset) {
54509cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org    while (string->IsSlicedString()) {
54609cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      SlicedString* sliced = SlicedString::cast(string);
54709cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      *offset += sliced->offset();
54809cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org      string = sliced->parent();
54909cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org    }
55009cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org    return string;
55109cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org  }
55209cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org
55309cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org  Handle<String> string_;
55443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  int from_;
55543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  int length_;
55643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  uint32_t hash_field_;
55743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org};
55843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
55943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
56043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgclass TwoByteStringKey : public SequentialStringKey<uc16> {
56143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org public:
56243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed)
56343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      : SequentialStringKey<uc16>(str, seed) { }
56443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
565b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual bool IsMatch(Object* string) V8_OVERRIDE {
56643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return String::cast(string)->IsTwoByteEqualTo(string_);
56743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
56843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
569865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE;
57043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org};
57143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
57243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
57343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org// Utf8StringKey carries a vector of chars as key.
57443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgclass Utf8StringKey : public HashTableKey {
57543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org public:
57643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  explicit Utf8StringKey(Vector<const char> string, uint32_t seed)
57743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      : string_(string), hash_field_(0), seed_(seed) { }
57843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
579b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual bool IsMatch(Object* string) V8_OVERRIDE {
58043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return String::cast(string)->IsUtf8EqualTo(string_);
58143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
58243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
583b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual uint32_t Hash() V8_OVERRIDE {
58443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    if (hash_field_ != 0) return hash_field_ >> String::kHashShift;
58543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_);
58643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    uint32_t result = hash_field_ >> String::kHashShift;
58743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    ASSERT(result != 0);  // Ensure that the hash value of 0 is never computed.
58843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return result;
58943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
59043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
591b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  virtual uint32_t HashForObject(Object* other) V8_OVERRIDE {
59243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    return String::cast(other)->Hash();
59343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
59443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
595865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE {
59643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    if (hash_field_ == 0) Hash();
597865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org    return isolate->factory()->NewInternalizedStringFromUtf8(
598865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org        string_, chars_, hash_field_);
59943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
60043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
60143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  Vector<const char> string_;
60243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  uint32_t hash_field_;
60343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  int chars_;  // Caches the number of characters when computing the hash code.
60443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  uint32_t seed_;
60543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org};
60643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
60743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsNumber() {
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return IsSmi() || IsHeapNumber();
61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
613394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE)
614394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE)
615c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
616c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
617c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool Object::IsFiller() {
618c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (!Object::IsHeapObject()) return false;
619c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  InstanceType instance_type = HeapObject::cast(this)->map()->instance_type();
620c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE;
621c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
622c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
623c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgbool Object::IsExternalArray() {
6253811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  if (!Object::IsHeapObject())
6263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org    return false;
6273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  InstanceType instance_type =
6283811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org      HeapObject::cast(this)->map()->instance_type();
6290c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org  return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE &&
6300c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org          instance_type <= LAST_EXTERNAL_ARRAY_TYPE);
6313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
6323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
6333811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
634af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define TYPED_ARRAY_TYPE_CHECKER(Type, type, TYPE, ctype, size)               \
635af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  TYPE_CHECKER(External##Type##Array, EXTERNAL_##TYPE##_ARRAY_TYPE)           \
636af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  TYPE_CHECKER(Fixed##Type##Array, FIXED_##TYPE##_ARRAY_TYPE)
637af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
638af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTYPED_ARRAYS(TYPED_ARRAY_TYPE_CHECKER)
639af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#undef TYPED_ARRAY_TYPE_CHECKER
6403847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
6413847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
6425c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgbool Object::IsFixedTypedArrayBase() {
6435c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  if (!Object::IsHeapObject()) return false;
6445c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
6455c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  InstanceType instance_type =
6465c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      HeapObject::cast(this)->map()->instance_type();
6475c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
6485c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org          instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE);
6495c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}
6505c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
6515c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
652d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgbool Object::IsJSReceiver() {
653c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
654d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org  return IsHeapObject() &&
655d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org      HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_RECEIVER_TYPE;
656d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}
657d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
658d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsJSObject() {
660c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE);
661c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return IsHeapObject() &&
662c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
663d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}
664d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
665d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
666d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgbool Object::IsJSProxy() {
667c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (!Object::IsHeapObject()) return false;
6688ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org  return  HeapObject::cast(this)->map()->IsJSProxyMap();
669d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org}
670d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
671d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org
672394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSFunctionProxy, JS_FUNCTION_PROXY_TYPE)
673394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSSet, JS_SET_TYPE)
674394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSMap, JS_MAP_TYPE)
6754ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgTYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE)
6764ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgTYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE)
677394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE)
678ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgTYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE)
679394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE)
680394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(Map, MAP_TYPE)
681394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE)
682394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)
683a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgTYPE_CHECKER(ConstantPoolArray, CONSTANT_POOL_ARRAY_TYPE)
6846d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
6856d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
686ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbool Object::IsJSWeakCollection() {
687ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return IsJSWeakMap() || IsJSWeakSet();
688ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
689ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
690ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
69143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsDescriptorArray() {
69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return IsFixedArray();
69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69699aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgbool Object::IsTransitionArray() {
69799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  return IsFixedArray();
69899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org}
69999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
70099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
701a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool Object::IsDeoptimizationInputData() {
702a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Must be a fixed array.
703a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (!IsFixedArray()) return false;
704a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
705a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // There's no sure way to detect the difference between a fixed array and
706a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // a deoptimization data array.  Since this is used for asserts we can
707a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // check that the length is zero or else the fixed size plus a multiple of
708a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // the entry size.
709a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int length = FixedArray::cast(this)->length();
710a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (length == 0) return true;
711a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
712a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  length -= DeoptimizationInputData::kFirstDeoptEntryIndex;
713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return length >= 0 &&
714a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      length % DeoptimizationInputData::kDeoptEntrySize == 0;
715a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
716a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
717a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
718a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool Object::IsDeoptimizationOutputData() {
719a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (!IsFixedArray()) return false;
720a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // There's actually no way to see the difference between a fixed array and
721a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // a deoptimization data array.  Since this is used for asserts we can check
722a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // that the length is plausible though.
723a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (FixedArray::cast(this)->length() % 2 != 0) return false;
724a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return true;
725a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
726a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
727a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
7282e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgbool Object::IsDependentCode() {
729003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  if (!IsFixedArray()) return false;
730003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // There's actually no way to see the difference between a fixed array and
731003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  // a dependent codes array.
732003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  return true;
733003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
734003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
735003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsContext() {
73746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  if (!Object::IsHeapObject()) return false;
73846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Map* map = HeapObject::cast(this)->map();
73946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  Heap* heap = map->GetHeap();
74046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  return (map == heap->function_context_map() ||
74146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      map == heap->catch_context_map() ||
74246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      map == heap->with_context_map() ||
74346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      map == heap->native_context_map() ||
74446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      map == heap->block_context_map() ||
74546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      map == heap->module_context_map() ||
74646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      map == heap->global_context_map());
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgbool Object::IsNativeContext() {
751ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  return Object::IsHeapObject() &&
752ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com      HeapObject::cast(this)->map() ==
75346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      HeapObject::cast(this)->GetHeap()->native_context_map();
754ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}
755ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
756ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
757c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgbool Object::IsScopeInfo() {
7584acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  return Object::IsHeapObject() &&
7594acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org      HeapObject::cast(this)->map() ==
760c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      HeapObject::cast(this)->GetHeap()->scope_info_map();
7614acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org}
7624acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org
7634acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org
764394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE)
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
767c27e4e79503d86932450a812ce8fd6ee6d9a5bdcager@chromium.orgtemplate <> inline bool Is<JSFunction>(Object* obj) {
76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return obj->IsJSFunction();
76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
772394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(Code, CODE_TYPE)
773394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(Oddball, ODDBALL_TYPE)
77441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgTYPE_CHECKER(Cell, CELL_TYPE)
775b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgTYPE_CHECKER(PropertyCell, PROPERTY_CELL_TYPE)
776394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE)
777e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgTYPE_CHECKER(JSGeneratorObject, JS_GENERATOR_OBJECT_TYPE)
778ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comTYPE_CHECKER(JSModule, JS_MODULE_TYPE)
779394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSValue, JS_VALUE_TYPE)
7804efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgTYPE_CHECKER(JSDate, JS_DATE_TYPE)
781394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE)
78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7849fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.orgbool Object::IsStringWrapper() {
7859fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org  return IsJSValue() && JSValue::cast(this)->value()->IsString();
7869fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org}
7879fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org
7889fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org
789394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(Foreign, FOREIGN_TYPE)
79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsBoolean() {
793ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return IsOddball() &&
794ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0);
79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
798394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSArray, JS_ARRAY_TYPE)
799f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgTYPE_CHECKER(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE)
800e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgTYPE_CHECKER(JSTypedArray, JS_TYPED_ARRAY_TYPE)
8011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgTYPE_CHECKER(JSDataView, JS_DATA_VIEW_TYPE)
8021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
8031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
8041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgbool Object::IsJSArrayBufferView() {
8051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return IsJSDataView() || IsJSTypedArray();
8061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
8071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
8081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
809394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE)
810236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
811236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
812c27e4e79503d86932450a812ce8fd6ee6d9a5bdcager@chromium.orgtemplate <> inline bool Is<JSArray>(Object* obj) {
81343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return obj->IsJSArray();
81443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
81543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsHashTable() {
818ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return Object::IsHeapObject() &&
819ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      HeapObject::cast(this)->map() ==
820ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      HeapObject::cast(this)->GetHeap()->hash_table_map();
82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsDictionary() {
8257b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org  return IsHashTable() &&
8264a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      this != HeapObject::cast(this)->GetHeap()->string_table();
82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
82843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgbool Object::IsStringTable() {
831c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  return IsHashTable();
83243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
835ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgbool Object::IsJSFunctionResultCache() {
836ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  if (!IsFixedArray()) return false;
837ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  FixedArray* self = FixedArray::cast(this);
838ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  int length = self->length();
839ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  if (length < JSFunctionResultCache::kEntriesIndex) return false;
840ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  if ((length - JSFunctionResultCache::kEntriesIndex)
841ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org      % JSFunctionResultCache::kEntrySize != 0) {
842ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org    return false;
843ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  }
844c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
845394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  if (FLAG_verify_heap) {
846394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    reinterpret_cast<JSFunctionResultCache*>(this)->
847394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        JSFunctionResultCacheVerify();
848394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
849ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org#endif
850ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  return true;
851ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org}
852ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org
853ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org
85465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.orgbool Object::IsNormalizedMapCache() {
855c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  return NormalizedMapCache::IsNormalizedMapCache(this);
856c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org}
857c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
858c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
859c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.orgint NormalizedMapCache::GetIndex(Handle<Map> map) {
860c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  return map->Hash() % NormalizedMapCache::kEntries;
861c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org}
862c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
863c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org
864c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.orgbool NormalizedMapCache::IsNormalizedMapCache(Object* obj) {
865c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  if (!obj->IsFixedArray()) return false;
866c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org  if (FixedArray::cast(obj)->length() != NormalizedMapCache::kEntries) {
86765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    return false;
86865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  }
869c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
870394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  if (FLAG_verify_heap) {
871c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org    reinterpret_cast<NormalizedMapCache*>(obj)->NormalizedMapCacheVerify();
872394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  }
87365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org#endif
87465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  return true;
87565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org}
87665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
87765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
878b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgbool Object::IsCompilationCacheTable() {
879b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  return IsHashTable();
8809258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org}
8819258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
8829258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
883ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgbool Object::IsCodeCacheHashTable() {
884ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  return IsHashTable();
885ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
886ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
887ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
888e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgbool Object::IsPolymorphicCodeCacheHashTable() {
889e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org  return IsHashTable();
890e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org}
891e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
892e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
893236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgbool Object::IsMapCache() {
894236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  return IsHashTable();
895236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org}
896236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
897236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
898e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.orgbool Object::IsObjectHashTable() {
899e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  return IsHashTable();
900e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
901e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
902e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
9039e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgbool Object::IsOrderedHashTable() {
9049e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return IsHeapObject() &&
9059e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org      HeapObject::cast(this)->map() ==
9069e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org      HeapObject::cast(this)->GetHeap()->ordered_hash_table_map();
9079e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
9089e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
9099e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsPrimitive() {
91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return IsOddball() || IsNumber() || IsString();
91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9155a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgbool Object::IsJSGlobalProxy() {
9165a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  bool result = IsHeapObject() &&
9175a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                (HeapObject::cast(this)->map()->instance_type() ==
9185a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                 JS_GLOBAL_PROXY_TYPE);
919bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(!result ||
920bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org         HeapObject::cast(this)->map()->is_access_check_needed());
9215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return result;
9225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
9235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
9245a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
92543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsGlobalObject() {
9265a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  if (!IsHeapObject()) return false;
9275a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
9289bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org  InstanceType type = HeapObject::cast(this)->map()->instance_type();
9295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return type == JS_GLOBAL_OBJECT_TYPE ||
9305a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org         type == JS_BUILTINS_OBJECT_TYPE;
93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
934394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE)
935394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comTYPE_CHECKER(JSBuiltinsObject, JS_BUILTINS_OBJECT_TYPE)
93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsUndetectableObject() {
93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return IsHeapObject()
94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    && HeapObject::cast(this)->map()->is_undetectable();
94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsAccessCheckNeeded() {
945bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (!IsHeapObject()) return false;
946bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (IsJSGlobalProxy()) {
947bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    JSGlobalProxy* proxy = JSGlobalProxy::cast(this);
948bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    GlobalObject* global =
949bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org        proxy->GetIsolate()->context()->global_object();
950bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    return proxy->IsDetachedFrom(global);
951bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
952bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  return HeapObject::cast(this)->map()->is_access_check_needed();
95343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsStruct() {
95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!IsHeapObject()) return false;
95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  switch (HeapObject::cast(this)->map()->instance_type()) {
95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true;
96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  STRUCT_LIST(MAKE_STRUCT_CASE)
96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef MAKE_STRUCT_CASE
96243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    default: return false;
96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define MAKE_STRUCT_PREDICATE(NAME, Name, name)                  \
96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool Object::Is##Name() {                                      \
96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Object::IsHeapObject()                                \
97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \
97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
97243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  STRUCT_LIST(MAKE_STRUCT_PREDICATE)
97343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef MAKE_STRUCT_PREDICATE
97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsUndefined() {
977ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUndefined;
97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsNull() {
982ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kNull;
983ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
984ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
985ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
986ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool Object::IsTheHole() {
987ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTheHole;
98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
991a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgbool Object::IsException() {
992a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kException;
993a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org}
994a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
995a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
9961fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgbool Object::IsUninitialized() {
9971fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUninitialized;
9981fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
9991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
10001fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
100143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsTrue() {
1002ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTrue;
100343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
100443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
100543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
100643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsFalse() {
1007ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse;
100843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
100943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1011d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.orgbool Object::IsArgumentsMarker() {
1012ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker;
1013d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org}
1014d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
1015d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org
101643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansendouble Object::Number() {
101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(IsNumber());
101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return IsSmi()
101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ? static_cast<double>(reinterpret_cast<Smi*>(this)->value())
102043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    : reinterpret_cast<HeapNumber*>(this)->value();
102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
102243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10244efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgbool Object::IsNaN() {
102577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  return this->IsHeapNumber() && std::isnan(HeapNumber::cast(this)->value());
10264efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org}
10274efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
10284efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
10293484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.orgMaybeHandle<Smi> Object::ToSmi(Isolate* isolate, Handle<Object> object) {
10303484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  if (object->IsSmi()) return Handle<Smi>::cast(object);
103169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  if (object->IsHeapNumber()) {
103269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    double value = Handle<HeapNumber>::cast(object)->value();
103369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    int int_value = FastD2I(value);
103469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    if (value == FastI2D(int_value) && Smi::IsValid(int_value)) {
103569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      return handle(Smi::FromInt(int_value), isolate);
103669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org    }
103769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  }
10383484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  return Handle<Smi>();
103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
104274dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.orgMaybeHandle<JSReceiver> Object::ToObject(Isolate* isolate,
104374dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org                                         Handle<Object> object) {
104474dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org  return ToObject(
104574dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org      isolate, object, handle(isolate->context()->native_context(), isolate));
104674dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org}
104774dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
104874dd215b1e842a92a4731fb20f999fc0d5004a94machenbach@chromium.org
10495a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgbool Object::HasSpecificClassOf(String* name) {
10505a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return this->IsJSObject() && (JSObject::cast(this)->class_name() == name);
10515a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
10525a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
10535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
10542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Object::GetProperty(Handle<Object> object,
10552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                        Handle<Name> name) {
10568ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org  LookupIterator it(object, name);
10578ddb15e9094939a28890ee8bbc7f7fa246ecea49machenbach@chromium.org  return GetProperty(&it);
10582ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
10592ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
10602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
1061202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgMaybeHandle<Object> Object::GetElement(Isolate* isolate,
1062202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org                                       Handle<Object> object,
1063202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org                                       uint32_t index) {
10645d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // GetElement can trigger a getter which can cause allocation.
10655d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // This was not always the case. This ASSERT is here to catch
10665d6c1f5b20195b800bc6db146920fd6f878d1fd4vegorov@chromium.org  // leftover incorrect uses.
106779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  ASSERT(AllowHeapAllocation::IsAllowed());
1068b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  return Object::GetElementWithReceiver(isolate, object, object, index);
106943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Object::GetPropertyOrElement(Handle<Object> object,
10732ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                                 Handle<Name> name) {
10742ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  uint32_t index;
10752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Isolate* isolate = name->GetIsolate();
10762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if (name->AsArrayIndex(&index)) return GetElement(isolate, object, index);
10772ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return GetProperty(object, name);
10782ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
10792ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
10802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
10819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgMaybeHandle<Object> Object::GetProperty(Isolate* isolate,
10829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org                                        Handle<Object> object,
10839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org                                        const char* name) {
10849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<String> str = isolate->factory()->InternalizeUtf8String(name);
10859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ASSERT(!str.is_null());
10869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org#ifdef DEBUG
10879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  uint32_t index;  // Assert that the name is not an array index.
10889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ASSERT(!str->AsArrayIndex(&index));
10899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org#endif  // DEBUG
10909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  return GetProperty(object, str);
10919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
10929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
10939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
10942ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> JSProxy::GetElementWithHandler(Handle<JSProxy> proxy,
10952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                                   Handle<Object> receiver,
10967010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org                                                   uint32_t index) {
10972ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return GetPropertyWithHandler(
10982ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      proxy, receiver, proxy->GetIsolate()->factory()->Uint32ToString(index));
1099303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org}
1100303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org
1101303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org
11022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> JSProxy::SetElementWithHandler(Handle<JSProxy> proxy,
11032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                                   Handle<JSReceiver> receiver,
11042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                                   uint32_t index,
11052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                                   Handle<Object> value,
11062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                                   StrictMode strict_mode) {
11072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Isolate* isolate = proxy->GetIsolate();
11082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<String> name = isolate->factory()->Uint32ToString(index);
11092ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return SetPropertyWithHandler(
11102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      proxy, receiver, name, value, NONE, strict_mode);
11112ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
11122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
11132ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
11142ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgbool JSProxy::HasElementWithHandler(Handle<JSProxy> proxy, uint32_t index) {
11152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Isolate* isolate = proxy->GetIsolate();
11162ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<String> name = isolate->factory()->Uint32ToString(index);
11172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return HasPropertyWithHandler(proxy, name);
111843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
111943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define FIELD_ADDR(p, offset) \
112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag)
112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define READ_FIELD(p, offset) \
112543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)))
112643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11271e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#define ACQUIRE_READ_FIELD(p, offset)           \
11281e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  reinterpret_cast<Object*>(base::Acquire_Load( \
11291e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset))))
113063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
11311e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#define NOBARRIER_READ_FIELD(p, offset)           \
11321e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  reinterpret_cast<Object*>(base::NoBarrier_Load( \
11331e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset))))
113463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
113543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define WRITE_FIELD(p, offset, value) \
113643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value)
113743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11381e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#define RELEASE_WRITE_FIELD(p, offset, value)                     \
11391e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  base::Release_Store(                                            \
11401e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset)), \
11411e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<base::AtomicWord>(value));
114263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
11431e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#define NOBARRIER_WRITE_FIELD(p, offset, value)                   \
11441e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  base::NoBarrier_Store(                                          \
11451e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset)), \
11461e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<base::AtomicWord>(value));
114763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
1148c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define WRITE_BARRIER(heap, object, offset, value)                      \
1149c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  heap->incremental_marking()->RecordWrite(                             \
1150c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      object, HeapObject::RawField(object, offset), value);             \
1151c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (heap->InNewSpace(value)) {                                        \
1152c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    heap->RecordWrite(object->address(), offset);                       \
1153c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
1154c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1155c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode)    \
1156c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (mode == UPDATE_WRITE_BARRIER) {                                   \
1157c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    heap->incremental_marking()->RecordWrite(                           \
1158c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      object, HeapObject::RawField(object, offset), value);             \
1159c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (heap->InNewSpace(value)) {                                      \
1160c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      heap->RecordWrite(object->address(), offset);                     \
1161c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }                                                                   \
11625a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  }
11635a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
11647516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#ifndef V8_TARGET_ARCH_MIPS
11657516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  #define READ_DOUBLE_FIELD(p, offset) \
11667516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)))
11677516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#else  // V8_TARGET_ARCH_MIPS
11687516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Prevent gcc from using load-double (mips ldc1) on (possibly)
11697516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // non-64-bit aligned HeapNumber::value.
11706d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  static inline double read_double_field(void* p, int offset) {
11717516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    union conversion {
11727516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      double d;
11737516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      uint32_t u[2];
11747516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    } c;
11757516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    c.u[0] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)));
11767516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    c.u[1] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4)));
11777516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    return c.d;
11787516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
11797516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  #define READ_DOUBLE_FIELD(p, offset) read_double_field(p, offset)
11807516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif  // V8_TARGET_ARCH_MIPS
11817516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org
11827516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#ifndef V8_TARGET_ARCH_MIPS
11837516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  #define WRITE_DOUBLE_FIELD(p, offset, value) \
11847516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value)
11857516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#else  // V8_TARGET_ARCH_MIPS
11867516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // Prevent gcc from using store-double (mips sdc1) on (possibly)
11877516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  // non-64-bit aligned HeapNumber::value.
11886d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  static inline void write_double_field(void* p, int offset,
11897516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org                                        double value) {
11907516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    union conversion {
11917516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      double d;
11927516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org      uint32_t u[2];
11937516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    } c;
11947516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    c.d = value;
11957516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) = c.u[0];
11967516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4))) = c.u[1];
11977516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  }
11987516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org  #define WRITE_DOUBLE_FIELD(p, offset, value) \
11997516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org    write_double_field(p, offset, value)
12007516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#endif  // V8_TARGET_ARCH_MIPS
120143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
120243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
120343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define READ_INT_FIELD(p, offset) \
120443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)))
120543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
120643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define WRITE_INT_FIELD(p, offset, value) \
120743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value)
120843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12093e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org#define READ_INTPTR_FIELD(p, offset) \
12103e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)))
12113e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
12123e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org#define WRITE_INTPTR_FIELD(p, offset, value) \
12133e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org  (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value)
12143e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org
12157c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org#define READ_UINT32_FIELD(p, offset) \
12167c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)))
12177c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
12187c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org#define WRITE_UINT32_FIELD(p, offset, value) \
12197c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value)
12207c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1221a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org#define READ_INT32_FIELD(p, offset) \
1222a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  (*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset)))
1223a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
1224a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org#define WRITE_INT32_FIELD(p, offset, value) \
1225a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  (*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset)) = value)
1226a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
122788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org#define READ_INT64_FIELD(p, offset) \
122888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)))
122988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org
123088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org#define WRITE_INT64_FIELD(p, offset, value) \
123188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value)
123288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org
123343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define READ_SHORT_FIELD(p, offset) \
123443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)))
123543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define WRITE_SHORT_FIELD(p, offset, value) \
123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value)
123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
123943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define READ_BYTE_FIELD(p, offset) \
124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)))
124143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12421e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#define NOBARRIER_READ_BYTE_FIELD(p, offset) \
12431e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  static_cast<byte>(base::NoBarrier_Load(    \
12441e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<base::Atomic8*>(FIELD_ADDR(p, offset))))
12455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
124643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define WRITE_BYTE_FIELD(p, offset, value) \
124743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value)
124843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12491e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#define NOBARRIER_WRITE_BYTE_FIELD(p, offset, value)           \
12501e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  base::NoBarrier_Store(                                       \
12511e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      reinterpret_cast<base::Atomic8*>(FIELD_ADDR(p, offset)), \
12521e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org      static_cast<base::Atomic8>(value));
125343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12549bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.orgObject** HeapObject::RawField(HeapObject* obj, int byte_offset) {
12559bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org  return &READ_FIELD(obj, byte_offset);
125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
125743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
125843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
125943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint Smi::value() {
126018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  return Internals::SmiValue(this);
126143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
126243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
126443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenSmi* Smi::FromInt(int value) {
126543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(Smi::IsValid(value));
1266bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return reinterpret_cast<Smi*>(Internals::IntToSmi(value));
12679085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org}
12689085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
12699085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
12709085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgSmi* Smi::FromIntptr(intptr_t value) {
12719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  ASSERT(Smi::IsValid(value));
12729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
12739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag);
127443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
127543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
127643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1277ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.orgbool Smi::IsValid(intptr_t value) {
1278bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  bool result = Internals::IsValidSmi(value);
1279bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  ASSERT_EQ(result, value >= kMinValue && value <= kMaxValue);
12809085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return result;
12819085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org}
12829085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
12839085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
12847276f14ca716596e0a0d17539516370c1f453847kasper.lundMapWord MapWord::FromMap(Map* map) {
12857276f14ca716596e0a0d17539516370c1f453847kasper.lund  return MapWord(reinterpret_cast<uintptr_t>(map));
12867276f14ca716596e0a0d17539516370c1f453847kasper.lund}
12877276f14ca716596e0a0d17539516370c1f453847kasper.lund
12887276f14ca716596e0a0d17539516370c1f453847kasper.lund
12897276f14ca716596e0a0d17539516370c1f453847kasper.lundMap* MapWord::ToMap() {
12907276f14ca716596e0a0d17539516370c1f453847kasper.lund  return reinterpret_cast<Map*>(value_);
12917276f14ca716596e0a0d17539516370c1f453847kasper.lund}
12927276f14ca716596e0a0d17539516370c1f453847kasper.lund
12937276f14ca716596e0a0d17539516370c1f453847kasper.lund
12947276f14ca716596e0a0d17539516370c1f453847kasper.lundbool MapWord::IsForwardingAddress() {
12957c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  return HAS_SMI_TAG(reinterpret_cast<Object*>(value_));
12967276f14ca716596e0a0d17539516370c1f453847kasper.lund}
12977276f14ca716596e0a0d17539516370c1f453847kasper.lund
12987276f14ca716596e0a0d17539516370c1f453847kasper.lund
12997276f14ca716596e0a0d17539516370c1f453847kasper.lundMapWord MapWord::FromForwardingAddress(HeapObject* object) {
13007c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag;
13017c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  return MapWord(reinterpret_cast<uintptr_t>(raw));
13027276f14ca716596e0a0d17539516370c1f453847kasper.lund}
13037276f14ca716596e0a0d17539516370c1f453847kasper.lund
13047276f14ca716596e0a0d17539516370c1f453847kasper.lund
13057276f14ca716596e0a0d17539516370c1f453847kasper.lundHeapObject* MapWord::ToForwardingAddress() {
13067276f14ca716596e0a0d17539516370c1f453847kasper.lund  ASSERT(IsForwardingAddress());
13077c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  return HeapObject::FromAddress(reinterpret_cast<Address>(value_));
13087276f14ca716596e0a0d17539516370c1f453847kasper.lund}
13097276f14ca716596e0a0d17539516370c1f453847kasper.lund
13107276f14ca716596e0a0d17539516370c1f453847kasper.lund
1311c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
131243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HeapObject::VerifyObjectField(int offset) {
131343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  VerifyPointer(READ_FIELD(this, offset));
131443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
131530ce411529579186181838984710b0b0980857aaricow@chromium.org
131630ce411529579186181838984710b0b0980857aaricow@chromium.orgvoid HeapObject::VerifySmiField(int offset) {
1317c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org  CHECK(READ_FIELD(this, offset)->IsSmi());
131830ce411529579186181838984710b0b0980857aaricow@chromium.org}
131943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
132043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
132143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1322ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgHeap* HeapObject::GetHeap() {
1323c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Heap* heap =
1324c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      MemoryChunk::FromAddress(reinterpret_cast<Address>(this))->heap();
1325ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org  SLOW_ASSERT(heap != NULL);
1326c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return heap;
1327ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
1328ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1329ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1330ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgIsolate* HeapObject::GetIsolate() {
1331ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return GetHeap()->isolate();
1332ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
1333ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1334ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
133543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMap* HeapObject::map() {
1336196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#ifdef DEBUG
1337196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Clear mark potentially added by PathTracer.
1338196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uintptr_t raw_value =
1339196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      map_word().ToRawValue() & ~static_cast<uintptr_t>(PathTracer::kMarkTag);
1340196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return MapWord::FromRawValue(raw_value).ToMap();
1341196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#else
13427276f14ca716596e0a0d17539516370c1f453847kasper.lund  return map_word().ToMap();
1343196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#endif
134443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
134543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
134643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
134743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HeapObject::set_map(Map* value) {
13487276f14ca716596e0a0d17539516370c1f453847kasper.lund  set_map_word(MapWord::FromMap(value));
1349c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (value != NULL) {
1350c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    // TODO(1600) We are passing NULL as a slot because maps can never be on
1351c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    // evacuation candidate.
1352c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    value->GetHeap()->incremental_marking()->RecordWrite(this, NULL, value);
1353c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
1354c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1355c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1356c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
135763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgMap* HeapObject::synchronized_map() {
135863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  return synchronized_map_word().ToMap();
135963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org}
136063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
136163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
136263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgvoid HeapObject::synchronized_set_map(Map* value) {
136363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  synchronized_set_map_word(MapWord::FromMap(value));
136463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  if (value != NULL) {
136563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    // TODO(1600) We are passing NULL as a slot because maps can never be on
136663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    // evacuation candidate.
136763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org    value->GetHeap()->incremental_marking()->RecordWrite(this, NULL, value);
136863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  }
136963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org}
137063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
137163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
13729e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgvoid HeapObject::synchronized_set_map_no_write_barrier(Map* value) {
13739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  synchronized_set_map_word(MapWord::FromMap(value));
13749e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
13759e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
13769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
1377c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Unsafe accessor omitting write barrier.
137864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid HeapObject::set_map_no_write_barrier(Map* value) {
1379c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  set_map_word(MapWord::FromMap(value));
13807276f14ca716596e0a0d17539516370c1f453847kasper.lund}
13817276f14ca716596e0a0d17539516370c1f453847kasper.lund
13827276f14ca716596e0a0d17539516370c1f453847kasper.lund
13837276f14ca716596e0a0d17539516370c1f453847kasper.lundMapWord HeapObject::map_word() {
138463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  return MapWord(
13859e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org      reinterpret_cast<uintptr_t>(NOBARRIER_READ_FIELD(this, kMapOffset)));
138643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
138743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
138843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13897276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid HeapObject::set_map_word(MapWord map_word) {
13909e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  NOBARRIER_WRITE_FIELD(
139163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org      this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
139263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org}
139363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
139463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
139563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgMapWord HeapObject::synchronized_map_word() {
139663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  return MapWord(
139763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org      reinterpret_cast<uintptr_t>(ACQUIRE_READ_FIELD(this, kMapOffset)));
139863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org}
139963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
140063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
140163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgvoid HeapObject::synchronized_set_map_word(MapWord map_word) {
140263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  RELEASE_WRITE_FIELD(
140363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org      this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
14047276f14ca716596e0a0d17539516370c1f453847kasper.lund}
140543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
140643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
140743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHeapObject* HeapObject::FromAddress(Address address) {
140843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT_TAG_ALIGNED(address);
140943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return reinterpret_cast<HeapObject*>(address + kHeapObjectTag);
141043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
141143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenAddress HeapObject::address() {
141443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return reinterpret_cast<Address>(this) - kHeapObjectTag;
141543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
141643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
141843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint HeapObject::Size() {
141943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return SizeFromMap(map());
142043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
142143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
142243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
142343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) {
142443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)),
142543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                   reinterpret_cast<Object**>(FIELD_ADDR(this, end)));
142643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
142743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
142843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
142943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HeapObject::IteratePointer(ObjectVisitor* v, int offset) {
143043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  v->VisitPointer(reinterpret_cast<Object**>(FIELD_ADDR(this, offset)));
143143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
143243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
143343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1434895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid HeapObject::IterateNextCodeLink(ObjectVisitor* v, int offset) {
1435895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  v->VisitNextCodeLink(reinterpret_cast<Object**>(FIELD_ADDR(this, offset)));
1436895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
1437895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
1438895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
143943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansendouble HeapNumber::value() {
144043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_DOUBLE_FIELD(this, kValueOffset);
144143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
144243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
144343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
144443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid HeapNumber::set_value(double value) {
144543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_DOUBLE_FIELD(this, kValueOffset, value);
144643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
144743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
144843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1449cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgint HeapNumber::get_exponent() {
1450cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  return ((READ_INT_FIELD(this, kExponentOffset) & kExponentMask) >>
1451cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org          kExponentShift) - kExponentBias;
1452cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org}
1453cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
1454cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
1455cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgint HeapNumber::get_sign() {
1456cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  return READ_INT_FIELD(this, kExponentOffset) & kSignMask;
1457cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org}
1458cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
1459cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
146043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
14610b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
14620b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
146364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgObject** FixedArray::GetFirstElementAddress() {
146464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0)));
146564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
146664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
146764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
146864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgbool FixedArray::ContainsOnlySmisOrHoles() {
146964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  Object* the_hole = GetHeap()->the_hole_value();
147064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  Object** current = GetFirstElementAddress();
147164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  for (int i = 0; i < length(); ++i) {
147264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    Object* candidate = *current++;
147364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    if (!candidate->IsSmi() && candidate != the_hole) return false;
147464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
147564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  return true;
147664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
147764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
147864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
14794acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgFixedArrayBase* JSObject::elements() {
14800b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  Object* array = READ_FIELD(this, kElementsOffset);
14814acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  return static_cast<FixedArrayBase*>(array);
14820b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
14830b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
1484830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org
148549ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.orgvoid JSObject::ValidateElements(Handle<JSObject> object) {
1486ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org#ifdef ENABLE_SLOW_ASSERTS
1487830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (FLAG_enable_slow_asserts) {
148849ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org    ElementsAccessor* accessor = object->GetElementsAccessor();
148949ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org    accessor->Validate(object);
1490c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
1491c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif
1492c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1493c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1494c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1495528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgvoid AllocationSite::Initialize() {
1496b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  set_transition_info(Smi::FromInt(0));
1497528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  SetElementsKind(GetInitialFastElementsKind());
14983d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  set_nested_site(Smi::FromInt(0));
14994ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  set_pretenure_data(Smi::FromInt(0));
15004ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  set_pretenure_create_count(Smi::FromInt(0));
1501528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  set_dependent_code(DependentCode::cast(GetHeap()->empty_fixed_array()),
1502528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                     SKIP_WRITE_BARRIER);
1503528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org}
1504528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
1505528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
1506c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgvoid AllocationSite::MarkZombie() {
1507c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  ASSERT(!IsZombie());
15089cbaabda8b4daeb06759ace10c926ab55bb69d7bulan@chromium.org  Initialize();
15094ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  set_pretenure_decision(kZombie);
1510c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org}
1511c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1512c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1513ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// Heuristic: We only need to create allocation site info if the boilerplate
1514ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// elements kind is the initial elements kind.
1515bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.orgAllocationSiteMode AllocationSite::GetMode(
1516ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    ElementsKind boilerplate_elements_kind) {
151769f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  if (FLAG_pretenuring_call_new ||
151869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      IsFastSmiElementsKind(boilerplate_elements_kind)) {
1519ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return TRACK_ALLOCATION_SITE;
1520ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
1521ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1522ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  return DONT_TRACK_ALLOCATION_SITE;
1523ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org}
1524ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1525ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1526bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.orgAllocationSiteMode AllocationSite::GetMode(ElementsKind from,
1527bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org                                           ElementsKind to) {
152869f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  if (FLAG_pretenuring_call_new ||
152969f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      (IsFastSmiElementsKind(from) &&
153069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org       IsMoreGeneralElementsKindTransition(from, to))) {
1531ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return TRACK_ALLOCATION_SITE;
1532ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
1533ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1534ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  return DONT_TRACK_ALLOCATION_SITE;
1535ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org}
1536ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1537ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
1538662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orginline bool AllocationSite::CanTrack(InstanceType type) {
1539c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  if (FLAG_allocation_site_pretenuring) {
15400f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org    return type == JS_ARRAY_TYPE ||
15410f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org        type == JS_OBJECT_TYPE ||
15420f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org        type < FIRST_NONSTRING_TYPE;
1543c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
1544662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  return type == JS_ARRAY_TYPE;
1545662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
1546662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1547662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
1548b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orginline DependentCode::DependencyGroup AllocationSite::ToDependencyGroup(
1549b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org    Reason reason) {
1550b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  switch (reason) {
1551b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org    case TENURING:
1552b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org      return DependentCode::kAllocationSiteTenuringChangedGroup;
1553b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org      break;
1554b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org    case TRANSITIONS:
1555b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org      return DependentCode::kAllocationSiteTransitionChangedGroup;
1556b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org      break;
1557b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  }
1558b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  UNREACHABLE();
1559b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  return DependentCode::kAllocationSiteTransitionChangedGroup;
1560b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org}
1561b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
1562b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org
15634ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.orginline void AllocationSite::set_memento_found_count(int count) {
15644ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  int value = pretenure_data()->value();
15654ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  // Verify that we can count more mementos than we can possibly find in one
15664ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  // new space collection.
15674ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  ASSERT((GetHeap()->MaxSemiSpaceSize() /
15684ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org          (StaticVisitorBase::kMinObjectSizeInWords * kPointerSize +
15694ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org           AllocationMemento::kSize)) < MementoFoundCountBits::kMax);
15704ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  ASSERT(count < MementoFoundCountBits::kMax);
15714ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  set_pretenure_data(
15724ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org      Smi::FromInt(MementoFoundCountBits::update(value, count)),
15734ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org      SKIP_WRITE_BARRIER);
15744ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org}
15754ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org
157671ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.orginline bool AllocationSite::IncrementMementoFoundCount() {
157771ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org  if (IsZombie()) return false;
157871ea97f146aa116d61baeba1912b87a60feda71fhpayer@chromium.org
15794ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  int value = memento_found_count();
15804ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  set_memento_found_count(value + 1);
1581d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return memento_found_count() == kPretenureMinimumCreated;
1582c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org}
1583c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1584c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1585c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orginline void AllocationSite::IncrementMementoCreateCount() {
1586c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  ASSERT(FLAG_allocation_site_pretenuring);
15874ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  int value = memento_create_count();
15884ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  set_memento_create_count(value + 1);
1589c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org}
1590c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1591c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1592196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orginline bool AllocationSite::MakePretenureDecision(
1593196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    PretenureDecision current_decision,
1594196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    double ratio,
1595196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    bool maximum_size_scavenge) {
1596196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Here we just allow state transitions from undecided or maybe tenure
1597196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // to don't tenure, maybe tenure, or tenure.
1598196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if ((current_decision == kUndecided || current_decision == kMaybeTenure)) {
1599196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    if (ratio >= kPretenureRatio) {
1600196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      // We just transition into tenure state when the semi-space was at
1601196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      // maximum capacity.
1602196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      if (maximum_size_scavenge) {
1603196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        set_deopt_dependent_code(true);
1604196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        set_pretenure_decision(kTenure);
1605196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        // Currently we just need to deopt when we make a state transition to
1606196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        // tenure.
1607196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        return true;
1608196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      }
1609196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      set_pretenure_decision(kMaybeTenure);
1610196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    } else {
1611196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      set_pretenure_decision(kDontTenure);
1612196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    }
1613196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
1614196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return false;
1615196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
1616196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
1617196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
1618196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orginline bool AllocationSite::DigestPretenuringFeedback(
1619196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    bool maximum_size_scavenge) {
1620196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  bool deopt = false;
16214ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  int create_count = memento_create_count();
162225530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  int found_count = memento_found_count();
162325530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  bool minimum_mementos_created = create_count >= kPretenureMinimumCreated;
162425530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  double ratio =
162525530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org      minimum_mementos_created || FLAG_trace_pretenuring_statistics ?
162625530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org          static_cast<double>(found_count) / create_count : 0.0;
1627196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  PretenureDecision current_decision = pretenure_decision();
1628196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
1629196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (minimum_mementos_created) {
1630196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    deopt = MakePretenureDecision(
1631196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        current_decision, ratio, maximum_size_scavenge);
1632c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
1633c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
163425530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  if (FLAG_trace_pretenuring_statistics) {
163525530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org    PrintF(
163625530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org        "AllocationSite(%p): (created, found, ratio) (%d, %d, %f) %s => %s\n",
163725530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org         static_cast<void*>(this), create_count, found_count, ratio,
1638196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org         PretenureDecisionName(current_decision),
1639196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org         PretenureDecisionName(pretenure_decision()));
164025530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  }
164125530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org
1642c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  // Clear feedback calculation fields until the next gc.
16434ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  set_memento_found_count(0);
16444ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org  set_memento_create_count(0);
1645196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return deopt;
1646c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org}
1647c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1648c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1649c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.orgvoid JSObject::EnsureCanContainHeapObjectElements(Handle<JSObject> object) {
165049ff8125753a4cb137f5e549671d42c7ca47ade5machenbach@chromium.org  JSObject::ValidateElements(object);
1651c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ElementsKind elements_kind = object->map()->elements_kind();
1652830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  if (!IsFastObjectElementsKind(elements_kind)) {
1653830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    if (IsFastHoleyElementsKind(elements_kind)) {
1654c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      TransitionElementsKind(object, FAST_HOLEY_ELEMENTS);
1655830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    } else {
1656c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org      TransitionElementsKind(object, FAST_ELEMENTS);
1657830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    }
1658c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
1659c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1660c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1661c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1662a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgvoid JSObject::EnsureCanContainElements(Handle<JSObject> object,
1663a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                                        Object** objects,
1664a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                                        uint32_t count,
1665a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org                                        EnsureElementsMode mode) {
1666a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  ElementsKind current_kind = object->map()->elements_kind();
166764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  ElementsKind target_kind = current_kind;
1668a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  {
1669a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    DisallowHeapAllocation no_allocation;
1670a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    ASSERT(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
1671a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    bool is_holey = IsFastHoleyElementsKind(current_kind);
1672a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    if (current_kind == FAST_HOLEY_ELEMENTS) return;
1673a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    Heap* heap = object->GetHeap();
1674a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    Object* the_hole = heap->the_hole_value();
1675a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    for (uint32_t i = 0; i < count; ++i) {
1676a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      Object* current = *objects++;
1677a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      if (current == the_hole) {
1678a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        is_holey = true;
1679a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        target_kind = GetHoleyElementsKind(target_kind);
1680a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org      } else if (!current->IsSmi()) {
1681a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && current->IsNumber()) {
1682a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org          if (IsFastSmiElementsKind(target_kind)) {
1683a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org            if (is_holey) {
1684a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org              target_kind = FAST_HOLEY_DOUBLE_ELEMENTS;
1685a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org            } else {
1686a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org              target_kind = FAST_DOUBLE_ELEMENTS;
1687a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org            }
1688830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org          }
1689a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        } else if (is_holey) {
1690a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org          target_kind = FAST_HOLEY_ELEMENTS;
1691a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org          break;
1692a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        } else {
1693a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org          target_kind = FAST_ELEMENTS;
1694830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org        }
1695c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      }
1696c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }
1697c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
169864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  if (target_kind != current_kind) {
1699a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    TransitionElementsKind(object, target_kind);
170064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
1701c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1702c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1703c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1704fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgvoid JSObject::EnsureCanContainElements(Handle<JSObject> object,
1705fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org                                        Handle<FixedArrayBase> elements,
1706fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org                                        uint32_t length,
1707fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org                                        EnsureElementsMode mode) {
1708a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  Heap* heap = object->GetHeap();
1709a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  if (elements->map() != heap->fixed_double_array_map()) {
1710a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    ASSERT(elements->map() == heap->fixed_array_map() ||
1711a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org           elements->map() == heap->fixed_cow_array_map());
171264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    if (mode == ALLOW_COPIED_DOUBLE_ELEMENTS) {
171364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org      mode = DONT_ALLOW_DOUBLE_ELEMENTS;
171464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    }
1715a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    Object** objects =
1716a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        Handle<FixedArray>::cast(elements)->GetFirstElementAddress();
1717a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    EnsureCanContainElements(object, objects, length, mode);
1718a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    return;
171964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
172064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
172164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  ASSERT(mode == ALLOW_COPIED_DOUBLE_ELEMENTS);
1722a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  if (object->GetElementsKind() == FAST_HOLEY_SMI_ELEMENTS) {
1723a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS);
1724a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org  } else if (object->GetElementsKind() == FAST_SMI_ELEMENTS) {
1725a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    Handle<FixedDoubleArray> double_array =
1726a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        Handle<FixedDoubleArray>::cast(elements);
1727830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    for (uint32_t i = 0; i < length; ++i) {
1728830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org      if (double_array->is_the_hole(i)) {
1729a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS);
1730a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org        return;
1731830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org      }
1732830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org    }
1733a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org    TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS);
173464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
1735c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1736c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
17370b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
173863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgvoid JSObject::SetMapAndElements(Handle<JSObject> object,
173963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org                                 Handle<Map> new_map,
174063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org                                 Handle<FixedArrayBase> value) {
174163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  JSObject::MigrateToMap(object, new_map);
174263a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  ASSERT((object->map()->has_fast_smi_or_object_elements() ||
174363a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org          (*value == object->GetHeap()->empty_fixed_array())) ==
174463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org         (value->map() == object->GetHeap()->fixed_array_map() ||
174563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org          value->map() == object->GetHeap()->fixed_cow_array_map()));
174663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  ASSERT((*value == object->GetHeap()->empty_fixed_array()) ||
174763a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org         (object->map()->has_fast_double_elements() ==
174863a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org          value->IsFixedDoubleArray()));
174963a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  object->set_elements(*value);
17500b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
175143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
175243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17533c93e774a3c6dc64c4d10d9cc7d5e071f0e8a28esvenpanne@chromium.orgvoid JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) {
175463a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  WRITE_FIELD(this, kElementsOffset, value);
175563a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
17563c93e774a3c6dc64c4d10d9cc7d5e071f0e8a28esvenpanne@chromium.org}
17573c93e774a3c6dc64c4d10d9cc7d5e071f0e8a28esvenpanne@chromium.org
17583c93e774a3c6dc64c4d10d9cc7d5e071f0e8a28esvenpanne@chromium.org
175943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid JSObject::initialize_properties() {
1760ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
1761ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array());
176243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
176343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
176443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
176543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid JSObject::initialize_elements() {
17665b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  FixedArrayBase* elements = map()->GetInitialElements();
17675b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  WRITE_FIELD(this, kElementsOffset, elements);
176840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org}
176940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org
177040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org
1771e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgHandle<String> JSObject::ExpectedTransitionKey(Handle<Map> map) {
177279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  DisallowHeapAllocation no_gc;
1773e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (!map->HasTransitionArray()) return Handle<String>::null();
1774e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  TransitionArray* transitions = map->transitions();
1775e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (!transitions->IsSimpleTransition()) return Handle<String>::null();
1776e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  int transition = TransitionArray::kSimpleTransitionIndex;
1777e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  PropertyDetails details = transitions->GetTargetDetails(transition);
1778e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  Name* name = transitions->GetKey(transition);
1779e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (details.type() != FIELD) return Handle<String>::null();
1780e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (details.attributes() != NONE) return Handle<String>::null();
1781e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (!name->IsString()) return Handle<String>::null();
1782e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return Handle<String>(String::cast(name));
1783e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1784e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1785e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1786e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgHandle<Map> JSObject::ExpectedTransitionTarget(Handle<Map> map) {
1787e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ASSERT(!ExpectedTransitionKey(map).is_null());
1788e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return Handle<Map>(map->transitions()->GetTarget(
1789e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      TransitionArray::kSimpleTransitionIndex));
1790e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
1791e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1792e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
1793e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgHandle<Map> JSObject::FindTransitionToField(Handle<Map> map, Handle<Name> key) {
179479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  DisallowHeapAllocation no_allocation;
1795e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (!map->HasTransitionArray()) return Handle<Map>::null();
1796e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  TransitionArray* transitions = map->transitions();
1797e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  int transition = transitions->Search(*key);
1798e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (transition == TransitionArray::kNotFound) return Handle<Map>::null();
1799e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  PropertyDetails target_details = transitions->GetTargetDetails(transition);
1800e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (target_details.type() != FIELD) return Handle<Map>::null();
1801e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (target_details.attributes() != NONE) return Handle<Map>::null();
1802e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return Handle<Map>(transitions->GetTarget(transition));
180389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org}
180489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
180589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
180643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(Oddball, to_string, String, kToStringOffset)
180743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(Oddball, to_number, Object, kToNumberOffset)
180843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
180943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1810ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbyte Oddball::kind() {
1811c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return Smi::cast(READ_FIELD(this, kKindOffset))->value();
1812ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
1813ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1814ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1815ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Oddball::set_kind(byte value) {
1816c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  WRITE_FIELD(this, kKindOffset, Smi::FromInt(value));
1817ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
1818ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1819ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
182041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgObject* Cell::value() {
1821defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org  return READ_FIELD(this, kValueOffset);
1822defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org}
1823defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
1824defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
182541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgvoid Cell::set_value(Object* val, WriteBarrierMode ignored) {
1826defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org  // The write barrier is not used for global property cells.
1827b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  ASSERT(!val->IsPropertyCell() && !val->IsCell());
1828defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org  WRITE_FIELD(this, kValueOffset, val);
1829defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org}
1830defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
18311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgACCESSORS(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset)
18322abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org
1833b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgObject* PropertyCell::type_raw() {
183441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  return READ_FIELD(this, kTypeOffset);
183541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
183641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
183741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
1838b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgvoid PropertyCell::set_type_raw(Object* val, WriteBarrierMode ignored) {
183941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  WRITE_FIELD(this, kTypeOffset, val);
184041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
184141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
184241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
184343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint JSObject::GetHeaderSize() {
1844e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  InstanceType type = map()->instance_type();
1845e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  // Check for the most common kind of JavaScript object before
1846e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  // falling into the generic switch. This speeds up the internal
1847e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  // field operations considerably on average.
1848e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize;
1849e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  switch (type) {
1850e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case JS_GENERATOR_OBJECT_TYPE:
1851e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      return JSGeneratorObject::kSize;
1852ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com    case JS_MODULE_TYPE:
1853ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com      return JSModule::kSize;
18545a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    case JS_GLOBAL_PROXY_TYPE:
18555a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org      return JSGlobalProxy::kSize;
185643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case JS_GLOBAL_OBJECT_TYPE:
185743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return JSGlobalObject::kSize;
185843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case JS_BUILTINS_OBJECT_TYPE:
185943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return JSBuiltinsObject::kSize;
186043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case JS_FUNCTION_TYPE:
186143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return JSFunction::kSize;
186243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case JS_VALUE_TYPE:
186343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return JSValue::kSize;
18644efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org    case JS_DATE_TYPE:
18654efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org      return JSDate::kSize;
186643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case JS_ARRAY_TYPE:
18672efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      return JSArray::kSize;
1868f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    case JS_ARRAY_BUFFER_TYPE:
1869f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      return JSArrayBuffer::kSize;
1870e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    case JS_TYPED_ARRAY_TYPE:
1871e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      return JSTypedArray::kSize;
18721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    case JS_DATA_VIEW_TYPE:
18731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      return JSDataView::kSize;
18746e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    case JS_SET_TYPE:
18756e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org      return JSSet::kSize;
18766e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org    case JS_MAP_TYPE:
18776e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org      return JSMap::kSize;
18784ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org    case JS_SET_ITERATOR_TYPE:
18794ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org      return JSSetIterator::kSize;
18804ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org    case JS_MAP_ITERATOR_TYPE:
18814ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org      return JSMapIterator::kSize;
18827c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org    case JS_WEAK_MAP_TYPE:
18837c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org      return JSWeakMap::kSize;
1884ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org    case JS_WEAK_SET_TYPE:
1885ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      return JSWeakSet::kSize;
1886236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org    case JS_REGEXP_TYPE:
18872efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org      return JSRegExp::kSize;
18883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
188943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return JSObject::kHeaderSize;
189031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org    case JS_MESSAGE_OBJECT_TYPE:
189131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org      return JSMessageObject::kSize;
189243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    default:
1893ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org      // TODO(jkummerow): Re-enable this. Blink currently hits this
1894ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org      // from its CustomElementConstructorBuilder.
1895ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org      // UNREACHABLE();
189643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return 0;
189743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
189843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
189943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint JSObject::GetInternalFieldCount() {
190243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(1 << kPointerSizeLog2 == kPointerSize);
19037c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  // Make sure to adjust for the number of in-object properties. These
19047c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  // properties do contribute to the size, but are not internal fields.
19057c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) -
19067c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org         map()->inobject_properties();
190743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
190843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
190943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1910ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgint JSObject::GetInternalFieldOffset(int index) {
1911ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(index < GetInternalFieldCount() && index >= 0);
1912ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return GetHeaderSize() + (kPointerSize * index);
1913ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
1914ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1915ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
191643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* JSObject::GetInternalField(int index) {
191743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index < GetInternalFieldCount() && index >= 0);
19187c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  // Internal objects do follow immediately after the header, whereas in-object
19197c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  // properties are at the end of the object. Therefore there is no need
19207c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  // to adjust the index here.
192143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index));
192243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
192343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
192443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
192543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid JSObject::SetInternalField(int index, Object* value) {
192643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index < GetInternalFieldCount() && index >= 0);
19277c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  // Internal objects do follow immediately after the header, whereas in-object
19287c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  // properties are at the end of the object. Therefore there is no need
19297c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  // to adjust the index here.
193043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int offset = GetHeaderSize() + (kPointerSize * index);
193143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(this, offset, value);
1932c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  WRITE_BARRIER(GetHeap(), this, offset, value);
193343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
193443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
193627bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.orgvoid JSObject::SetInternalField(int index, Smi* value) {
193727bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  ASSERT(index < GetInternalFieldCount() && index >= 0);
193827bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  // Internal objects do follow immediately after the header, whereas in-object
193927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  // properties are at the end of the object. Therefore there is no need
194027bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  // to adjust the index here.
194127bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  int offset = GetHeaderSize() + (kPointerSize * index);
194227bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org  WRITE_FIELD(this, offset, value);
194327bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org}
194427bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org
194527bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org
19467c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org// Access fast-case object properties at index. The use of these routines
19477c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org// is needed to correctly distinguish between properties stored in-object and
19487c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org// properties stored in the properties array.
1949e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.orgObject* JSObject::RawFastPropertyAt(FieldIndex index) {
1950e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  if (index.is_inobject()) {
1951e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    return READ_FIELD(this, index.offset());
19527c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  } else {
1953e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    return properties()->get(index.outobject_array_index());
19547c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  }
19557c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
19567c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
19577c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1958e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.orgvoid JSObject::FastPropertyAtPut(FieldIndex index, Object* value) {
1959e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  if (index.is_inobject()) {
1960e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    int offset = index.offset();
19617c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    WRITE_FIELD(this, offset, value);
1962c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    WRITE_BARRIER(GetHeap(), this, offset, value);
19637c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  } else {
1964e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org    properties()->set(index.outobject_array_index(), value);
19657c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  }
19667c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
19677c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
19687c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
1969ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgint JSObject::GetInObjectPropertyOffset(int index) {
19700a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  return map()->GetInObjectPropertyOffset(index);
1971ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
1972ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1973ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
1974bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgObject* JSObject::InObjectPropertyAt(int index) {
19750a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  int offset = GetInObjectPropertyOffset(index);
1976bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return READ_FIELD(this, offset);
1977bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org}
1978bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
1979bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
19805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgObject* JSObject::InObjectPropertyAtPut(int index,
19815a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                                        Object* value,
19825a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                                        WriteBarrierMode mode) {
19835a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  // Adjust for the number of properties stored in the object.
19840a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  int offset = GetInObjectPropertyOffset(index);
19855a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  WRITE_FIELD(this, offset, value);
1986c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
19875a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return value;
19885a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
19895a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
19905a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
19915a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
1992c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid JSObject::InitializeBody(Map* map,
1993c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                              Object* pre_allocated_value,
1994c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                              Object* filler_value) {
1995c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT(!filler_value->IsHeapObject() ||
1996c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         !GetHeap()->InNewSpace(filler_value));
1997c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT(!pre_allocated_value->IsHeapObject() ||
1998c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com         !GetHeap()->InNewSpace(pre_allocated_value));
1999c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  int size = map->instance_size();
2000c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  int offset = kHeaderSize;
2001c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (filler_value != pre_allocated_value) {
2002c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    int pre_allocated = map->pre_allocated_property_fields();
2003c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    ASSERT(pre_allocated * kPointerSize + kHeaderSize <= size);
2004c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    for (int i = 0; i < pre_allocated; i++) {
2005c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      WRITE_FIELD(this, offset, pre_allocated_value);
2006c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      offset += kPointerSize;
2007c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    }
2008c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
2009c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  while (offset < size) {
2010c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    WRITE_FIELD(this, offset, filler_value);
2011c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    offset += kPointerSize;
201243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
201343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
201443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
201543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
201669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgbool JSObject::HasFastProperties() {
201788767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com  ASSERT(properties()->IsDictionary() == map()->is_dictionary_map());
201869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  return !properties()->IsDictionary();
201969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org}
202069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
202169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
20221e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgbool JSObject::TooManyFastProperties(StoreFromKeyed store_mode) {
202369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  // Allow extra fast properties if the object has more than
20241e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  // kFastPropertiesSoftLimit in-object properties. When this is the case, it is
20251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  // very unlikely that the object is being used as a dictionary and there is a
20261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  // good chance that allowing more map transitions will be worth it.
20271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  Map* map = this->map();
20281e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  if (map->unused_property_fields() != 0) return false;
20291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
20301e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  int inobject = map->inobject_properties();
20317028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
20327028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  int limit;
2033f6a0c41471dd401bc4a67b309cfff6f8711b4edfulan@chromium.org  if (store_mode == CERTAINLY_NOT_STORE_FROM_KEYED) {
20347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    limit = Max(inobject, kMaxFastProperties);
20357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  } else {
20367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    limit = Max(inobject, kFastPropertiesSoftLimit);
20377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
20381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  return properties()->length() > limit;
203969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org}
204069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
204169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
204243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Struct::InitializeBody(int object_size) {
2043ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Object* value = GetHeap()->undefined_value();
2044236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
20455a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org    WRITE_FIELD(this, offset, value);
204643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
204743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
204843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
204943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
205030ce411529579186181838984710b0b0980857aaricow@chromium.orgbool Object::ToArrayIndex(uint32_t* index) {
205130ce411529579186181838984710b0b0980857aaricow@chromium.org  if (IsSmi()) {
205230ce411529579186181838984710b0b0980857aaricow@chromium.org    int value = Smi::cast(this)->value();
205343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (value < 0) return false;
205443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    *index = value;
205543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return true;
205643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
205730ce411529579186181838984710b0b0980857aaricow@chromium.org  if (IsHeapNumber()) {
205830ce411529579186181838984710b0b0980857aaricow@chromium.org    double value = HeapNumber::cast(this)->value();
205943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    uint32_t uint_value = static_cast<uint32_t>(value);
206043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (value == static_cast<double>(uint_value)) {
206143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      *index = uint_value;
206243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return true;
206343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
206443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
206543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return false;
206643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
206743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
206843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
206943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Object::IsStringObjectWithCharacterAt(uint32_t index) {
207043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!this->IsJSValue()) return false;
207143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
207243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  JSValue* js_value = JSValue::cast(this);
207343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!js_value->value()->IsString()) return false;
207443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
207543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  String* str = String::cast(js_value->value());
207659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  if (index >= static_cast<uint32_t>(str->length())) return false;
207743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
207843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return true;
207943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
208043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
208143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2082de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgvoid Object::VerifyApiCallResultType() {
2083de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org#if ENABLE_EXTRA_CHECKS
2084de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  if (!(IsSmi() ||
2085de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org        IsString() ||
2086fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org        IsSymbol() ||
2087de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org        IsSpecObject() ||
2088de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org        IsHeapNumber() ||
2089de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org        IsUndefined() ||
2090de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org        IsTrue() ||
2091de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org        IsFalse() ||
2092de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org        IsNull())) {
2093de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org    FATAL("API call returned invalid object");
2094de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org  }
2095de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org#endif  // ENABLE_EXTRA_CHECKS
2096de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org}
2097de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
2098de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org
20996d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgFixedArrayBase* FixedArrayBase::cast(Object* object) {
21005c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ASSERT(object->IsFixedArrayBase());
21016d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  return reinterpret_cast<FixedArrayBase*>(object);
21026d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}
21036d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
21046d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
210543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* FixedArray::get(int index) {
2106ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org  SLOW_ASSERT(index >= 0 && index < this->length());
210743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_FIELD(this, kHeaderSize + index * kPointerSize);
210843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
210943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
211043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21119e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> FixedArray::get(Handle<FixedArray> array, int index) {
21129e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return handle(array->get(index), array->GetIsolate());
21139e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
21149e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
21159e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
2116830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgbool FixedArray::is_the_hole(int index) {
2117830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return get(index) == GetHeap()->the_hole_value();
2118830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org}
2119830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org
2120830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org
2121a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid FixedArray::set(int index, Smi* value) {
2122c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map());
21237c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  ASSERT(index >= 0 && index < this->length());
2124a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
2125a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  int offset = kHeaderSize + index * kPointerSize;
2126a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  WRITE_FIELD(this, offset, value);
2127a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
2128a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
2129a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
213043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid FixedArray::set(int index, Object* value) {
2131c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map());
213243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < this->length());
213343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int offset = kHeaderSize + index * kPointerSize;
213443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(this, offset, value);
2135c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  WRITE_BARRIER(GetHeap(), this, offset, value);
213643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
213743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
213843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
213984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orginline bool FixedDoubleArray::is_the_hole_nan(double value) {
214084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return BitCast<uint64_t, double>(value) == kHoleNanInt64;
214184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
214284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
214384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
214484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orginline double FixedDoubleArray::hole_nan_as_double() {
214584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return BitCast<double, uint64_t>(kHoleNanInt64);
214684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
214784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
214884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
214984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.orginline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() {
215084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  ASSERT(BitCast<uint64_t>(OS::nan_value()) != kHoleNanInt64);
215184bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  ASSERT((BitCast<uint64_t>(OS::nan_value()) >> 32) != kHoleNanUpper32);
215284bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org  return OS::nan_value();
215384bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org}
215484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
215584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org
21567c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgdouble FixedDoubleArray::get_scalar(int index) {
2157c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map() &&
2158c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org         map() != GetHeap()->fixed_array_map());
21596d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  ASSERT(index >= 0 && index < this->length());
21606d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize);
21616d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  ASSERT(!is_the_hole_nan(result));
21626d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  return result;
21636d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}
21646d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
216588aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.orgint64_t FixedDoubleArray::get_representation(int index) {
2166c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map() &&
2167c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org         map() != GetHeap()->fixed_array_map());
216888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  ASSERT(index >= 0 && index < this->length());
216988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize);
217088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org}
21716d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
21727c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
21739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> FixedDoubleArray::get(Handle<FixedDoubleArray> array,
21749e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                     int index) {
21759e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  if (array->is_the_hole(index)) {
21769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    return array->GetIsolate()->factory()->the_hole_value();
2177c85dc10954aa3556a00b09b6d28cf2ebfcf528d8machenbach@chromium.org  } else {
21789e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index));
2179c85dc10954aa3556a00b09b6d28cf2ebfcf528d8machenbach@chromium.org  }
2180c85dc10954aa3556a00b09b6d28cf2ebfcf528d8machenbach@chromium.org}
2181c85dc10954aa3556a00b09b6d28cf2ebfcf528d8machenbach@chromium.org
2182c85dc10954aa3556a00b09b6d28cf2ebfcf528d8machenbach@chromium.org
21836d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgvoid FixedDoubleArray::set(int index, double value) {
2184c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map() &&
2185c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org         map() != GetHeap()->fixed_array_map());
21866d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  int offset = kHeaderSize + index * kDoubleSize;
218777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  if (std::isnan(value)) value = canonical_not_the_hole_nan_as_double();
21886d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  WRITE_DOUBLE_FIELD(this, offset, value);
21896d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}
21906d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
21916d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
21926d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgvoid FixedDoubleArray::set_the_hole(int index) {
2193c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map() &&
2194c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org         map() != GetHeap()->fixed_array_map());
21956d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  int offset = kHeaderSize + index * kDoubleSize;
21966d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double());
21976d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}
21986d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
21996d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
22006d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgbool FixedDoubleArray::is_the_hole(int index) {
22016d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  int offset = kHeaderSize + index * kDoubleSize;
22026d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset));
22036d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}
22046d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
22056d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
22062f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgdouble* FixedDoubleArray::data_start() {
22072f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  return reinterpret_cast<double*>(FIELD_ADDR(this, kHeaderSize));
22082f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org}
22092f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
22102f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
22112f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgvoid FixedDoubleArray::FillWithHoles(int from, int to) {
22122f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  for (int i = from; i < to; i++) {
22132f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    set_the_hole(i);
22142f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  }
22152f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org}
22162f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
22172f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
2218196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgbool ConstantPoolArray::is_extended_layout() {
2219196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2220196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return IsExtendedField::decode(small_layout_1);
22219e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
22229e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
22239e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
2224196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgConstantPoolArray::LayoutSection ConstantPoolArray::final_section() {
2225196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return is_extended_layout() ? EXTENDED_SECTION : SMALL_SECTION;
22269e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
2227a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2228a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2229196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgint ConstantPoolArray::first_extended_section_index() {
2230196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(is_extended_layout());
2231196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2232196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return TotalCountField::decode(small_layout_2);
2233a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2234a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2235a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2236196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgint ConstantPoolArray::get_extended_section_header_offset() {
2237196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return RoundUp(SizeFor(NumberOfEntries(this, SMALL_SECTION)), kInt64Size);
22389e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
22399e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
22409e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
2241196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgConstantPoolArray::WeakObjectState ConstantPoolArray::get_weak_object_state() {
2242196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2243196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return WeakObjectStateField::decode(small_layout_2);
22449e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
22459e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
22469e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
2247196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid ConstantPoolArray::set_weak_object_state(
2248196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      ConstantPoolArray::WeakObjectState state) {
2249196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2250196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  small_layout_2 = WeakObjectStateField::update(small_layout_2, state);
2251196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_INT32_FIELD(this, kSmallLayout2Offset, small_layout_2);
22529e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
22539e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
22549e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
2255196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgint ConstantPoolArray::first_index(Type type, LayoutSection section) {
2256196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  int index = 0;
2257196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (section == EXTENDED_SECTION) {
2258196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    ASSERT(is_extended_layout());
2259196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    index += first_extended_section_index();
2260196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2261a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2262196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  for (Type type_iter = FIRST_TYPE; type_iter < type;
2263196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org       type_iter = next_type(type_iter)) {
2264196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    index += number_of_entries(type_iter, section);
2265196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2266a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2267196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return index;
2268bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
2269bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
2270bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
2271196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgint ConstantPoolArray::last_index(Type type, LayoutSection section) {
2272196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return first_index(type, section) + number_of_entries(type, section) - 1;
2273a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2274a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2275a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2276196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgint ConstantPoolArray::number_of_entries(Type type, LayoutSection section) {
2277196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (section == SMALL_SECTION) {
2278196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2279196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2280196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    switch (type) {
2281196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      case INT64:
2282196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        return Int64CountField::decode(small_layout_1);
2283196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      case CODE_PTR:
2284196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        return CodePtrCountField::decode(small_layout_1);
2285196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      case HEAP_PTR:
2286196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        return HeapPtrCountField::decode(small_layout_1);
2287196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      case INT32:
2288196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        return Int32CountField::decode(small_layout_2);
2289196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      default:
2290196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        UNREACHABLE();
2291196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        return 0;
2292196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    }
2293196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  } else {
2294196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    ASSERT(section == EXTENDED_SECTION && is_extended_layout());
2295196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    int offset = get_extended_section_header_offset();
2296196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    switch (type) {
2297196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      case INT64:
2298196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        offset += kExtendedInt64CountOffset;
2299196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        break;
2300196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      case CODE_PTR:
2301196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        offset += kExtendedCodePtrCountOffset;
2302196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        break;
2303196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      case HEAP_PTR:
2304196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        offset += kExtendedHeapPtrCountOffset;
2305196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        break;
2306196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      case INT32:
2307196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        offset += kExtendedInt32CountOffset;
2308196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        break;
2309196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      default:
2310196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        UNREACHABLE();
2311196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    }
2312196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    return READ_INT_FIELD(this, offset);
2313196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2314a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2315a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2316a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2317196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgConstantPoolArray::Type ConstantPoolArray::get_type(int index) {
2318196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  LayoutSection section;
2319196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (is_extended_layout() && index >= first_extended_section_index()) {
2320196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    section = EXTENDED_SECTION;
2321196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  } else {
2322196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    section = SMALL_SECTION;
2323196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2324196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2325196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  Type type = FIRST_TYPE;
2326196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  while (index > last_index(type, section)) {
2327196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    type = next_type(type);
2328196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2329196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(type <= LAST_TYPE);
2330196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return type;
2331a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2332a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2333a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2334a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgint64_t ConstantPoolArray::get_int64_entry(int index) {
2335a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2336196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == INT64);
2337a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  return READ_INT64_FIELD(this, OffsetOfElementAt(index));
2338a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2339a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2340196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2341a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgdouble ConstantPoolArray::get_int64_entry_as_double(int index) {
2342a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  STATIC_ASSERT(kDoubleSize == kInt64Size);
2343a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2344196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == INT64);
2345a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  return READ_DOUBLE_FIELD(this, OffsetOfElementAt(index));
2346a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2347a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2348a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2349bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgAddress ConstantPoolArray::get_code_ptr_entry(int index) {
2350a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2351196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == CODE_PTR);
2352bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  return reinterpret_cast<Address>(READ_FIELD(this, OffsetOfElementAt(index)));
2353bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
2354bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
2355bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
2356bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgObject* ConstantPoolArray::get_heap_ptr_entry(int index) {
2357bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2358196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == HEAP_PTR);
2359a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  return READ_FIELD(this, OffsetOfElementAt(index));
2360a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2361a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2362a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2363a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgint32_t ConstantPoolArray::get_int32_entry(int index) {
2364a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2365196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == INT32);
2366a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  return READ_INT32_FIELD(this, OffsetOfElementAt(index));
2367a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2368a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2369a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2370196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid ConstantPoolArray::set(int index, int64_t value) {
2371196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2372196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == INT64);
2373196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_INT64_FIELD(this, OffsetOfElementAt(index), value);
2374196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
2375196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2376196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2377196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid ConstantPoolArray::set(int index, double value) {
2378196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  STATIC_ASSERT(kDoubleSize == kInt64Size);
2379196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2380196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == INT64);
2381196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_DOUBLE_FIELD(this, OffsetOfElementAt(index), value);
2382196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
2383196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2384196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2385bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgvoid ConstantPoolArray::set(int index, Address value) {
2386bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2387196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == CODE_PTR);
2388bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  WRITE_FIELD(this, OffsetOfElementAt(index), reinterpret_cast<Object*>(value));
2389bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
2390bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
2391bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
2392a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgvoid ConstantPoolArray::set(int index, Object* value) {
2393a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2394196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == HEAP_PTR);
2395a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  WRITE_FIELD(this, OffsetOfElementAt(index), value);
2396a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  WRITE_BARRIER(GetHeap(), this, OffsetOfElementAt(index), value);
2397a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2398a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2399a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2400196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid ConstantPoolArray::set(int index, int32_t value) {
2401a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  ASSERT(map() == GetHeap()->constant_pool_array_map());
2402196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(get_type(index) == INT32);
2403196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_INT32_FIELD(this, OffsetOfElementAt(index), value);
2404a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2405a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2406a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2407196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid ConstantPoolArray::Init(const NumberOfEntries& small) {
2408196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uint32_t small_layout_1 =
2409196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      Int64CountField::encode(small.count_of(INT64)) |
2410196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      CodePtrCountField::encode(small.count_of(CODE_PTR)) |
2411196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      HeapPtrCountField::encode(small.count_of(HEAP_PTR)) |
2412196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      IsExtendedField::encode(false);
2413196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uint32_t small_layout_2 =
2414196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      Int32CountField::encode(small.count_of(INT32)) |
2415196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      TotalCountField::encode(small.total_count()) |
2416196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      WeakObjectStateField::encode(NO_WEAK_OBJECTS);
2417196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_UINT32_FIELD(this, kSmallLayout1Offset, small_layout_1);
2418196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_UINT32_FIELD(this, kSmallLayout2Offset, small_layout_2);
2419196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (kHeaderSize != kFirstEntryOffset) {
2420196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    ASSERT(kFirstEntryOffset - kHeaderSize == kInt32Size);
2421196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    WRITE_UINT32_FIELD(this, kHeaderSize, 0);  // Zero out header padding.
2422196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2423a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2424a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2425a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2426196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid ConstantPoolArray::InitExtended(const NumberOfEntries& small,
2427196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org                                     const NumberOfEntries& extended) {
2428196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Initialize small layout fields first.
2429196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  Init(small);
2430196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2431196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Set is_extended_layout field.
2432196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2433196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  small_layout_1 = IsExtendedField::update(small_layout_1, true);
2434196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_INT32_FIELD(this, kSmallLayout1Offset, small_layout_1);
2435196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2436196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  // Initialize the extended layout fields.
2437196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  int extended_header_offset = get_extended_section_header_offset();
2438196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_INT_FIELD(this, extended_header_offset + kExtendedInt64CountOffset,
2439196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      extended.count_of(INT64));
2440196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_INT_FIELD(this, extended_header_offset + kExtendedCodePtrCountOffset,
2441196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      extended.count_of(CODE_PTR));
2442196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_INT_FIELD(this, extended_header_offset + kExtendedHeapPtrCountOffset,
2443196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      extended.count_of(HEAP_PTR));
2444196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  WRITE_INT_FIELD(this, extended_header_offset + kExtendedInt32CountOffset,
2445196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      extended.count_of(INT32));
2446196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
2447196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2448196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2449196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgint ConstantPoolArray::size() {
2450196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  NumberOfEntries small(this, SMALL_SECTION);
2451196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (!is_extended_layout()) {
2452196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    return SizeFor(small);
2453196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  } else {
2454196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    NumberOfEntries extended(this, EXTENDED_SECTION);
2455196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    return SizeForExtended(small, extended);
2456196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2457196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
2458196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2459196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2460196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgint ConstantPoolArray::length() {
2461196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2462196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  int length = TotalCountField::decode(small_layout_2);
2463196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (is_extended_layout()) {
2464196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    length += number_of_entries(INT64, EXTENDED_SECTION) +
2465196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org              number_of_entries(CODE_PTR, EXTENDED_SECTION) +
2466196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org              number_of_entries(HEAP_PTR, EXTENDED_SECTION) +
2467196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org              number_of_entries(INT32, EXTENDED_SECTION);
2468196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2469196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return length;
2470196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
2471196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2472196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2473196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgint ConstantPoolArray::Iterator::next_index() {
2474196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  ASSERT(!is_finished());
2475196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  int ret = next_index_++;
2476196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  update_section();
2477196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return ret;
2478196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
2479196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2480196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2481196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgbool ConstantPoolArray::Iterator::is_finished() {
2482196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return next_index_ > array_->last_index(type_, final_section_);
2483196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
2484196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2485196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
2486196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid ConstantPoolArray::Iterator::update_section() {
2487196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (next_index_ > array_->last_index(type_, current_section_) &&
2488196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      current_section_ != final_section_) {
2489196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    ASSERT(final_section_ == EXTENDED_SECTION);
2490196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    current_section_ = EXTENDED_SECTION;
2491196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    next_index_ = array_->first_index(type_, EXTENDED_SECTION);
2492196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  }
2493a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
2494a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2495a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
249679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.orgWriteBarrierMode HeapObject::GetWriteBarrierMode(
249779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org    const DisallowHeapAllocation& promise) {
2498c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  Heap* heap = GetHeap();
2499c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
2500c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
250143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return UPDATE_WRITE_BARRIER;
250243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
250343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
250443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
250543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid FixedArray::set(int index,
250643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                     Object* value,
25075a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org                     WriteBarrierMode mode) {
2508c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map());
250943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < this->length());
251043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int offset = kHeaderSize + index * kPointerSize;
251143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(this, offset, value);
2512c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
251343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
251443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
251543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
251664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgvoid FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array,
251764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org                                              int index,
251864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org                                              Object* value) {
2519c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(array->map() != array->GetHeap()->fixed_cow_array_map());
252064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  ASSERT(index >= 0 && index < array->length());
252164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  int offset = kHeaderSize + index * kPointerSize;
252264e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  WRITE_FIELD(array, offset, value);
252364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  Heap* heap = array->GetHeap();
252464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  if (heap->InNewSpace(value)) {
252564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org    heap->RecordWrite(array->address(), offset);
252664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  }
252764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org}
252864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
252964e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org
2530394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid FixedArray::NoWriteBarrierSet(FixedArray* array,
2531394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                                   int index,
2532394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                                   Object* value) {
2533c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(array->map() != array->GetHeap()->fixed_cow_array_map());
253443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < array->length());
2535c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(!array->GetHeap()->InNewSpace(value));
253643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value);
253743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
253843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
253943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
254043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid FixedArray::set_undefined(int index) {
25411f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map());
254243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < this->length());
25431f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  ASSERT(!GetHeap()->InNewSpace(GetHeap()->undefined_value()));
25441f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  WRITE_FIELD(this,
25451f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org              kHeaderSize + index * kPointerSize,
25461f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org              GetHeap()->undefined_value());
254743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
254843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
254943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2550236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgvoid FixedArray::set_null(int index) {
2551236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org  ASSERT(index >= 0 && index < this->length());
25521f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  ASSERT(!GetHeap()->InNewSpace(GetHeap()->null_value()));
25531f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org  WRITE_FIELD(this,
25541f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org              kHeaderSize + index * kPointerSize,
25551f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.org              GetHeap()->null_value());
2556236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org}
2557236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
2558236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
255943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid FixedArray::set_the_hole(int index) {
2560c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(map() != GetHeap()->fixed_cow_array_map());
256143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < this->length());
2562c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(!GetHeap()->InNewSpace(GetHeap()->the_hole_value()));
2563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  WRITE_FIELD(this,
2564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org              kHeaderSize + index * kPointerSize,
2565ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org              GetHeap()->the_hole_value());
256643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
256743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
256843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
25692f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.orgvoid FixedArray::FillWithHoles(int from, int to) {
25702f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  for (int i = from; i < to; i++) {
25712f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org    set_the_hole(i);
25722f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  }
2573fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
2574fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
2575fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
2576ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgObject** FixedArray::data_start() {
2577ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org  return HeapObject::RawField(this, kHeaderSize);
2578ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}
2579ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
2580ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
25819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.combool DescriptorArray::IsEmpty() {
25825a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  ASSERT(length() >= kFirstIndex ||
2583c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org         this == GetHeap()->empty_descriptor_array());
25845a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  return length() < kFirstIndex;
25857028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
25867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
25877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
258833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvoid DescriptorArray::SetNumberOfDescriptors(int number_of_descriptors) {
258933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  WRITE_FIELD(
259033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      this, kDescriptorLengthOffset, Smi::FromInt(number_of_descriptors));
259133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org}
259233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
259333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
259499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// Perform a binary search in a fixed array. Low and high are entry indices. If
259599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// there are three entries in this array it should be called with low=0 and
259699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// high=2.
259733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgtemplate<SearchMode search_mode, typename T>
2598750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgint BinarySearch(T* array, Name* name, int low, int high, int valid_entries) {
259999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  uint32_t hash = name->Hash();
260099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  int limit = high;
260199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
260299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  ASSERT(low <= high);
260399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
260499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  while (low != high) {
260599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    int mid = (low + high) / 2;
2606750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    Name* mid_name = array->GetSortedKey(mid);
260799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    uint32_t mid_hash = mid_name->Hash();
260899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
260999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    if (mid_hash >= hash) {
261099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org      high = mid;
261199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    } else {
261299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org      low = mid + 1;
261399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    }
261499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  }
261599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
261646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  for (; low <= limit; ++low) {
261746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    int sort_index = array->GetSortedKeyIndex(low);
2618750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    Name* entry = array->GetKey(sort_index);
261946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    if (entry->Hash() != hash) break;
262033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if (entry->Equals(name)) {
262133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      if (search_mode == ALL_ENTRIES || sort_index < valid_entries) {
262233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        return sort_index;
262333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      }
262433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      return T::kNotFound;
262533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    }
262699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  }
262799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
262899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  return T::kNotFound;
262999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org}
263099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
263133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
263299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// Perform a linear search in this fixed array. len is the number of entry
263399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org// indices that are valid.
263406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgtemplate<SearchMode search_mode, typename T>
2635750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgint LinearSearch(T* array, Name* name, int len, int valid_entries) {
263699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  uint32_t hash = name->Hash();
263706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  if (search_mode == ALL_ENTRIES) {
263806ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    for (int number = 0; number < len; number++) {
263906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      int sorted_index = array->GetSortedKeyIndex(number);
2640750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Name* entry = array->GetKey(sorted_index);
264106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      uint32_t current_hash = entry->Hash();
264206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      if (current_hash > hash) break;
264306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      if (current_hash == hash && entry->Equals(name)) return sorted_index;
264406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    }
264506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  } else {
264606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    ASSERT(len >= valid_entries);
264706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    for (int number = 0; number < valid_entries; number++) {
2648750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      Name* entry = array->GetKey(number);
264906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      uint32_t current_hash = entry->Hash();
265006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org      if (current_hash == hash && entry->Equals(name)) return number;
265106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    }
265299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  }
265399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  return T::kNotFound;
265499aa490225c81012235659d9a183226b286178c8yangguo@chromium.org}
265599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
265699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
265706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgtemplate<SearchMode search_mode, typename T>
2658750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgint Search(T* array, Name* name, int valid_entries) {
265906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  if (search_mode == VALID_ENTRIES) {
266006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    SLOW_ASSERT(array->IsSortedNoDuplicates(valid_entries));
266106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  } else {
266206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    SLOW_ASSERT(array->IsSortedNoDuplicates());
266306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  }
266443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
266599aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  int nof = array->number_of_entries();
266699aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  if (nof == 0) return T::kNotFound;
266743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
266843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Fast case: do linear search for small arrays.
266943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const int kMaxElementsForLinearSearch = 8;
267033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if ((search_mode == ALL_ENTRIES &&
267133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org       nof <= kMaxElementsForLinearSearch) ||
267233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      (search_mode == VALID_ENTRIES &&
267333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org       valid_entries <= (kMaxElementsForLinearSearch * 3))) {
267406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    return LinearSearch<search_mode>(array, name, nof, valid_entries);
267543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
267643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
267743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Slow case: perform binary search.
267833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return BinarySearch<search_mode>(array, name, 0, nof - 1, valid_entries);
267999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org}
268099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
268199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
2682750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgint DescriptorArray::Search(Name* name, int valid_descriptors) {
268306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  return internal::Search<VALID_ENTRIES>(this, name, valid_descriptors);
268443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
268543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
268643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2687750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgint DescriptorArray::SearchWithCache(Name* name, Map* map) {
268806ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  int number_of_own_descriptors = map->NumberOfOwnDescriptors();
268906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  if (number_of_own_descriptors == 0) return kNotFound;
269046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
269199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  DescriptorLookupCache* cache = GetIsolate()->descriptor_lookup_cache();
269206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  int number = cache->Lookup(map, name);
269346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
2694ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  if (number == DescriptorLookupCache::kAbsent) {
269506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    number = Search(name, number_of_own_descriptors);
269606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org    cache->Update(map, name, number);
2697ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  }
269846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
2699ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  return number;
2700ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
2701ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
2702ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
2703bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.orgPropertyDetails Map::GetLastDescriptorDetails() {
2704bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org  return instance_descriptors()->GetDetails(LastAdded());
2705bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org}
2706bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org
2707bfd1d202fb7cd6d54d956414bad9f75a995d0f65machenbach@chromium.org
270846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid Map::LookupDescriptor(JSObject* holder,
2709750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                           Name* name,
271046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                           LookupResult* result) {
271146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  DescriptorArray* descriptors = this->instance_descriptors();
271206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  int number = descriptors->SearchWithCache(name, this);
271346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  if (number == DescriptorArray::kNotFound) return result->NotFound();
271446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  result->DescriptorResult(holder, descriptors->GetDetails(number), number);
271546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
271646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
271746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
271846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid Map::LookupTransition(JSObject* holder,
2719750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org                           Name* name,
272046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                           LookupResult* result) {
27218f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  int transition_index = this->SearchTransition(name);
27228f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  if (transition_index == TransitionArray::kNotFound) return result->NotFound();
27238f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  result->TransitionResult(holder, this->GetTransition(transition_index));
272446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
272546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
272646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
27275b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgFixedArrayBase* Map::GetInitialElements() {
27285b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  if (has_fast_smi_or_object_elements() ||
27295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      has_fast_double_elements()) {
27305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
27315b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    return GetHeap()->empty_fixed_array();
27325b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  } else if (has_external_array_elements()) {
27335b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    ExternalArray* empty_array = GetHeap()->EmptyExternalArrayForMap(this);
27345b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    ASSERT(!GetHeap()->InNewSpace(empty_array));
27355b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    return empty_array;
27365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  } else if (has_fixed_typed_array_elements()) {
27375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    FixedTypedArrayBase* empty_array =
27385b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      GetHeap()->EmptyFixedTypedArrayForMap(this);
27395b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    ASSERT(!GetHeap()->InNewSpace(empty_array));
27405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    return empty_array;
274170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  } else if (has_dictionary_elements()) {
274270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_slow_element_dictionary()));
274370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    return GetHeap()->empty_slow_element_dictionary();
27445b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  } else {
27455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    UNREACHABLE();
27465b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
27475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return NULL;
27485b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org}
27495b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
27505b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
2751400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.orgObject** DescriptorArray::GetKeySlot(int descriptor_number) {
2752400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  ASSERT(descriptor_number < number_of_descriptors());
27534954674151afa960af66efb4831df06bde727333yangguo@chromium.org  return RawFieldOfElementAt(ToKeyIndex(descriptor_number));
2754400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org}
2755400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org
2756400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org
2757e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.orgObject** DescriptorArray::GetDescriptorStartSlot(int descriptor_number) {
2758e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org  return GetKeySlot(descriptor_number);
2759e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org}
2760e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org
2761e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org
2762e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.orgObject** DescriptorArray::GetDescriptorEndSlot(int descriptor_number) {
2763e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org  return GetValueSlot(descriptor_number - 1) + 1;
2764e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org}
2765e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org
2766e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org
2767750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgName* DescriptorArray::GetKey(int descriptor_number) {
276843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(descriptor_number < number_of_descriptors());
2769750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return Name::cast(get(ToKeyIndex(descriptor_number)));
277043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
277143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
277243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
277346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgint DescriptorArray::GetSortedKeyIndex(int descriptor_number) {
277446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  return GetDetails(descriptor_number).pointer();
277546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
277646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
277746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
2778750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgName* DescriptorArray::GetSortedKey(int descriptor_number) {
277946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  return GetKey(GetSortedKeyIndex(descriptor_number));
278046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
278146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
278246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
278306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgvoid DescriptorArray::SetSortedKey(int descriptor_index, int pointer) {
278406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  PropertyDetails details = GetDetails(descriptor_index);
278506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  set(ToDetailsIndex(descriptor_index), details.set_pointer(pointer).AsSmi());
278646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
278746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
278846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
2789f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgvoid DescriptorArray::SetRepresentation(int descriptor_index,
2790f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                                        Representation representation) {
2791f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  ASSERT(!representation.IsNone());
2792f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  PropertyDetails details = GetDetails(descriptor_index);
2793f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  set(ToDetailsIndex(descriptor_index),
2794f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org      details.CopyWithRepresentation(representation).AsSmi());
2795f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
2796f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
2797f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
279837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.orgObject** DescriptorArray::GetValueSlot(int descriptor_number) {
279937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org  ASSERT(descriptor_number < number_of_descriptors());
28004954674151afa960af66efb4831df06bde727333yangguo@chromium.org  return RawFieldOfElementAt(ToValueIndex(descriptor_number));
280137141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org}
280237141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
280337141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org
280443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* DescriptorArray::GetValue(int descriptor_number) {
280543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(descriptor_number < number_of_descriptors());
2806400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  return get(ToValueIndex(descriptor_number));
2807400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org}
2808400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org
2809400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org
2810e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.orgvoid DescriptorArray::SetValue(int descriptor_index, Object* value) {
2811e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  set(ToValueIndex(descriptor_index), value);
2812e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org}
2813e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org
2814e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org
2815ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comPropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
281643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(descriptor_number < number_of_descriptors());
2817400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  Object* details = get(ToDetailsIndex(descriptor_number));
2818ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  return PropertyDetails(Smi::cast(details));
281943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
282043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
282143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2822defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgPropertyType DescriptorArray::GetType(int descriptor_number) {
2823ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  return GetDetails(descriptor_number).type();
2824defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org}
2825defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2826defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2827defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgint DescriptorArray::GetFieldIndex(int descriptor_number) {
28289259716434187c932704601f700375e53d865de8rossberg@chromium.org  ASSERT(GetDetails(descriptor_number).type() == FIELD);
282979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  return GetDetails(descriptor_number).field_index();
2830defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org}
2831defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2832defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2833e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.orgHeapType* DescriptorArray::GetFieldType(int descriptor_number) {
2834e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  ASSERT(GetDetails(descriptor_number).type() == FIELD);
2835e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  return HeapType::cast(GetValue(descriptor_number));
2836e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org}
2837e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org
2838e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org
2839fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgObject* DescriptorArray::GetConstant(int descriptor_number) {
2840fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return GetValue(descriptor_number);
2841defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org}
2842defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2843defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2844defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgObject* DescriptorArray::GetCallbacksObject(int descriptor_number) {
2845defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org  ASSERT(GetType(descriptor_number) == CALLBACKS);
2846defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org  return GetValue(descriptor_number);
2847defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org}
2848defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2849defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2850defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.orgAccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) {
2851defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org  ASSERT(GetType(descriptor_number) == CALLBACKS);
2852ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org  Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number));
2853c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return reinterpret_cast<AccessorDescriptor*>(p->foreign_address());
2854defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org}
2855defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
2856defbd109bb9bd556bb8ece103c3b340d3552155ekasperl@chromium.org
285743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
28585b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  desc->Init(handle(GetKey(descriptor_number), GetIsolate()),
28595b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org             handle(GetValue(descriptor_number), GetIsolate()),
2860ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com             GetDetails(descriptor_number));
286143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
286243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
286343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2864394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid DescriptorArray::Set(int descriptor_number,
2865394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                          Descriptor* desc,
2866394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com                          const WhitenessWitness&) {
286743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Range check.
286843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(descriptor_number < number_of_descriptors());
286943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
287064e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org  NoIncrementalWriteBarrierSet(this,
287164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org                               ToKeyIndex(descriptor_number),
28725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org                               *desc->GetKey());
2873400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  NoIncrementalWriteBarrierSet(this,
287464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org                               ToValueIndex(descriptor_number),
28755b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org                               *desc->GetValue());
2876400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org  NoIncrementalWriteBarrierSet(this,
287764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org                               ToDetailsIndex(descriptor_number),
287864e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org                               desc->GetDetails().AsSmi());
287943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
288043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
288143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
288233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvoid DescriptorArray::Set(int descriptor_number, Descriptor* desc) {
288333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  // Range check.
288433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  ASSERT(descriptor_number < number_of_descriptors());
288533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
28865b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  set(ToKeyIndex(descriptor_number), *desc->GetKey());
28875b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  set(ToValueIndex(descriptor_number), *desc->GetValue());
288833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  set(ToDetailsIndex(descriptor_number), desc->GetDetails().AsSmi());
288933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org}
289033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
289133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
289246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid DescriptorArray::Append(Descriptor* desc,
289333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                             const WhitenessWitness& witness) {
28945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  DisallowHeapAllocation no_gc;
289533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  int descriptor_number = number_of_descriptors();
289633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  SetNumberOfDescriptors(descriptor_number + 1);
289706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  Set(descriptor_number, desc, witness);
2898304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
2899304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  uint32_t hash = desc->GetKey()->Hash();
2900304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
290146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int insertion;
290246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
290306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  for (insertion = descriptor_number; insertion > 0; --insertion) {
2904750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    Name* key = GetSortedKey(insertion - 1);
2905304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    if (key->Hash() <= hash) break;
290646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    SetSortedKey(insertion, GetSortedKeyIndex(insertion - 1));
2907304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  }
2908304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
290906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  SetSortedKey(insertion, descriptor_number);
291056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org}
291156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
291256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
291333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgvoid DescriptorArray::Append(Descriptor* desc) {
29145b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  DisallowHeapAllocation no_gc;
291533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  int descriptor_number = number_of_descriptors();
291633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  SetNumberOfDescriptors(descriptor_number + 1);
291733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  Set(descriptor_number, desc);
291833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
291933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  uint32_t hash = desc->GetKey()->Hash();
292033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
292133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  int insertion;
292233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
292333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  for (insertion = descriptor_number; insertion > 0; --insertion) {
2924750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    Name* key = GetSortedKey(insertion - 1);
292533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if (key->Hash() <= hash) break;
292633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    SetSortedKey(insertion, GetSortedKeyIndex(insertion - 1));
292733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
292833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
292933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  SetSortedKey(insertion, descriptor_number);
293033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org}
293133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
293233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
293346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid DescriptorArray::SwapSortedKeys(int first, int second) {
293446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int first_key = GetSortedKeyIndex(first);
293546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  SetSortedKey(first, GetSortedKeyIndex(second));
293646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  SetSortedKey(second, first_key);
2937394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
2938394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
2939394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
29402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgDescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array)
2941394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com    : marking_(array->GetHeap()->incremental_marking()) {
2942394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  marking_->EnterNoMarkingScope();
29435697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  ASSERT(!marking_->IsMarking() ||
29445697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org         Marking::Color(array) == Marking::WHITE_OBJECT);
2945394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
2946394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
2947394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
294856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.orgDescriptorArray::WhitenessWitness::~WhitenessWitness() {
2949394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  marking_->LeaveNoMarkingScope();
295043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
295143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
295243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2953c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgtemplate<typename Derived, typename Shape, typename Key>
2954c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgint HashTable<Derived, Shape, Key>::ComputeCapacity(int at_least_space_for) {
29552c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  const int kMinCapacity = 32;
29562c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  int capacity = RoundUpToPowerOf2(at_least_space_for * 2);
29572c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  if (capacity < kMinCapacity) {
29582c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org    capacity = kMinCapacity;  // Guarantee min capacity.
29592c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  }
29602c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  return capacity;
29612c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org}
29622c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org
29632c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org
2964c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgtemplate<typename Derived, typename Shape, typename Key>
2965c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgint HashTable<Derived, Shape, Key>::FindEntry(Key key) {
2966ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return FindEntry(GetIsolate(), key);
2967ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
2968ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2969ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2970ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// Find entry for key otherwise return kNotFound.
2971c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgtemplate<typename Derived, typename Shape, typename Key>
2972c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgint HashTable<Derived, Shape, Key>::FindEntry(Isolate* isolate, Key key) {
2973ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  uint32_t capacity = Capacity();
2974c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  uint32_t entry = FirstProbe(HashTable::Hash(key), capacity);
2975ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  uint32_t count = 1;
2976ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // EnsureCapacity will guarantee the hash table is never full.
2977ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  while (true) {
2978ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Object* element = KeyAt(entry);
297972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org    // Empty entry. Uses raw unchecked accessors because it is called by the
29804a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    // string table during bootstrapping.
2981fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    if (element == isolate->heap()->raw_unchecked_undefined_value()) break;
2982fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    if (element != isolate->heap()->raw_unchecked_the_hole_value() &&
2983ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        Shape::IsMatch(key, element)) return entry;
2984ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    entry = NextProbe(entry, count++, capacity);
2985ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
2986ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return kNotFound;
2987ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
2988ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2989ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2990f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.combool SeededNumberDictionary::requires_slow_elements() {
29915a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  Object* max_index_object = get(kMaxNumberKeyIndex);
299243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!max_index_object->IsSmi()) return false;
299343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return 0 !=
299443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
299543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
299643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2997f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comuint32_t SeededNumberDictionary::max_number_key() {
299843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(!requires_slow_elements());
29995a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  Object* max_index_object = get(kMaxNumberKeyIndex);
300043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!max_index_object->IsSmi()) return 0;
300143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
300243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return value >> kRequiresSlowElementsTagSize;
300343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
300443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3005f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid SeededNumberDictionary::set_requires_slow_elements() {
3006b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
3007bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org}
3008bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
3009bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
301043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ------------------------------------
301143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Cast operations
301243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
301343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
301443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(FixedArray)
30156d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgCAST_ACCESSOR(FixedDoubleArray)
30165c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgCAST_ACCESSOR(FixedTypedArrayBase)
3017a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgCAST_ACCESSOR(ConstantPoolArray)
301843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(DescriptorArray)
3019a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgCAST_ACCESSOR(DeoptimizationInputData)
3020a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgCAST_ACCESSOR(DeoptimizationOutputData)
30212e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgCAST_ACCESSOR(DependentCode)
30224a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgCAST_ACCESSOR(StringTable)
3023ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgCAST_ACCESSOR(JSFunctionResultCache)
302465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.orgCAST_ACCESSOR(NormalizedMapCache)
3025c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgCAST_ACCESSOR(ScopeInfo)
3026b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgCAST_ACCESSOR(CompilationCacheTable)
3027ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgCAST_ACCESSOR(CodeCacheHashTable)
3028e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgCAST_ACCESSOR(PolymorphicCodeCacheHashTable)
3029236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgCAST_ACCESSOR(MapCache)
303043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(String)
303143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(SeqString)
3032fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgCAST_ACCESSOR(SeqOneByteString)
30337c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgCAST_ACCESSOR(SeqTwoByteString)
30344668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgCAST_ACCESSOR(SlicedString)
303543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(ConsString)
303643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(ExternalString)
303743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(ExternalAsciiString)
303843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(ExternalTwoByteString)
30394a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgCAST_ACCESSOR(Symbol)
3040750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgCAST_ACCESSOR(Name)
3041d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgCAST_ACCESSOR(JSReceiver)
304243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(JSObject)
304343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(Smi)
304443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(HeapObject)
304543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(HeapNumber)
304643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(Oddball)
304741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgCAST_ACCESSOR(Cell)
3048b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgCAST_ACCESSOR(PropertyCell)
304943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(SharedFunctionInfo)
305043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(Map)
305143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(JSFunction)
30525a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgCAST_ACCESSOR(GlobalObject)
30535a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgCAST_ACCESSOR(JSGlobalProxy)
305443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(JSGlobalObject)
305543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(JSBuiltinsObject)
305643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(Code)
305743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(JSArray)
3058f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgCAST_ACCESSOR(JSArrayBuffer)
30591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgCAST_ACCESSOR(JSArrayBufferView)
3060e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgCAST_ACCESSOR(JSTypedArray)
30611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgCAST_ACCESSOR(JSDataView)
3062236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgCAST_ACCESSOR(JSRegExp)
30637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgCAST_ACCESSOR(JSProxy)
3064d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgCAST_ACCESSOR(JSFunctionProxy)
3065394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comCAST_ACCESSOR(JSSet)
3066394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comCAST_ACCESSOR(JSMap)
30674ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgCAST_ACCESSOR(JSSetIterator)
30684ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgCAST_ACCESSOR(JSMapIterator)
30697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgCAST_ACCESSOR(JSWeakMap)
3070ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgCAST_ACCESSOR(JSWeakSet)
3071ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgCAST_ACCESSOR(Foreign)
307243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(ByteArray)
3073c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comCAST_ACCESSOR(FreeSpace)
30743811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgCAST_ACCESSOR(ExternalArray)
3075af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalInt8Array)
3076af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalUint8Array)
3077af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalInt16Array)
3078af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalUint16Array)
3079af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalInt32Array)
3080af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalUint32Array)
3081af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalFloat32Array)
3082af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalFloat64Array)
3083af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgCAST_ACCESSOR(ExternalUint8ClampedArray)
308443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCAST_ACCESSOR(Struct)
30857c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgCAST_ACCESSOR(AccessorInfo)
308643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30875c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgtemplate <class Traits>
30885c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgFixedTypedArray<Traits>* FixedTypedArray<Traits>::cast(Object* object) {
30895c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  SLOW_ASSERT(object->IsHeapObject() &&
30905c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      HeapObject::cast(object)->map()->instance_type() ==
30915c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org          Traits::kInstanceType);
30925c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return reinterpret_cast<FixedTypedArray<Traits>*>(object);
30935c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}
30945c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
309543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
309643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name)
309743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  STRUCT_LIST(MAKE_STRUCT_CAST)
309843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef MAKE_STRUCT_CAST
309943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
310086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org
3101c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgtemplate <typename Derived, typename Shape, typename Key>
3102c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgHashTable<Derived, Shape, Key>*
3103c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgHashTable<Derived, Shape, Key>::cast(Object* obj) {
310443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(obj->IsHashTable());
310543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return reinterpret_cast<HashTable*>(obj);
310643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
310743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
310843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31096d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgSMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
311063a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgSYNCHRONIZED_SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
311163a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.org
3112c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comSMI_ACCESSORS(FreeSpace, size, kSizeOffset)
31139e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgNOBARRIER_SMI_ACCESSORS(FreeSpace, size, kSizeOffset)
311443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3115ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgSMI_ACCESSORS(String, length, kLengthOffset)
311663a7c9f848e755c52a37721debae242cf5d1682dmachenbach@chromium.orgSYNCHRONIZED_SMI_ACCESSORS(String, length, kLengthOffset)
311743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31189fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org
31194a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orguint32_t Name::hash_field() {
3120ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  return READ_UINT32_FIELD(this, kHashFieldOffset);
312143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
312243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
312343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31244a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgvoid Name::set_hash_field(uint32_t value) {
3125ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  WRITE_UINT32_FIELD(this, kHashFieldOffset, value);
312630ce411529579186181838984710b0b0980857aaricow@chromium.org#if V8_HOST_ARCH_64_BIT
312730ce411529579186181838984710b0b0980857aaricow@chromium.org  WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0);
312830ce411529579186181838984710b0b0980857aaricow@chromium.org#endif
312943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
313043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
313143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3132750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgbool Name::Equals(Name* other) {
3133750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (other == this) return true;
3134e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if ((this->IsInternalizedString() && other->IsInternalizedString()) ||
3135e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      this->IsSymbol() || other->IsSymbol()) {
3136f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return false;
3137f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
3138750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return String::cast(this)->SlowEquals(String::cast(other));
3139750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
3140750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
3141750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
31422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgbool Name::Equals(Handle<Name> one, Handle<Name> two) {
31432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if (one.is_identical_to(two)) return true;
31442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if ((one->IsInternalizedString() && two->IsInternalizedString()) ||
31452ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      one->IsSymbol() || two->IsSymbol()) {
31462ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    return false;
31472ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  }
31482ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return String::SlowEquals(Handle<String>::cast(one),
31492ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                            Handle<String>::cast(two));
31502ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
31512ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
31522ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
3153f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgACCESSORS(Symbol, name, Object, kNameOffset)
31540cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgACCESSORS(Symbol, flags, Smi, kFlagsOffset)
31550cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgBOOL_ACCESSORS(Symbol, flags, is_private, kPrivateBit)
3156f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
3157f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
3158ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgbool String::Equals(String* other) {
3159ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  if (other == this) return true;
3160750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (this->IsInternalizedString() && other->IsInternalizedString()) {
3161ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org    return false;
3162ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  }
3163ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  return SlowEquals(other);
316443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
316543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
316643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31672ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgbool String::Equals(Handle<String> one, Handle<String> two) {
31682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if (one.is_identical_to(two)) return true;
31692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if (one->IsInternalizedString() && two->IsInternalizedString()) {
31702ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    return false;
31712ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  }
31722ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return SlowEquals(one, two);
31732ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
31742ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
31752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
31769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<String> String::Flatten(Handle<String> string, PretenureFlag pretenure) {
31779e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  if (!string->IsConsString()) return string;
31789e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  Handle<ConsString> cons = Handle<ConsString>::cast(string);
31799e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  if (cons->IsFlat()) return handle(cons->first());
31809e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return SlowFlatten(cons, pretenure);
31819e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
31829e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
31839e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
3184bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orguint16_t String::Get(int index) {
3185bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  ASSERT(index >= 0 && index < length());
3186bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  switch (StringShape(this).full_representation_tag()) {
3187e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    case kSeqStringTag | kOneByteStringTag:
3188fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      return SeqOneByteString::cast(this)->SeqOneByteStringGet(index);
3189870a0b67c822d289024711912e2512af01b66c3bager@chromium.org    case kSeqStringTag | kTwoByteStringTag:
3190870a0b67c822d289024711912e2512af01b66c3bager@chromium.org      return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
3191e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    case kConsStringTag | kOneByteStringTag:
3192870a0b67c822d289024711912e2512af01b66c3bager@chromium.org    case kConsStringTag | kTwoByteStringTag:
319343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return ConsString::cast(this)->ConsStringGet(index);
3194e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    case kExternalStringTag | kOneByteStringTag:
3195870a0b67c822d289024711912e2512af01b66c3bager@chromium.org      return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
3196870a0b67c822d289024711912e2512af01b66c3bager@chromium.org    case kExternalStringTag | kTwoByteStringTag:
3197870a0b67c822d289024711912e2512af01b66c3bager@chromium.org      return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
3198e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org    case kSlicedStringTag | kOneByteStringTag:
31994668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org    case kSlicedStringTag | kTwoByteStringTag:
32004668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org      return SlicedString::cast(this)->SlicedStringGet(index);
320143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    default:
320243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      break;
320343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
320443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
320543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  UNREACHABLE();
320643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return 0;
320743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
320843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
320943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3210bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvoid String::Set(int index, uint16_t value) {
3211bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  ASSERT(index >= 0 && index < length());
3212bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  ASSERT(StringShape(this).IsSequential());
321343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32148e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  return this->IsOneByteRepresentation()
3215fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      ? SeqOneByteString::cast(this)->SeqOneByteStringSet(index, value)
32167c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org      : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value);
321743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
321843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
321943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3220bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgbool String::IsFlat() {
32214668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  if (!StringShape(this).IsCons()) return true;
32224668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  return ConsString::cast(this)->second()->length() == 0;
32234668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}
32244668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
32254668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
32264668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgString* String::GetUnderlying() {
32274668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // Giving direct access to underlying string only makes sense if the
32284668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  // wrapping string is already flattened.
32294668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  ASSERT(this->IsFlat());
32304668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  ASSERT(StringShape(this).IsIndirect());
32314668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset);
32324668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  const int kUnderlyingOffset = SlicedString::kParentOffset;
32334668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  return String::cast(READ_FIELD(this, kUnderlyingOffset));
323443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
323543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
323643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32373484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.orgtemplate<class Visitor>
32383484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.orgConsString* String::VisitFlat(Visitor* visitor,
32393484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org                              String* string,
32403484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org                              const int offset) {
32413484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  int slice_offset = offset;
32423484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  const int length = string->length();
324332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  ASSERT(offset <= length);
324432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  while (true) {
32453484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    int32_t type = string->map()->instance_type();
324632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    switch (type & (kStringRepresentationMask | kStringEncodingMask)) {
324732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      case kSeqStringTag | kOneByteStringTag:
32483484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        visitor->VisitOneByteString(
324959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org            SeqOneByteString::cast(string)->GetChars() + slice_offset,
325059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org            length - offset);
32513484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        return NULL;
325232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
325332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      case kSeqStringTag | kTwoByteStringTag:
32543484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        visitor->VisitTwoByteString(
325559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org            SeqTwoByteString::cast(string)->GetChars() + slice_offset,
325659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org            length - offset);
32573484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        return NULL;
325832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
325932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      case kExternalStringTag | kOneByteStringTag:
32603484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        visitor->VisitOneByteString(
326159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org            ExternalAsciiString::cast(string)->GetChars() + slice_offset,
326259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org            length - offset);
32633484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        return NULL;
326432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
326532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      case kExternalStringTag | kTwoByteStringTag:
32663484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        visitor->VisitTwoByteString(
326759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org            ExternalTwoByteString::cast(string)->GetChars() + slice_offset,
326859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org            length - offset);
32693484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        return NULL;
327032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
327132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      case kSlicedStringTag | kOneByteStringTag:
327232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      case kSlicedStringTag | kTwoByteStringTag: {
327332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org        SlicedString* slicedString = SlicedString::cast(string);
3274a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org        slice_offset += slicedString->offset();
327532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org        string = slicedString->parent();
327632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org        continue;
327732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      }
327832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
327932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      case kConsStringTag | kOneByteStringTag:
328032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      case kConsStringTag | kTwoByteStringTag:
32813484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        return ConsString::cast(string);
328232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
328332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org      default:
328432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org        UNREACHABLE();
32853484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org        return NULL;
328632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    }
328732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  }
328832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
328932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
329032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
3291fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orguint16_t SeqOneByteString::SeqOneByteStringGet(int index) {
329243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < length());
329343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
329443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
329543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
329643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3297fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgvoid SeqOneByteString::SeqOneByteStringSet(int index, uint16_t value) {
329859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  ASSERT(index >= 0 && index < length() && value <= kMaxOneByteCharCode);
329943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize,
330043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                   static_cast<byte>(value));
330143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
330243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
330343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3304fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgAddress SeqOneByteString::GetCharsAddress() {
330543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return FIELD_ADDR(this, kHeaderSize);
330643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
330743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
330843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
330959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orguint8_t* SeqOneByteString::GetChars() {
331059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  return reinterpret_cast<uint8_t*>(GetCharsAddress());
33115a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
33125a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
33135a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
33147c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgAddress SeqTwoByteString::GetCharsAddress() {
33157c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  return FIELD_ADDR(this, kHeaderSize);
33167c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
33177c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
33187c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
33195a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orguc16* SeqTwoByteString::GetChars() {
33205a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize));
33215a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
33225a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
33235a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
33247c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orguint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) {
332543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < length());
332643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize);
332743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
332843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
332943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33307c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgvoid SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) {
333143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < length());
333243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value);
333343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
333443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
333543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3336bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgint SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) {
3337ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  return SizeFor(length());
333843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
333943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
334043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3341fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgint SeqOneByteString::SeqOneByteStringSize(InstanceType instance_type) {
3342ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  return SizeFor(length());
334343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
334443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
334543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33464668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgString* SlicedString::parent() {
33474668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  return String::cast(READ_FIELD(this, kParentOffset));
33484668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}
33494668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
33504668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
3351304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid SlicedString::set_parent(String* parent, WriteBarrierMode mode) {
3352c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT(parent->IsSeqString() || parent->IsExternalString());
33534668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org  WRITE_FIELD(this, kParentOffset, parent);
3354304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kParentOffset, parent, mode);
33554668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org}
33564668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
33574668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
33584668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.orgSMI_ACCESSORS(SlicedString, offset, kOffsetOffset)
33594668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
33604668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org
3361870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgString* ConsString::first() {
3362870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return String::cast(READ_FIELD(this, kFirstOffset));
3363870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
3364870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
3365870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
3366870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgObject* ConsString::unchecked_first() {
336743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_FIELD(this, kFirstOffset);
336843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
336943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
337043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3371870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgvoid ConsString::set_first(String* value, WriteBarrierMode mode) {
337243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(this, kFirstOffset, value);
3373c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode);
337443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
337543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
337643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3377870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgString* ConsString::second() {
3378870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return String::cast(READ_FIELD(this, kSecondOffset));
3379870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
3380870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
3381870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
3382870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgObject* ConsString::unchecked_second() {
338343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_FIELD(this, kSecondOffset);
338443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
338543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
338643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3387870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgvoid ConsString::set_second(String* value, WriteBarrierMode mode) {
338843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(this, kSecondOffset, value);
3389c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode);
339043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
339143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
339243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33931b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgbool ExternalString::is_short() {
33941b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  InstanceType type = map()->instance_type();
33951b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return (type & kShortExternalStringMask) == kShortExternalStringTag;
33960ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
33970ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
33980ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
3399c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comconst ExternalAsciiString::Resource* ExternalAsciiString::resource() {
340043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
340143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
340243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
340343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34041b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid ExternalAsciiString::update_data_cache() {
34051b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (is_short()) return;
34061b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  const char** data_field =
34071b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset));
34081b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  *data_field = resource()->data();
34091b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
34101b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
34111b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
341243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ExternalAsciiString::set_resource(
3413c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    const ExternalAsciiString::Resource* resource) {
34148297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org  ASSERT(IsAligned(reinterpret_cast<intptr_t>(resource), kPointerSize));
3415c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  *reinterpret_cast<const Resource**>(
3416c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      FIELD_ADDR(this, kResourceOffset)) = resource;
34171b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (resource != NULL) update_data_cache();
34180ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
34190ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34200ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
342159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgconst uint8_t* ExternalAsciiString::GetChars() {
342259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org  return reinterpret_cast<const uint8_t*>(resource()->data());
34230ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
34240ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34250ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34260ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryuint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) {
34270ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  ASSERT(index >= 0 && index < length());
34280ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return GetChars()[index];
342943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
343043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
343143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3432c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comconst ExternalTwoByteString::Resource* ExternalTwoByteString::resource() {
343343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
343443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
343543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
343643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34371b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgvoid ExternalTwoByteString::update_data_cache() {
34381b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (is_short()) return;
34391b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  const uint16_t** data_field =
34401b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset));
34411b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  *data_field = resource()->data();
34421b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org}
34431b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
34441b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org
344543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ExternalTwoByteString::set_resource(
3446c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    const ExternalTwoByteString::Resource* resource) {
3447c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  *reinterpret_cast<const Resource**>(
3448c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      FIELD_ADDR(this, kResourceOffset)) = resource;
34491b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  if (resource != NULL) update_data_cache();
34500ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
34510ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34520ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34530ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryconst uint16_t* ExternalTwoByteString::GetChars() {
34541b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  return resource()->data();
34550ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
34560ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34570ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34580ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryuint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) {
34590ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  ASSERT(index >= 0 && index < length());
34600ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return GetChars()[index];
34610ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
34620ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34630ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
34640ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryconst uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData(
34650ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      unsigned start) {
34660ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return GetChars() + start;
346743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
346843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
346943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34703484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.orgint ConsStringIteratorOp::OffsetForDepth(int depth) {
3471a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  return depth & kDepthMask;
347232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
347332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
347432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
347532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgvoid ConsStringIteratorOp::PushLeft(ConsString* string) {
347632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  frames_[depth_++ & kDepthMask] = string;
347732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
347832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
347932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
3480a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgvoid ConsStringIteratorOp::PushRight(ConsString* string) {
3481a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  // Inplace update.
348232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  frames_[(depth_-1) & kDepthMask] = string;
348332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
348432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
348532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
348632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgvoid ConsStringIteratorOp::AdjustMaximumDepth() {
348732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  if (depth_ > maximum_depth_) maximum_depth_ = depth_;
348832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
348932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
349032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
349132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgvoid ConsStringIteratorOp::Pop() {
349232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  ASSERT(depth_ > 0);
349332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  ASSERT(depth_ <= maximum_depth_);
349432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  depth_--;
349532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
349632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
349732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
349832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orguint16_t StringCharacterStream::GetNext() {
34994cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  ASSERT(buffer8_ != NULL && end_ != NULL);
35004cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  // Advance cursor if needed.
35014cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  if (buffer8_ == end_) HasMore();
35024cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  ASSERT(buffer8_ < end_);
350332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  return is_one_byte_ ? *buffer8_++ : *buffer16_++;
350432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
350532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
350632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
35074cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.orgStringCharacterStream::StringCharacterStream(String* string,
35084cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org                                             ConsStringIteratorOp* op,
35093484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org                                             int offset)
3510a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  : is_one_byte_(false),
351132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org    op_(op) {
35124cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  Reset(string, offset);
35134cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org}
35144cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org
35154cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org
35163484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.orgvoid StringCharacterStream::Reset(String* string, int offset) {
35174cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  buffer8_ = NULL;
35184cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org  end_ = NULL;
35193484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  ConsString* cons_string = String::VisitFlat(this, string, offset);
35203484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  op_->Reset(cons_string, offset);
35213484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  if (cons_string != NULL) {
35223484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    string = op_->Next(&offset);
35233484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    if (string != NULL) String::VisitFlat(this, string, offset);
35243484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  }
352532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
352632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
352732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
352832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgbool StringCharacterStream::HasMore() {
352932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  if (buffer8_ != end_) return true;
35303484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  int offset;
35313484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  String* string = op_->Next(&offset);
35323484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  ASSERT_EQ(offset, 0);
3533a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (string == NULL) return false;
35343484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  String::VisitFlat(this, string);
3535a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  ASSERT(buffer8_ != end_);
353632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  return true;
353732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
353832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
353932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
354032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgvoid StringCharacterStream::VisitOneByteString(
35413484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    const uint8_t* chars, int length) {
354232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  is_one_byte_ = true;
354332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  buffer8_ = chars;
354432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  end_ = chars + length;
354532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
354632280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
354732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
354832280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.orgvoid StringCharacterStream::VisitTwoByteString(
35493484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org    const uint16_t* chars, int length) {
355032280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  is_one_byte_ = false;
355132280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  buffer16_ = chars;
355232280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org  end_ = reinterpret_cast<const uint8_t*>(chars + length);
355332280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org}
355432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
355532280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
3556ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid JSFunctionResultCache::MakeZeroSize() {
35570511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  set_finger_index(kEntriesIndex);
35580511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  set_size(kEntriesIndex);
3559ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org}
3560ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org
3561ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org
3562ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.orgvoid JSFunctionResultCache::Clear() {
35630511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  int cache_size = size();
35644954674151afa960af66efb4831df06bde727333yangguo@chromium.org  Object** entries_start = RawFieldOfElementAt(kEntriesIndex);
3565e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  MemsetPointer(entries_start,
3566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                GetHeap()->the_hole_value(),
3567e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org                cache_size - kEntriesIndex);
3568ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org  MakeZeroSize();
3569ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org}
3570ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org
3571ac091b7d178f1853ede4a5cba58e767e6adf7d96ager@chromium.org
35720511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comint JSFunctionResultCache::size() {
35730511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  return Smi::cast(get(kCacheSizeIndex))->value();
35740511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com}
35750511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
35760511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
35770511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comvoid JSFunctionResultCache::set_size(int size) {
35780511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  set(kCacheSizeIndex, Smi::FromInt(size));
35790511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com}
35800511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
35810511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
35820511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comint JSFunctionResultCache::finger_index() {
35830511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  return Smi::cast(get(kFingerIndex))->value();
35840511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com}
35850511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
35860511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
35870511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.comvoid JSFunctionResultCache::set_finger_index(int finger_index) {
35880511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com  set(kFingerIndex, Smi::FromInt(finger_index));
35890511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com}
35900511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
35910511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
359243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbyte ByteArray::get(int index) {
359343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < this->length());
359443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
359543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
359643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
359743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
359843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid ByteArray::set(int index, byte value) {
359943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && index < this->length());
360043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
360143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
360243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
360343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
360443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint ByteArray::get_int(int index) {
360543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(index >= 0 && (index * kIntSize) < this->length());
360643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_INT_FIELD(this, kHeaderSize + index * kIntSize);
360743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
360843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
360943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
361043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenByteArray* ByteArray::FromDataStartAddress(Address address) {
361143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT_TAG_ALIGNED(address);
361243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
361343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
361443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
361543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
361643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenAddress ByteArray::GetDataStartAddress() {
361743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
361843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
361943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
362043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3621af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orguint8_t* ExternalUint8ClampedArray::external_uint8_clamped_pointer() {
36224d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  return reinterpret_cast<uint8_t*>(external_pointer());
36230b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
36240b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
36250b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
3626af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orguint8_t ExternalUint8ClampedArray::get_scalar(int index) {
36270b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  ASSERT((index >= 0) && (index < this->length()));
3628af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  uint8_t* ptr = external_uint8_clamped_pointer();
36290b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  return ptr[index];
36300b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
36310b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
36320b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
36339e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalUint8ClampedArray::get(
36349e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    Handle<ExternalUint8ClampedArray> array,
36359e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    int index) {
3636731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3637731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org                     array->GetIsolate());
36389e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
36399e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
36409e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
3641af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalUint8ClampedArray::set(int index, uint8_t value) {
36420b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  ASSERT((index >= 0) && (index < this->length()));
3643af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  uint8_t* ptr = external_uint8_clamped_pointer();
36440b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  ptr[index] = value;
36450b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
36460b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
36470b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
36483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid* ExternalArray::external_pointer() {
36493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
36503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return reinterpret_cast<void*>(ptr);
36513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
36523811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
36533811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
36543811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgvoid ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
36553811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  intptr_t ptr = reinterpret_cast<intptr_t>(value);
36563811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
36573811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
36583811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
36593811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3660af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgint8_t ExternalInt8Array::get_scalar(int index) {
36613811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
36623811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  int8_t* ptr = static_cast<int8_t*>(external_pointer());
36633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return ptr[index];
36643811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
36653811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
36663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
36679e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalInt8Array::get(Handle<ExternalInt8Array> array,
36689e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                      int index) {
3669731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3670731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org                     array->GetIsolate());
36719e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
36729e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
36739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
3674af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalInt8Array::set(int index, int8_t value) {
36753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
36763811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  int8_t* ptr = static_cast<int8_t*>(external_pointer());
36773811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ptr[index] = value;
36783811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
36793811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
36803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3681af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orguint8_t ExternalUint8Array::get_scalar(int index) {
36823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
36833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
36843811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return ptr[index];
36853811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
36863811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
36873811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
36889e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalUint8Array::get(Handle<ExternalUint8Array> array,
36899e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                       int index) {
3690731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3691731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org                     array->GetIsolate());
36929e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
36939e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
36949e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
3695af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalUint8Array::set(int index, uint8_t value) {
36963811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
36973811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
36983811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ptr[index] = value;
36993811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37013811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3702af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgint16_t ExternalInt16Array::get_scalar(int index) {
37033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  int16_t* ptr = static_cast<int16_t*>(external_pointer());
37053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return ptr[index];
37063811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37073811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37083811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37099e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalInt16Array::get(Handle<ExternalInt16Array> array,
37109e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                       int index) {
3711731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3712731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org                     array->GetIsolate());
37139e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
37149e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
37159e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
3716af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalInt16Array::set(int index, int16_t value) {
37173811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37183811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  int16_t* ptr = static_cast<int16_t*>(external_pointer());
37193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ptr[index] = value;
37203811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37213811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3723af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orguint16_t ExternalUint16Array::get_scalar(int index) {
37243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37253811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
37263811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return ptr[index];
37273811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37283811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37309e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalUint16Array::get(Handle<ExternalUint16Array> array,
37319e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                        int index) {
3732731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3733731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org                     array->GetIsolate());
37349e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
37359e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
37369e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
3737af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalUint16Array::set(int index, uint16_t value) {
37383811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37393811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
37403811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ptr[index] = value;
37413811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37423811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37433811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3744af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgint32_t ExternalInt32Array::get_scalar(int index) {
37453811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  int32_t* ptr = static_cast<int32_t*>(external_pointer());
37473811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return ptr[index];
37483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37519e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalInt32Array::get(Handle<ExternalInt32Array> array,
37529e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                       int index) {
37539e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return array->GetIsolate()->factory()->
37549e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org      NewNumberFromInt(array->get_scalar(index));
37557c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org}
37567c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
37577c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
3758af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalInt32Array::set(int index, int32_t value) {
37593811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37603811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  int32_t* ptr = static_cast<int32_t*>(external_pointer());
37613811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ptr[index] = value;
37623811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37643811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3765af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orguint32_t ExternalUint32Array::get_scalar(int index) {
37663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
37683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return ptr[index];
37693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37703811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37713811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37729e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalUint32Array::get(Handle<ExternalUint32Array> array,
37739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                        int index) {
37749e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return array->GetIsolate()->factory()->
37759e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org      NewNumberFromUint(array->get_scalar(index));
37767c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org}
37777c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
37787c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
3779af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalUint32Array::set(int index, uint32_t value) {
37803811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37813811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
37823811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ptr[index] = value;
37833811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37843811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37853811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3786af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgfloat ExternalFloat32Array::get_scalar(int index) {
37873811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
37883811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  float* ptr = static_cast<float*>(external_pointer());
37893811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return ptr[index];
37903811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
37913811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37923811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
37939e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalFloat32Array::get(Handle<ExternalFloat32Array> array,
37949e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                         int index) {
37959e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index));
37967c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org}
37977c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
37987c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
3799af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalFloat32Array::set(int index, float value) {
38003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ASSERT((index >= 0) && (index < this->length()));
38013811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  float* ptr = static_cast<float*>(external_pointer());
38023811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  ptr[index] = value;
38033811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
38043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
38056a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org
3806af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgdouble ExternalFloat64Array::get_scalar(int index) {
38073847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  ASSERT((index >= 0) && (index < this->length()));
38083847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  double* ptr = static_cast<double*>(external_pointer());
38093847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  return ptr[index];
38103847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com}
38113847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
38123847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
38139e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> ExternalFloat64Array::get(Handle<ExternalFloat64Array> array,
38149e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                         int index) {
38159e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index));
38169e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
38179e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
38189e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
3819af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgvoid ExternalFloat64Array::set(int index, double value) {
38203847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  ASSERT((index >= 0) && (index < this->length()));
38213847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  double* ptr = static_cast<double*>(external_pointer());
38223847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  ptr[index] = value;
38233847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com}
38243847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
38253847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
3826895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgvoid* FixedTypedArrayBase::DataPtr() {
3827895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return FIELD_ADDR(this, kDataOffset);
3828895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3829895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3830895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3831d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgint FixedTypedArrayBase::DataSize(InstanceType type) {
38325c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  int element_size;
3833d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  switch (type) {
3834895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size)                       \
3835895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    case FIXED_##TYPE##_ARRAY_TYPE:                                           \
3836895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org      element_size = size;                                                    \
38375c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      break;
3838895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3839895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    TYPED_ARRAYS(TYPED_ARRAY_CASE)
3840895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org#undef TYPED_ARRAY_CASE
38415c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    default:
38425c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      UNREACHABLE();
38435c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      return 0;
38445c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
3845895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return length() * element_size;
38465c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}
38475c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
38485c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
3849d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgint FixedTypedArrayBase::DataSize() {
3850d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return DataSize(map()->instance_type());
3851d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
3852d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
3853d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
3854895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgint FixedTypedArrayBase::size() {
3855895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return OBJECT_POINTER_ALIGN(kDataOffset + DataSize());
3856895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3857895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3858895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3859d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgint FixedTypedArrayBase::TypedArraySize(InstanceType type) {
3860d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return OBJECT_POINTER_ALIGN(kDataOffset + DataSize(type));
3861d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
3862d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
3863d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
3864895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orguint8_t Uint8ArrayTraits::defaultValue() { return 0; }
3865895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3866895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3867895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orguint8_t Uint8ClampedArrayTraits::defaultValue() { return 0; }
3868895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3869895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3870895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgint8_t Int8ArrayTraits::defaultValue() { return 0; }
3871895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3872895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3873895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orguint16_t Uint16ArrayTraits::defaultValue() { return 0; }
3874895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3875895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3876895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgint16_t Int16ArrayTraits::defaultValue() { return 0; }
3877895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3878895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3879895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orguint32_t Uint32ArrayTraits::defaultValue() { return 0; }
3880895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3881895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3882895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgint32_t Int32ArrayTraits::defaultValue() { return 0; }
3883895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3884895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3885895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgfloat Float32ArrayTraits::defaultValue() {
3886895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return static_cast<float>(OS::nan_value());
3887895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3888895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3889895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3890895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgdouble Float64ArrayTraits::defaultValue() { return OS::nan_value(); }
3891895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3892895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
38935c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgtemplate <class Traits>
38945c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgtypename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) {
38955c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ASSERT((index >= 0) && (index < this->length()));
38965c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ElementType* ptr = reinterpret_cast<ElementType*>(
38975c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      FIELD_ADDR(this, kDataOffset));
38985c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return ptr[index];
38995c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}
39005c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
390157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
390257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgtemplate<> inline
390357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgFixedTypedArray<Float64ArrayTraits>::ElementType
390457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    FixedTypedArray<Float64ArrayTraits>::get_scalar(int index) {
390557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  ASSERT((index >= 0) && (index < this->length()));
390657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  return READ_DOUBLE_FIELD(this, ElementOffset(index));
390757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org}
390857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
390957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
39105c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgtemplate <class Traits>
39115c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgvoid FixedTypedArray<Traits>::set(int index, ElementType value) {
39125c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ASSERT((index >= 0) && (index < this->length()));
39135c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ElementType* ptr = reinterpret_cast<ElementType*>(
39145c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      FIELD_ADDR(this, kDataOffset));
39155c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ptr[index] = value;
39165c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}
39175c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
39185c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
391957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgtemplate<> inline
392057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgvoid FixedTypedArray<Float64ArrayTraits>::set(
392157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    int index, Float64ArrayTraits::ElementType value) {
392257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  ASSERT((index >= 0) && (index < this->length()));
392357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  WRITE_DOUBLE_FIELD(this, ElementOffset(index), value);
392457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org}
392557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
392657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
39275c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgtemplate <class Traits>
3928895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtypename Traits::ElementType FixedTypedArray<Traits>::from_int(int value) {
3929895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return static_cast<ElementType>(value);
3930895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3931895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3932895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3933895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtemplate <> inline
3934895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orguint8_t FixedTypedArray<Uint8ClampedArrayTraits>::from_int(int value) {
3935895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  if (value < 0) return 0;
3936895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  if (value > 0xFF) return 0xFF;
3937895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return static_cast<uint8_t>(value);
3938895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3939895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3940895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3941895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtemplate <class Traits>
3942895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtypename Traits::ElementType FixedTypedArray<Traits>::from_double(
3943895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    double value) {
3944895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return static_cast<ElementType>(DoubleToInt32(value));
3945895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3946895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3947895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3948895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtemplate<> inline
3949895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orguint8_t FixedTypedArray<Uint8ClampedArrayTraits>::from_double(double value) {
3950895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  if (value < 0) return 0;
3951895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  if (value > 0xFF) return 0xFF;
3952895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return static_cast<uint8_t>(lrint(value));
3953895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3954895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3955895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3956895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtemplate<> inline
3957895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgfloat FixedTypedArray<Float32ArrayTraits>::from_double(double value) {
3958895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return static_cast<float>(value);
3959895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3960895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3961895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3962895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtemplate<> inline
3963895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgdouble FixedTypedArray<Float64ArrayTraits>::from_double(double value) {
3964895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return value;
3965895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
3966895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3967895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
3968895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgtemplate <class Traits>
39699e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> FixedTypedArray<Traits>::get(
39709e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    Handle<FixedTypedArray<Traits> > array,
39719e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    int index) {
39729e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return Traits::ToHandle(array->GetIsolate(), array->get_scalar(index));
39739e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
39749e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
3975731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org
39769e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgtemplate <class Traits>
3977731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.orgHandle<Object> FixedTypedArray<Traits>::SetValue(
3978731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org    Handle<FixedTypedArray<Traits> > array,
3979731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org    uint32_t index,
3980731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org    Handle<Object> value) {
39815c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ElementType cast_value = Traits::defaultValue();
3982731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  if (index < static_cast<uint32_t>(array->length())) {
39835c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    if (value->IsSmi()) {
3984731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org      int int_value = Handle<Smi>::cast(value)->value();
3985895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org      cast_value = from_int(int_value);
39865c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    } else if (value->IsHeapNumber()) {
3987731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org      double double_value = Handle<HeapNumber>::cast(value)->value();
3988895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org      cast_value = from_double(double_value);
39895c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    } else {
39905c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      // Clamp undefined to the default value. All other types have been
39915c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      // converted to a number type further up in the call chain.
39925c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      ASSERT(value->IsUndefined());
39935c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org    }
3994731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org    array->set(index, cast_value);
39955c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
3996731474e847a8ccd6e27f74842506c9c807dae658jarin@chromium.org  return Traits::ToHandle(array->GetIsolate(), cast_value);
39975c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}
39985c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
39995c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
40009e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) {
40019e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return handle(Smi::FromInt(scalar), isolate);
40029e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40039e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40049e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40059e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Uint8ClampedArrayTraits::ToHandle(Isolate* isolate,
40069e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org                                                 uint8_t scalar) {
40079e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return handle(Smi::FromInt(scalar), isolate);
40089e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40099e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40109e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40119e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Int8ArrayTraits::ToHandle(Isolate* isolate, int8_t scalar) {
40129e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return handle(Smi::FromInt(scalar), isolate);
40139e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40149e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40159e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40169e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Uint16ArrayTraits::ToHandle(Isolate* isolate, uint16_t scalar) {
40179e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return handle(Smi::FromInt(scalar), isolate);
40189e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40199e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40209e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40219e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Int16ArrayTraits::ToHandle(Isolate* isolate, int16_t scalar) {
40229e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return handle(Smi::FromInt(scalar), isolate);
40239e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40249e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40259e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40269e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Uint32ArrayTraits::ToHandle(Isolate* isolate, uint32_t scalar) {
40279e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return isolate->factory()->NewNumberFromUint(scalar);
40289e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40299e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40309e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40319e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Int32ArrayTraits::ToHandle(Isolate* isolate, int32_t scalar) {
40329e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return isolate->factory()->NewNumberFromInt(scalar);
40339e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40349e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40359e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40369e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Float32ArrayTraits::ToHandle(Isolate* isolate, float scalar) {
40379e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return isolate->factory()->NewNumber(scalar);
40389e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40399e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40409e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40419e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.orgHandle<Object> Float64ArrayTraits::ToHandle(Isolate* isolate, double scalar) {
40429e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org  return isolate->factory()->NewNumber(scalar);
40439e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org}
40449e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40459e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org
40465b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.orgint Map::visitor_id() {
40475b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  return READ_BYTE_FIELD(this, kVisitorIdOffset);
40485b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org}
40495b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org
40505b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org
40515b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.orgvoid Map::set_visitor_id(int id) {
40525b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  ASSERT(0 <= id && id < 256);
40535b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org  WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id));
40545b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org}
40555b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org
40563811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
405743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint Map::instance_size() {
40585b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return NOBARRIER_READ_BYTE_FIELD(
40595b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      this, kInstanceSizeOffset) << kPointerSizeLog2;
40607c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
40617c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
40627c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
40637c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgint Map::inobject_properties() {
40647c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  return READ_BYTE_FIELD(this, kInObjectPropertiesOffset);
406543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
406643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
406743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4068911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgint Map::pre_allocated_property_fields() {
4069911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset);
4070911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org}
4071911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
4072911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
40730a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.orgint Map::GetInObjectPropertyOffset(int index) {
40740a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  // Adjust for the number of properties stored in the object.
40750a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  index -= inobject_properties();
4076e7a6d372100022f492c88886898add6a51e66977machenbach@chromium.org  ASSERT(index <= 0);
40770a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  return instance_size() + (index * kPointerSize);
40780a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org}
40790a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org
40800a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org
408143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint HeapObject::SizeFromMap(Map* map) {
4082145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  int instance_size = map->instance_size();
4083145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  if (instance_size != kVariableSizeSentinel) return instance_size;
40845aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  // Only inline the most frequent cases.
4085d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  InstanceType instance_type = map->instance_type();
408643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (instance_type == FIXED_ARRAY_TYPE) {
4087ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org    return FixedArray::BodyDescriptor::SizeOf(map, this);
408843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
40891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (instance_type == ASCII_STRING_TYPE ||
40901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      instance_type == ASCII_INTERNALIZED_STRING_TYPE) {
4091fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    return SeqOneByteString::SizeFor(
4092fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org        reinterpret_cast<SeqOneByteString*>(this)->length());
4093145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  }
40945aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  if (instance_type == BYTE_ARRAY_TYPE) {
40955aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org    return reinterpret_cast<ByteArray*>(this)->ByteArraySize();
40965aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org  }
4097c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (instance_type == FREE_SPACE_TYPE) {
40989e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org    return reinterpret_cast<FreeSpace*>(this)->nobarrier_size();
4099c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
41001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (instance_type == STRING_TYPE ||
41011510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      instance_type == INTERNALIZED_STRING_TYPE) {
4102145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com    return SeqTwoByteString::SizeFor(
4103145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com        reinterpret_cast<SeqTwoByteString*>(this)->length());
4104145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  }
41056d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
41066d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org    return FixedDoubleArray::SizeFor(
41076d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org        reinterpret_cast<FixedDoubleArray*>(this)->length());
41086d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  }
4109a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (instance_type == CONSTANT_POOL_ARRAY_TYPE) {
4110196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    return reinterpret_cast<ConstantPoolArray*>(this)->size();
4111a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  }
41125c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
41135c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org      instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) {
4114d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    return reinterpret_cast<FixedTypedArrayBase*>(
4115d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        this)->TypedArraySize(instance_type);
41165c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
4117145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  ASSERT(instance_type == CODE_TYPE);
4118145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  return reinterpret_cast<Code*>(this)->CodeSize();
411943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
412043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
412143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
412243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Map::set_instance_size(int value) {
412371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org  ASSERT_EQ(0, value & (kPointerSize - 1));
41247c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  value >>= kPointerSizeLog2;
412543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(0 <= value && value < 256);
41265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  NOBARRIER_WRITE_BYTE_FIELD(
41275b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      this, kInstanceSizeOffset, static_cast<byte>(value));
412843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
412943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
413043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41317c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgvoid Map::set_inobject_properties(int value) {
41327c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  ASSERT(0 <= value && value < 256);
41337c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value));
41347c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
41357c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
41367c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
4137911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgvoid Map::set_pre_allocated_property_fields(int value) {
4138911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  ASSERT(0 <= value && value < 256);
4139911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org  WRITE_BYTE_FIELD(this,
4140911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org                   kPreAllocatedPropertyFieldsOffset,
4141911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org                   static_cast<byte>(value));
4142911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org}
4143911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
4144911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org
414543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenInstanceType Map::instance_type() {
414643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
414743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
414843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
414943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
415043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Map::set_instance_type(InstanceType value) {
415143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
415243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
415343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
415443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
415543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint Map::unused_property_fields() {
415643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset);
415743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
415843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
415943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
416043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Map::set_unused_property_fields(int value) {
416143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255));
416243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
416343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
416443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
416543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbyte Map::bit_field() {
416643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_BYTE_FIELD(this, kBitFieldOffset);
416743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
416843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
416943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
417043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Map::set_bit_field(byte value) {
417143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_BYTE_FIELD(this, kBitFieldOffset, value);
417243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
417343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
417443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41753a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.orgbyte Map::bit_field2() {
41763a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org  return READ_BYTE_FIELD(this, kBitField2Offset);
41773a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org}
41783a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org
41793a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org
41803a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.orgvoid Map::set_bit_field2(byte value) {
41813a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org  WRITE_BYTE_FIELD(this, kBitField2Offset, value);
41823a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org}
41833a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org
41843a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org
418543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Map::set_non_instance_prototype(bool value) {
418643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (value) {
418743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_bit_field(bit_field() | (1 << kHasNonInstancePrototype));
418843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
418943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype));
419043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
419143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
419243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
419343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
419443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Map::has_non_instance_prototype() {
419543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return ((1 << kHasNonInstancePrototype) & bit_field()) != 0;
419643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
419743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
419843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41994111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgvoid Map::set_function_with_prototype(bool value) {
42003c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  set_bit_field(FunctionWithPrototype::update(bit_field(), value));
42014111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org}
42024111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
42034111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
42044111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgbool Map::function_with_prototype() {
42053c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  return FunctionWithPrototype::decode(bit_field());
42064111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org}
42074111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
42084111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
4209870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgvoid Map::set_is_access_check_needed(bool access_check_needed) {
4210870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  if (access_check_needed) {
4211870a0b67c822d289024711912e2512af01b66c3bager@chromium.org    set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded));
4212870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  } else {
4213870a0b67c822d289024711912e2512af01b66c3bager@chromium.org    set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded));
4214870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  }
4215870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
4216870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
4217870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
4218870a0b67c822d289024711912e2512af01b66c3bager@chromium.orgbool Map::is_access_check_needed() {
4219870a0b67c822d289024711912e2512af01b66c3bager@chromium.org  return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0;
4220870a0b67c822d289024711912e2512af01b66c3bager@chromium.org}
4221870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
4222870a0b67c822d289024711912e2512af01b66c3bager@chromium.org
422369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgvoid Map::set_is_extensible(bool value) {
422469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  if (value) {
422569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org    set_bit_field2(bit_field2() | (1 << kIsExtensible));
422669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  } else {
422769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org    set_bit_field2(bit_field2() & ~(1 << kIsExtensible));
422869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  }
422969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org}
423069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
423169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgbool Map::is_extensible() {
423269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  return ((1 << kIsExtensible) & bit_field2()) != 0;
423369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org}
423469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
423569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
42364a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgvoid Map::set_is_shared(bool value) {
4237304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  set_bit_field3(IsShared::update(bit_field3(), value));
42384a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org}
42394a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
424088767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com
42414a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.orgbool Map::is_shared() {
4242bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org  return IsShared::decode(bit_field3()); }
42434a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
42444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
424588767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.comvoid Map::set_dictionary_map(bool value) {
424657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  uint32_t new_bit_field3 = DictionaryMap::update(bit_field3(), value);
424757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  new_bit_field3 = IsUnstable::update(new_bit_field3, value);
424857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  set_bit_field3(new_bit_field3);
424988767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com}
425088767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com
425188767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com
425288767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.combool Map::is_dictionary_map() {
425388767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com  return DictionaryMap::decode(bit_field3());
425488767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com}
425588767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com
425688767247437a4504f433cc5abea22a473e5ed982erik.corry@gmail.com
425743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCode::Flags Code::flags() {
425843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
425943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
426043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
426143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
426206ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgvoid Map::set_owns_descriptors(bool is_shared) {
426306ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  set_bit_field3(OwnsDescriptors::update(bit_field3(), is_shared));
426406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org}
426506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org
426606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org
426706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgbool Map::owns_descriptors() {
426806ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  return OwnsDescriptors::decode(bit_field3());
426906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org}
427006ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org
427106ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org
4272b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgvoid Map::set_has_instance_call_handler() {
4273b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  set_bit_field3(HasInstanceCallHandler::update(bit_field3(), true));
4274e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
4275e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
4276e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
4277b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.orgbool Map::has_instance_call_handler() {
4278b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org  return HasInstanceCallHandler::decode(bit_field3());
4279e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
4280e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
4281e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
4282f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgvoid Map::deprecate() {
4283f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  set_bit_field3(Deprecated::update(bit_field3(), true));
4284f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
4285f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
4286f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
4287f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgbool Map::is_deprecated() {
4288f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return Deprecated::decode(bit_field3());
4289f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
4290f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
4291f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
4292594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid Map::set_migration_target(bool value) {
4293594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  set_bit_field3(IsMigrationTarget::update(bit_field3(), value));
4294594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
4295594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4296594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4297594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgbool Map::is_migration_target() {
4298594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return IsMigrationTarget::decode(bit_field3());
4299594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
4300594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4301594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4302011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid Map::set_done_inobject_slack_tracking(bool value) {
4303011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  set_bit_field3(DoneInobjectSlackTracking::update(bit_field3(), value));
4304011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
4305011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
4306011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
4307011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgbool Map::done_inobject_slack_tracking() {
4308011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  return DoneInobjectSlackTracking::decode(bit_field3());
4309011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
4310011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
4311011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
4312011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgvoid Map::set_construction_count(int value) {
4313011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  set_bit_field3(ConstructionCount::update(bit_field3(), value));
4314011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
4315011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
4316011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
4317011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgint Map::construction_count() {
4318011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  return ConstructionCount::decode(bit_field3());
4319011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
4320011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
4321011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
4322a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgvoid Map::freeze() {
4323a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  set_bit_field3(IsFrozen::update(bit_field3(), true));
4324a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4325a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4326a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4327a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgbool Map::is_frozen() {
4328a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  return IsFrozen::decode(bit_field3());
4329a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4330a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4331a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4332d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvoid Map::mark_unstable() {
4333d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  set_bit_field3(IsUnstable::update(bit_field3(), true));
4334d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
4335d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
4336d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
4337d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgbool Map::is_stable() {
4338d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return !IsUnstable::decode(bit_field3());
4339d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
4340d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
4341d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
4342ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgbool Map::has_code_cache() {
4343ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return code_cache() != GetIsolate()->heap()->empty_fixed_array();
4344ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
4345ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
4346ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
4347f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.orgbool Map::CanBeDeprecated() {
4348f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  int descriptor = LastAdded();
4349f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  for (int i = 0; i <= descriptor; i++) {
4350f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    PropertyDetails details = instance_descriptors()->GetDetails(i);
4351bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    if (details.representation().IsNone()) return true;
4352bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    if (details.representation().IsSmi()) return true;
4353bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    if (details.representation().IsDouble()) return true;
4354bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    if (details.representation().IsHeapObject()) return true;
4355bc176057ae476990672de915df235c9aeadc8521titzer@chromium.org    if (details.type() == CONSTANT) return true;
4356f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
4357f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  return false;
4358f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org}
4359f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
4360f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org
43612e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgvoid Map::NotifyLeafMapLayoutChange() {
4362d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (is_stable()) {
4363d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    mark_unstable();
4364d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    dependent_code()->DeoptimizeDependentCodeGroup(
4365d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        GetIsolate(),
4366d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        DependentCode::kPrototypeCheckGroup);
4367d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
43682e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org}
43692e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
43702e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
4371c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.orgbool Map::CanOmitMapChecks() {
4372d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return is_stable() && FLAG_omit_map_checks_for_leaf_maps;
4373c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org}
4374c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
4375c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
43762e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgint DependentCode::number_of_entries(DependencyGroup group) {
4377003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  if (length() == 0) return 0;
43782e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  return Smi::cast(get(group))->value();
4379003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
4380003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4381003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
43822e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgvoid DependentCode::set_number_of_entries(DependencyGroup group, int value) {
43832e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  set(group, Smi::FromInt(value));
4384003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
4385003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4386003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
438741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgbool DependentCode::is_code_at(int i) {
438841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  return get(kCodesStartIndex + i)->IsCode();
438941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
439041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
43912e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgCode* DependentCode::code_at(int i) {
43922e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  return Code::cast(get(kCodesStartIndex + i));
4393003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
4394003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4395003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
439641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgCompilationInfo* DependentCode::compilation_info_at(int i) {
439741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  return reinterpret_cast<CompilationInfo*>(
439841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      Foreign::cast(get(kCodesStartIndex + i))->foreign_address());
43991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
44001fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
44011fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
440241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgvoid DependentCode::set_object_at(int i, Object* object) {
440341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  set(kCodesStartIndex + i, object);
440441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
440541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
440641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
440741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgObject* DependentCode::object_at(int i) {
440841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  return get(kCodesStartIndex + i);
440941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
441041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
441141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
441241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgObject** DependentCode::slot_at(int i) {
44134954674151afa960af66efb4831df06bde727333yangguo@chromium.org  return RawFieldOfElementAt(kCodesStartIndex + i);
4414003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
4415003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4416003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
441741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgvoid DependentCode::clear_at(int i) {
44182e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  set_undefined(kCodesStartIndex + i);
44192e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org}
44202e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
44212e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
442241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.orgvoid DependentCode::copy(int from, int to) {
442341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  set(kCodesStartIndex + to, get(kCodesStartIndex + from));
442441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org}
442541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
442641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org
44272e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgvoid DependentCode::ExtendGroup(DependencyGroup group) {
44282e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  GroupStartIndexes starts(this);
44292e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  for (int g = kGroupCount - 1; g > group; g--) {
44302e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    if (starts.at(g) < starts.at(g + 1)) {
443141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      copy(starts.at(g), starts.at(g + 1));
44322e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    }
44332e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  }
4434003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
4435003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4436003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
443743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Code::set_flags(Code::Flags flags) {
443883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
443943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_INT_FIELD(this, kFlagsOffset, flags);
444043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
444143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
444243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
444343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCode::Kind Code::kind() {
444443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return ExtractKindFromFlags(flags());
444543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
444643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
444743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44487276f14ca716596e0a0d17539516370c1f453847kasper.lundInlineCacheState Code::ic_state() {
44497276f14ca716596e0a0d17539516370c1f453847kasper.lund  InlineCacheState result = ExtractICStateFromFlags(flags());
445043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Only allow uninitialized or debugger states for non-IC code
445143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // objects. This is used in the debugger to determine whether or not
445243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // a call to code object has been replaced with a debug break call.
445343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(is_inline_cache_stub() ||
445443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen         result == UNINITIALIZED ||
44559768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org         result == DEBUG_STUB);
445643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
445743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
445843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
445943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4460cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.orgExtraICState Code::extra_ic_state() {
4461052c9560e8a41c723726ebe914a93747d8f13285hpayer@chromium.org  ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB);
4462f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return ExtractExtraICStateFromFlags(flags());
4463052c9560e8a41c723726ebe914a93747d8f13285hpayer@chromium.org}
4464052c9560e8a41c723726ebe914a93747d8f13285hpayer@chromium.org
4465052c9560e8a41c723726ebe914a93747d8f13285hpayer@chromium.org
44667a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.orgCode::StubType Code::type() {
446743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return ExtractTypeFromFlags(flags());
446843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
446943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
447043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4471113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org// For initialization.
4472113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.orgvoid Code::set_raw_kind_specific_flags1(int value) {
4473113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  WRITE_INT_FIELD(this, kKindSpecificFlags1Offset, value);
4474113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org}
4475113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org
4476113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org
4477113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.orgvoid Code::set_raw_kind_specific_flags2(int value) {
4478113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  WRITE_INT_FIELD(this, kKindSpecificFlags2Offset, value);
4479113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org}
4480113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org
4481113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org
4482b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orginline bool Code::is_crankshafted() {
4483b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  return IsCrankshaftedField::decode(
4484b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags2Offset));
4485b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org}
4486b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
4487b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
4488b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orginline void Code::set_is_crankshafted(bool value) {
4489b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4490b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  int updated = IsCrankshaftedField::update(previous, value);
4491b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4492b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org}
4493b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
4494b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
4495d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.orgint Code::major_key() {
449690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  ASSERT(has_major_key());
449781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  return StubMajorKeyField::decode(
449881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags2Offset));
44997276f14ca716596e0a0d17539516370c1f453847kasper.lund}
45007276f14ca716596e0a0d17539516370c1f453847kasper.lund
45017276f14ca716596e0a0d17539516370c1f453847kasper.lund
4502d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.orgvoid Code::set_major_key(int major) {
450390dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  ASSERT(has_major_key());
45047276f14ca716596e0a0d17539516370c1f453847kasper.lund  ASSERT(0 <= major && major < 256);
450581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
450681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int updated = StubMajorKeyField::update(previous, major);
450781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
450843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
450943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
451043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
451190dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.orgbool Code::has_major_key() {
451290dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org  return kind() == STUB ||
451390dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == HANDLER ||
451490dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == BINARY_OP_IC ||
451590dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == COMPARE_IC ||
451690dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == COMPARE_NIL_IC ||
451790dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == LOAD_IC ||
451890dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == KEYED_LOAD_IC ||
451990dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == STORE_IC ||
4520a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      kind() == CALL_IC ||
452190dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == KEYED_STORE_IC ||
452290dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org      kind() == TO_BOOLEAN_IC;
452390dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org}
452490dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org
452590dca01eac542464c29011d239bf18f26e0b8f00machenbach@chromium.org
4526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool Code::optimizable() {
45277d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
4528a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return READ_BYTE_FIELD(this, kOptimizableOffset) == 1;
4529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4530a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4531a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4532a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Code::set_optimizable(bool value) {
45337d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
4534a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0);
4535a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4536a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4537a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool Code::has_deoptimization_support() {
45397d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
454034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
454134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  return FullCodeFlagsHasDeoptimizationSupportField::decode(flags);
4542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4545a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Code::set_has_deoptimization_support(bool value) {
45467d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
454734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
454834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value);
454934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
455034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org}
455134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
455234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
455334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgbool Code::has_debug_break_slots() {
45547d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
455534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
455634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  return FullCodeFlagsHasDebugBreakSlotsField::decode(flags);
455734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org}
455834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
455934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
456034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgvoid Code::set_has_debug_break_slots(bool value) {
45617d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
456234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
456334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  flags = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value);
456434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
4565a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4566a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4567a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4568394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.combool Code::is_compiled_optimizable() {
45697d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
4570394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
4571394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  return FullCodeFlagsIsCompiledOptimizable::decode(flags);
4572394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
4573394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
4574394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
4575394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid Code::set_compiled_optimizable(bool value) {
45767d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
4577394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
4578394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value);
4579394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
4580394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
4581394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
4582394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
45831456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgint Code::allow_osr_at_loop_nesting_level() {
45847d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
45851456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  return READ_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset);
4586a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org}
4587a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org
4588a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org
45891456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgvoid Code::set_allow_osr_at_loop_nesting_level(int level) {
45907d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
45911456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  ASSERT(level >= 0 && level <= kMaxLoopNestingMarker);
45921456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  WRITE_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset, level);
4593a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org}
4594a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org
4595a7d3df915ae6a29cd392dba32a26049d7b9b008fyangguo@chromium.org
45961456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgint Code::profiler_ticks() {
45977d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
45981456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  return READ_BYTE_FIELD(this, kProfilerTicksOffset);
4599a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4600a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4601a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
46021456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgvoid Code::set_profiler_ticks(int ticks) {
46037d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
46041456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  ASSERT(ticks < 256);
46051456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  WRITE_BYTE_FIELD(this, kProfilerTicksOffset, ticks);
4606a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4609a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgunsigned Code::stack_slots() {
4610b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  ASSERT(is_crankshafted());
461181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  return StackSlotsField::decode(
461281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4613a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4614a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4615a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4616a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Code::set_stack_slots(unsigned slots) {
461781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  CHECK(slots <= (1 << kStackSlotsBitCount));
4618b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  ASSERT(is_crankshafted());
461981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
462081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int updated = StackSlotsField::update(previous, slots);
462181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
462583aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgunsigned Code::safepoint_table_offset() {
4626b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  ASSERT(is_crankshafted());
462781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  return SafepointTableOffsetField::decode(
462881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags2Offset));
4629a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4630a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4631a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
463283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.orgvoid Code::set_safepoint_table_offset(unsigned offset) {
463381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  CHECK(offset <= (1 << kSafepointTableOffsetBitCount));
4634b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  ASSERT(is_crankshafted());
4635a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
463681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
463781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int updated = SafepointTableOffsetField::update(previous, offset);
463881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4639a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4640a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4641a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4642e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgunsigned Code::back_edge_table_offset() {
46437d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
4644e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return BackEdgeTableOffsetField::decode(
464581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags2Offset));
4646a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4647a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4648a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4649e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid Code::set_back_edge_table_offset(unsigned offset) {
46507d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  ASSERT_EQ(FUNCTION, kind());
4651a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
465281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4653e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  int updated = BackEdgeTableOffsetField::update(previous, offset);
465481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4657a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4658e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool Code::back_edges_patched_for_osr() {
46596e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  ASSERT_EQ(FUNCTION, kind());
4660e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return BackEdgesPatchedForOSRField::decode(
46616e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags2Offset));
46626e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org}
46636e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
46646e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
4665e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid Code::set_back_edges_patched_for_osr(bool value) {
46666e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  ASSERT_EQ(FUNCTION, kind());
46676e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4668e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  int updated = BackEdgesPatchedForOSRField::update(previous, value);
46696e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
46706e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org}
46716e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
46726e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
46736e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
46749fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.orgbyte Code::to_boolean_state() {
4675f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return extra_ic_state();
46769fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org}
46779fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org
4678c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
4679c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool Code::has_function_cache() {
4680c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT(kind() == STUB);
468181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  return HasFunctionCacheField::decode(
468281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4683c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
4684c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
4685c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
4686c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid Code::set_has_function_cache(bool flag) {
4687c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ASSERT(kind() == STUB);
468881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
468981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  int updated = HasFunctionCacheField::update(previous, flag);
469081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4691c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
4692c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
4693c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
4694003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgbool Code::marked_for_deoptimization() {
4695003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  ASSERT(kind() == OPTIMIZED_FUNCTION);
4696003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  return MarkedForDeoptimizationField::decode(
4697003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4698003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
4699003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4700003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4701003650ee766f5e92756d470a37973fd371757485yangguo@chromium.orgvoid Code::set_marked_for_deoptimization(bool flag) {
4702003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  ASSERT(kind() == OPTIMIZED_FUNCTION);
4703a70700b91bc28abeed6373b856017f7f9cc8273bmachenbach@chromium.org  ASSERT(!flag || AllowDeoptimization::IsAllowed(GetIsolate()));
4704003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4705003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  int updated = MarkedForDeoptimizationField::update(previous, flag);
4706003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4707003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org}
4708003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
4709003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
47102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgbool Code::is_weak_stub() {
47112ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return CanBeWeakStub() && WeakStubField::decode(
47122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
47132ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
47142ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
47152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
47162ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgvoid Code::mark_as_weak_stub() {
47172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  ASSERT(CanBeWeakStub());
47182ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
47192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  int updated = WeakStubField::update(previous, true);
47202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
47212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
47222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
47232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
47242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgbool Code::is_invalidated_weak_stub() {
47252ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return is_weak_stub() && InvalidatedWeakStubField::decode(
47262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
47272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
47282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
47292ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
47302ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgvoid Code::mark_as_invalidated_weak_stub() {
47312ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  ASSERT(is_inline_cache_stub());
47322ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
47332ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  int updated = InvalidatedWeakStubField::update(previous, true);
47342ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
47352ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
47362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
47372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
473843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool Code::is_inline_cache_stub() {
473943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Kind kind = this->kind();
47401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  switch (kind) {
47411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define CASE(name) case name: return true;
47421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    IC_KIND_LIST(CASE)
47431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef CASE
47441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    default: return false;
47451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
474643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
474743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
474843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4749fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.orgbool Code::is_keyed_stub() {
4750a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org  return is_keyed_load_stub() || is_keyed_store_stub();
4751fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org}
4752fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
4753fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org
4754ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.orgbool Code::is_debug_stub() {
4755ec6855e761a7474a580d750a45d748323dd3b7c7verwaest@chromium.org  return ic_state() == DEBUG_STUB;
47569768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org}
47579768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
47589768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
47599ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.orgConstantPoolArray* Code::constant_pool() {
47609ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org  return ConstantPoolArray::cast(READ_FIELD(this, kConstantPoolOffset));
47619ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org}
47629ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org
47639ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org
47649ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.orgvoid Code::set_constant_pool(Object* value) {
47659ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org  ASSERT(value->IsConstantPoolArray());
47669ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org  WRITE_FIELD(this, kConstantPoolOffset, value);
47679ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org  WRITE_BARRIER(GetHeap(), this, kConstantPoolOffset, value);
47689ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org}
47699ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org
47709ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org
477143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCode::Flags Code::ComputeFlags(Kind kind,
47727276f14ca716596e0a0d17539516370c1f453847kasper.lund                               InlineCacheState ic_state,
47730511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com                               ExtraICState extra_ic_state,
47747a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org                               StubType type,
477569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org                               InlineCacheHolderFlag holder) {
477643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Compute the bit mask.
4777876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  unsigned int bits = KindField::encode(kind)
477883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      | ICStateField::encode(ic_state)
477983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      | TypeField::encode(type)
4780f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      | ExtraICStateField::encode(extra_ic_state)
478183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      | CacheHolderField::encode(holder);
478283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  return static_cast<Flags>(bits);
478343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
478443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
478543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
478643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCode::Flags Code::ComputeMonomorphicFlags(Kind kind,
47870511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com                                          ExtraICState extra_ic_state,
4788b5be0a91a2e75da55653dd3583b7f3c1c54f7309machenbach@chromium.org                                          InlineCacheHolderFlag holder,
4789f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                          StubType type) {
4790f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, holder);
4791f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
4792f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
4793f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
4794f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgCode::Flags Code::ComputeHandlerFlags(Kind handler_kind,
4795f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      StubType type,
4796f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org                                      InlineCacheHolderFlag holder) {
4797f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return ComputeFlags(Code::HANDLER, MONOMORPHIC, handler_kind, type, holder);
479843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
479943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
480043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
480143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCode::Kind Code::ExtractKindFromFlags(Flags flags) {
480283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  return KindField::decode(flags);
480343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
480443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
480543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48067276f14ca716596e0a0d17539516370c1f453847kasper.lundInlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
480783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  return ICStateField::decode(flags);
480843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
480943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
481043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4811cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.orgExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
481283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  return ExtraICStateField::decode(flags);
48130511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com}
48140511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
48150511e24c6ebf94594a7e03bdcd58157ac2971d69erik.corry@gmail.com
48167a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.orgCode::StubType Code::ExtractTypeFromFlags(Flags flags) {
481783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  return TypeField::decode(flags);
481843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
481943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
482043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
482169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgInlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
482283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  return CacheHolderField::decode(flags);
482369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org}
482469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
482569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org
482643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCode::Flags Code::RemoveTypeFromFlags(Flags flags) {
482783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  int bits = flags & ~TypeField::kMask;
482843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return static_cast<Flags>(bits);
482943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
483043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
483143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48328bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgCode* Code::GetCodeFromTargetAddress(Address address) {
48338bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
48348bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // GetCodeFromTargetAddress might be called when marking objects during mark
48358bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // sweep. reinterpret_cast is therefore used instead of the more appropriate
48368bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // Code::cast. Code::cast does not work when the object's map is
48378bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  // marked.
48388bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  Code* result = reinterpret_cast<Code*>(code);
48398bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  return result;
48408bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org}
48418bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
48428bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org
4843145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.comObject* Code::GetObjectFromEntryAddress(Address location_of_address) {
4844145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  return HeapObject::
4845145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com      FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize);
4846145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com}
4847145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com
4848145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com
4849f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgbool Code::IsWeakObjectInOptimizedCode(Object* object) {
48503484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org  if (!FLAG_collect_maps) return false;
4851f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (object->IsMap()) {
4852f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return Map::cast(object)->CanTransition() &&
4853f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org           FLAG_weak_embedded_maps_in_optimized_code;
4854f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
4855f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (object->IsJSObject() ||
4856f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      (object->IsCell() && Cell::cast(object)->value()->IsJSObject())) {
4857f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return FLAG_weak_embedded_objects_in_optimized_code;
4858f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
4859f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  return false;
4860f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
4861f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
4862f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
48639801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.orgclass Code::FindAndReplacePattern {
48649801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org public:
48659801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  FindAndReplacePattern() : count_(0) { }
48669801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  void Add(Handle<Map> map_to_find, Handle<Object> obj_to_replace) {
48679801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org    ASSERT(count_ < kMaxCount);
48689801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org    find_[count_] = map_to_find;
48699801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org    replace_[count_] = obj_to_replace;
48709801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org    ++count_;
48719801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  }
48729801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org private:
48739801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  static const int kMaxCount = 4;
48749801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  int count_;
48759801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  Handle<Map> find_[kMaxCount];
48769801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  Handle<Object> replace_[kMaxCount];
48779801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org  friend class Code;
48789801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org};
48799801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org
48809801e3c558f3df82f01ac626b6171032afa33819machenbach@chromium.org
48812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgbool Code::IsWeakObjectInIC(Object* object) {
48822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return object->IsMap() && Map::cast(object)->CanTransition() &&
48832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org         FLAG_collect_maps &&
48842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org         FLAG_weak_embedded_maps_in_ic;
48852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org}
48862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
48872ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org
488843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* Map::prototype() {
488943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return READ_FIELD(this, kPrototypeOffset);
489043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
489143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
489243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48935a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgvoid Map::set_prototype(Object* value, WriteBarrierMode mode) {
4894d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  ASSERT(value->IsNull() || value->IsJSReceiver());
489543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(this, kPrototypeOffset, value);
4896c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode);
489740b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org}
489840b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org
489940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org
4900de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org// If the descriptor is using the empty transition array, install a new empty
4901de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org// transition array that will have place for an element transition.
49022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgstatic void EnsureHasTransitionArray(Handle<Map> map) {
49032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<TransitionArray> transitions;
4904c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  if (!map->HasTransitionArray()) {
49052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    transitions = TransitionArray::Allocate(map->GetIsolate(), 0);
490633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    transitions->set_back_pointer_storage(map->GetBackPointer());
490789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  } else if (!map->transitions()->IsFullTransitionArray()) {
49082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    transitions = TransitionArray::ExtendToFullTransitionArray(map);
4909c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org  } else {
49102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    return;
491133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
49122ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  map->set_transitions(*transitions);
4913de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org}
4914657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org
4915657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org
491689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgvoid Map::InitializeDescriptors(DescriptorArray* descriptors) {
4917652f4fa54ed3db06c7223a3faa698e7b0a1d049fverwaest@chromium.org  int len = descriptors->number_of_descriptors();
491889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  set_instance_descriptors(descriptors);
491906ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  SetNumberOfOwnDescriptors(len);
4920304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
4921304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
4922304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
492389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgACCESSORS(Map, instance_descriptors, DescriptorArray, kDescriptorsOffset)
4924594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4925594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4926594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgvoid Map::set_bit_field3(uint32_t bits) {
49273c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  if (kInt32Size != kPointerSize) {
49283c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org    WRITE_UINT32_FIELD(this, kBitField3Offset + kInt32Size, 0);
49293c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  }
49303c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  WRITE_UINT32_FIELD(this, kBitField3Offset, bits);
4931594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
4932594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4933594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
4934594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orguint32_t Map::bit_field3() {
49353c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  return READ_UINT32_FIELD(this, kBitField3Offset);
4936594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
493740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org
493840cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org
49392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgvoid Map::AppendDescriptor(Descriptor* desc) {
4940304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  DescriptorArray* descriptors = instance_descriptors();
494146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int number_of_own_descriptors = NumberOfOwnDescriptors();
494233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  ASSERT(descriptors->number_of_descriptors() == number_of_own_descriptors);
49432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  descriptors->Append(desc);
494446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  SetNumberOfOwnDescriptors(number_of_own_descriptors + 1);
4945304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
4946304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
494740cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org
4948212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgObject* Map::GetBackPointer() {
4949de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset);
4950657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  if (object->IsDescriptorArray()) {
4951de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org    return TransitionArray::cast(object)->back_pointer_storage();
4952657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  } else {
4953657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    ASSERT(object->IsMap() || object->IsUndefined());
4954657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    return object;
4955657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  }
4956212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org}
4957212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org
4958212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org
495999aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgbool Map::HasElementsTransition() {
496099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  return HasTransitionArray() && transitions()->HasElementsTransition();
496199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org}
496299aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
496399aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
496499aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgbool Map::HasTransitionArray() {
4965de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset);
4966de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  return object->IsTransitionArray();
496799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org}
496899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
496999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
49707028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgMap* Map::elements_transition_map() {
4971d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  int index = transitions()->Search(GetHeap()->elements_transition_symbol());
4972d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return transitions()->GetTarget(index);
49737028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
49747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
49757028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
4976b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.orgbool Map::CanHaveMoreTransitions() {
4977b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org  if (!HasTransitionArray()) return true;
4978b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org  return FixedArray::SizeFor(transitions()->length() +
4979b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org                             TransitionArray::kTransitionSize)
4980ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org      <= Page::kMaxRegularHeapObjectSize;
4981b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org}
4982b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org
4983b6d052d4d08b0de341804f273713741dee560c5everwaest@chromium.org
498406ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.orgMap* Map::GetTransition(int transition_index) {
498506ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org  return transitions()->GetTarget(transition_index);
498606ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org}
498706ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org
498806ab2ec756e44eeaf7500b9794f9d2abc79dc8cfverwaest@chromium.org
49898f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.orgint Map::SearchTransition(Name* name) {
49908f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  if (HasTransitionArray()) return transitions()->Search(name);
49918f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org  return TransitionArray::kNotFound;
49928f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org}
49938f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org
49948f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org
499581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgFixedArray* Map::GetPrototypeTransitions() {
499681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  if (!HasTransitionArray()) return GetHeap()->empty_fixed_array();
499781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  if (!transitions()->HasPrototypeTransitions()) {
499881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    return GetHeap()->empty_fixed_array();
499981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  }
500081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  return transitions()->GetPrototypeTransitions();
500181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org}
500281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
500381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
50042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgvoid Map::SetPrototypeTransitions(
50052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<Map> map, Handle<FixedArray> proto_transitions) {
50062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  EnsureHasTransitionArray(map);
50072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  int old_number_of_transitions = map->NumberOfProtoTransitions();
500881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org#ifdef DEBUG
50092ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if (map->HasPrototypeTransitions()) {
50102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    ASSERT(map->GetPrototypeTransitions() != *proto_transitions);
50112ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    map->ZapPrototypeTransitions();
501281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  }
501381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org#endif
50142ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  map->transitions()->SetPrototypeTransitions(*proto_transitions);
50152ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  map->SetNumberOfProtoTransitions(old_number_of_transitions);
501681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org}
501781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
501881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
501981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgbool Map::HasPrototypeTransitions() {
502081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  return HasTransitionArray() && transitions()->HasPrototypeTransitions();
502181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org}
502281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
502381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
502499aa490225c81012235659d9a183226b286178c8yangguo@chromium.orgTransitionArray* Map::transitions() {
5025de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  ASSERT(HasTransitionArray());
5026de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset);
5027de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  return TransitionArray::cast(object);
502899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org}
502999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
503099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org
5031de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.orgvoid Map::set_transitions(TransitionArray* transition_array,
5032de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org                          WriteBarrierMode mode) {
503391efda9680c1eac04b6babfbf812d79b7df3747ajkummerow@chromium.org  // Transition arrays are not shared. When one is replaced, it should not
503491efda9680c1eac04b6babfbf812d79b7df3747ajkummerow@chromium.org  // keep referenced objects alive, so we zap it.
503591efda9680c1eac04b6babfbf812d79b7df3747ajkummerow@chromium.org  // When there is another reference to the array somewhere (e.g. a handle),
503691efda9680c1eac04b6babfbf812d79b7df3747ajkummerow@chromium.org  // not zapping turns from a waste of memory into a source of crashes.
503791efda9680c1eac04b6babfbf812d79b7df3747ajkummerow@chromium.org  if (HasTransitionArray()) {
5038bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org#ifdef DEBUG
5039bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org    for (int i = 0; i < transitions()->number_of_transitions(); i++) {
5040bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org      Map* target = transitions()->GetTarget(i);
5041bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org      if (target->instance_descriptors() == instance_descriptors()) {
5042bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org        Name* key = transitions()->GetKey(i);
5043bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org        int new_target_index = transition_array->Search(key);
5044bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org        ASSERT(new_target_index != TransitionArray::kNotFound);
5045bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org        ASSERT(transition_array->GetTarget(new_target_index) == target);
5046bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org      }
5047bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org    }
5048bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org#endif
504991efda9680c1eac04b6babfbf812d79b7df3747ajkummerow@chromium.org    ASSERT(transitions() != transition_array);
505099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org    ZapTransitions();
505199aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  }
5052de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org
5053de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  WRITE_FIELD(this, kTransitionsOrBackPointerOffset, transition_array);
5054de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  CONDITIONAL_WRITE_BARRIER(
5055de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org      GetHeap(), this, kTransitionsOrBackPointerOffset, transition_array, mode);
50567028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
50577028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
50587028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
505981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgvoid Map::init_back_pointer(Object* undefined) {
506081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  ASSERT(undefined->IsUndefined());
5061de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  WRITE_FIELD(this, kTransitionsOrBackPointerOffset, undefined);
506281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org}
506381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
506481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
5065212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgvoid Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
5066212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  ASSERT(instance_type() >= FIRST_JS_RECEIVER_TYPE);
5067212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  ASSERT((value->IsUndefined() && GetBackPointer()->IsMap()) ||
5068212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org         (value->IsMap() && GetBackPointer()->IsUndefined()));
5069de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset);
5070de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org  if (object->IsTransitionArray()) {
5071de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org    TransitionArray::cast(object)->set_back_pointer_storage(value);
5072753aee4dcf0868130789b5af7c1eeb6ab2ab24f9verwaest@chromium.org  } else {
5073de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org    WRITE_FIELD(this, kTransitionsOrBackPointerOffset, value);
5074657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    CONDITIONAL_WRITE_BARRIER(
5075de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org        GetHeap(), this, kTransitionsOrBackPointerOffset, value, mode);
5076657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  }
5077212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org}
5078212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org
5079212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org
5080ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
50812e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgACCESSORS(Map, dependent_code, DependentCode, kDependentCodeOffset)
508243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(Map, constructor, Object, kConstructorOffset)
508343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
508443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
5085394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comACCESSORS(JSFunction, literals_or_bindings, FixedArray, kLiteralsOffset)
50867028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset)
508743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
508843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset)
508946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgACCESSORS(GlobalObject, native_context, Context, kNativeContextOffset)
5090355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset)
50915a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgACCESSORS(GlobalObject, global_receiver, JSObject, kGlobalReceiverOffset)
509243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
509346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgACCESSORS(JSGlobalProxy, native_context, Object, kNativeContextOffset)
509429699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.orgACCESSORS(JSGlobalProxy, hash, Object, kHashOffset)
509543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
509643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(AccessorInfo, name, Object, kNameOffset)
50972c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(AccessorInfo, flag, kFlagOffset)
50987028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgACCESSORS(AccessorInfo, expected_receiver_type, Object,
50997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          kExpectedReceiverTypeOffset)
510043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5101750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgACCESSORS(DeclaredAccessorDescriptor, serialized_data, ByteArray,
5102750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org          kSerializedDataOffset)
51037c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
51047c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgACCESSORS(DeclaredAccessorInfo, descriptor, DeclaredAccessorDescriptor,
51057c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org          kDescriptorOffset)
51067c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
51077c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgACCESSORS(ExecutableAccessorInfo, getter, Object, kGetterOffset)
51087c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgACCESSORS(ExecutableAccessorInfo, setter, Object, kSetterOffset)
51097c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgACCESSORS(ExecutableAccessorInfo, data, Object, kDataOffset)
51107c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
51111fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgACCESSORS(Box, value, Object, kValueOffset)
51121fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
5113f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comACCESSORS(AccessorPair, getter, Object, kGetterOffset)
5114f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comACCESSORS(AccessorPair, setter, Object, kSetterOffset)
51151e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgACCESSORS_TO_SMI(AccessorPair, access_flags, kAccessFlagsOffset)
5116f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
511743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(AccessCheckInfo, named_callback, Object, kNamedCallbackOffset)
511843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(AccessCheckInfo, indexed_callback, Object, kIndexedCallbackOffset)
511943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
512043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
512143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
512243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
512343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
512443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
512543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
512643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(InterceptorInfo, data, Object, kDataOffset)
512743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
512843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
512943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
513043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
513143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(TemplateInfo, tag, Object, kTagOffset)
513243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
51333d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgACCESSORS(TemplateInfo, property_accessors, Object, kPropertyAccessorsOffset)
513443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
513543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, serial_number, Object, kSerialNumberOffset)
513643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
513743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, prototype_template, Object,
513843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          kPrototypeTemplateOffset)
513943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset)
514043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, named_property_handler, Object,
514143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          kNamedPropertyHandlerOffset)
514243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object,
514343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          kIndexedPropertyHandlerOffset)
514443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, instance_template, Object,
514543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          kInstanceTemplateOffset)
514643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
514743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
514843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, instance_call_handler, Object,
514943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          kInstanceCallHandlerOffset)
515043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(FunctionTemplateInfo, access_check_info, Object,
515143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          kAccessCheckInfoOffset)
51522c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(FunctionTemplateInfo, flag, kFlagOffset)
515343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
515443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
5155212ac23f8231d169b4aa6737d762099993020826kasper.lundACCESSORS(ObjectTemplateInfo, internal_field_count, Object,
5156212ac23f8231d169b4aa6737d762099993020826kasper.lund          kInternalFieldCountOffset)
515743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
515843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset)
515943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(SignatureInfo, args, Object, kArgsOffset)
516043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
516143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(TypeSwitchInfo, types, Object, kTypesOffset)
516243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5163bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.orgACCESSORS(AllocationSite, transition_info, Object, kTransitionInfoOffset)
51643d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.orgACCESSORS(AllocationSite, nested_site, Object, kNestedSiteOffset)
51654ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.orgACCESSORS_TO_SMI(AllocationSite, pretenure_data, kPretenureDataOffset)
51664ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.orgACCESSORS_TO_SMI(AllocationSite, pretenure_create_count,
51674ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org                 kPretenureCreateCountOffset)
5168528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgACCESSORS(AllocationSite, dependent_code, DependentCode,
5169528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org          kDependentCodeOffset)
5170ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgACCESSORS(AllocationSite, weak_next, Object, kWeakNextOffset)
5171ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgACCESSORS(AllocationMemento, allocation_site, Object, kAllocationSiteOffset)
517259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org
517343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(Script, source, Object, kSourceOffset)
517443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(Script, name, Object, kNameOffset)
51751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgACCESSORS(Script, id, Smi, kIdOffset)
51762c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(Script, line_offset, kLineOffsetOffset)
51772c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(Script, column_offset, kColumnOffsetOffset)
51789085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgACCESSORS(Script, context_data, Object, kContextOffset)
5179ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgACCESSORS(Script, wrapper, Foreign, kWrapperOffset)
51802c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(Script, type, kTypeOffset)
5181499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.orgACCESSORS(Script, line_ends, Object, kLineEndsOffset)
51829818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.orgACCESSORS(Script, eval_from_shared, Object, kEvalFromSharedOffset)
51832c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(Script, eval_from_instructions_offset,
51842c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org                 kEvalFrominstructionsOffsetOffset)
5185d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgACCESSORS_TO_SMI(Script, flags, kFlagsOffset)
5186d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgBOOL_ACCESSORS(Script, flags, is_shared_cross_origin, kIsSharedCrossOriginBit)
5187d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
5188d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgScript::CompilationType Script::compilation_type() {
5189d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return BooleanBit::get(flags(), kCompilationTypeBit) ?
5190d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      COMPILATION_TYPE_EVAL : COMPILATION_TYPE_HOST;
5191d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
5192d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvoid Script::set_compilation_type(CompilationType type) {
5193d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  set_flags(BooleanBit::set(flags(), kCompilationTypeBit,
5194d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      type == COMPILATION_TYPE_EVAL));
5195d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
5196d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgScript::CompilationState Script::compilation_state() {
5197d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return BooleanBit::get(flags(), kCompilationStateBit) ?
5198d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      COMPILATION_STATE_COMPILED : COMPILATION_STATE_INITIAL;
5199d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
5200d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvoid Script::set_compilation_state(CompilationState state) {
5201d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  set_flags(BooleanBit::set(flags(), kCompilationStateBit,
5202d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      state == COMPILATION_STATE_COMPILED));
5203d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
5204d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
520543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
520643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex)
520743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex)
520843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(DebugInfo, code, Code, kPatchedCodeIndex)
520943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex)
521043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52112c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(BreakPointInfo, code_position, kCodePositionIndex)
52122c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(BreakPointInfo, source_position, kSourcePositionIndex)
52132c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.orgACCESSORS_TO_SMI(BreakPointInfo, statement_position, kStatementPositionIndex)
521443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex)
521543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
521643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(SharedFunctionInfo, name, Object, kNameOffset)
52175a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgACCESSORS(SharedFunctionInfo, optimized_code_map, Object,
52185a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org                 kOptimizedCodeMapOffset)
5219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset)
5220a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgACCESSORS(SharedFunctionInfo, feedback_vector, FixedArray,
5221a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org          kFeedbackVectorOffset)
522243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(SharedFunctionInfo, instance_class_name, Object,
522343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          kInstanceClassNameOffset)
5224f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.orgACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset)
522543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset)
522643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
5227d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.orgACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset)
522843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
522978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
5230a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgSMI_ACCESSORS(FunctionTemplateInfo, length, kLengthOffset)
523143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
523243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen               kHiddenPrototypeBit)
523343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
523443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
523543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen               kNeedsAccessCheckBit)
52362c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.orgBOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
52372c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org               kReadOnlyPrototypeBit)
5238662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgBOOL_ACCESSORS(FunctionTemplateInfo, flag, remove_prototype,
5239662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org               kRemovePrototypeBit)
5240639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgBOOL_ACCESSORS(FunctionTemplateInfo, flag, do_not_cache,
5241639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org               kDoNotCacheBit)
524243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression,
524343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen               kIsExpressionBit)
524443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
524543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen               kIsTopLevelBit)
52466e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
5247c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo,
5248c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org               compiler_hints,
52492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org               allows_lazy_compilation,
52502356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org               kAllowLazyCompilation)
52517b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo,
52527b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org               compiler_hints,
52535a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               allows_lazy_compilation_without_context,
52545a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               kAllowLazyCompilationWithoutContext)
52555a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo,
52565a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org               compiler_hints,
52577b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org               uses_arguments,
52587b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org               kUsesArguments)
52597b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo,
52607b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org               compiler_hints,
52617b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org               has_duplicate_parameters,
52627b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org               kHasDuplicateParameters)
526343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52640b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org
526530ce411529579186181838984710b0b0980857aaricow@chromium.org#if V8_HOST_ARCH_32_BIT
526630ce411529579186181838984710b0b0980857aaricow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
526730ce411529579186181838984710b0b0980857aaricow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
526843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              kFormalParameterCountOffset)
526930ce411529579186181838984710b0b0980857aaricow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
527043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              kExpectedNofPropertiesOffset)
527130ce411529579186181838984710b0b0980857aaricow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
527230ce411529579186181838984710b0b0980857aaricow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
527343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              kStartPositionAndTypeOffset)
527430ce411529579186181838984710b0b0980857aaricow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
527530ce411529579186181838984710b0b0980857aaricow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, function_token_position,
527643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              kFunctionTokenPositionOffset)
527730ce411529579186181838984710b0b0980857aaricow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
5278911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org              kCompilerHintsOffset)
52792c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, opt_count_and_bailout_reason,
52802c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org              kOptCountAndBailoutReasonOffset)
52817028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset)
52825aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
52835aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.orgSMI_ACCESSORS(SharedFunctionInfo, profiler_ticks, kProfilerTicksOffset)
5284ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
528530ce411529579186181838984710b0b0980857aaricow@chromium.org#else
528630ce411529579186181838984710b0b0980857aaricow@chromium.org
528730ce411529579186181838984710b0b0980857aaricow@chromium.org#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset)             \
5288f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  STATIC_ASSERT(holder::offset % kPointerSize == 0);              \
528930ce411529579186181838984710b0b0980857aaricow@chromium.org  int holder::name() {                                            \
529030ce411529579186181838984710b0b0980857aaricow@chromium.org    int value = READ_INT_FIELD(this, offset);                     \
529130ce411529579186181838984710b0b0980857aaricow@chromium.org    ASSERT(kHeapObjectTag == 1);                                  \
529230ce411529579186181838984710b0b0980857aaricow@chromium.org    ASSERT((value & kHeapObjectTag) == 0);                        \
529330ce411529579186181838984710b0b0980857aaricow@chromium.org    return value >> 1;                                            \
529430ce411529579186181838984710b0b0980857aaricow@chromium.org  }                                                               \
529530ce411529579186181838984710b0b0980857aaricow@chromium.org  void holder::set_##name(int value) {                            \
529630ce411529579186181838984710b0b0980857aaricow@chromium.org    ASSERT(kHeapObjectTag == 1);                                  \
529730ce411529579186181838984710b0b0980857aaricow@chromium.org    ASSERT((value & 0xC0000000) == 0xC0000000 ||                  \
5298a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org           (value & 0xC0000000) == 0x0);                          \
529930ce411529579186181838984710b0b0980857aaricow@chromium.org    WRITE_INT_FIELD(this,                                         \
530030ce411529579186181838984710b0b0980857aaricow@chromium.org                    offset,                                       \
530130ce411529579186181838984710b0b0980857aaricow@chromium.org                    (value << 1) & ~kHeapObjectTag);              \
530230ce411529579186181838984710b0b0980857aaricow@chromium.org  }
530330ce411529579186181838984710b0b0980857aaricow@chromium.org
5304f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset)             \
5305f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org  STATIC_ASSERT(holder::offset % kPointerSize == kIntSize);       \
530630ce411529579186181838984710b0b0980857aaricow@chromium.org  INT_ACCESSORS(holder, name, offset)
530730ce411529579186181838984710b0b0980857aaricow@chromium.org
530830ce411529579186181838984710b0b0980857aaricow@chromium.org
530930ce411529579186181838984710b0b0980857aaricow@chromium.orgPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
5310f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
5311f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        formal_parameter_count,
5312f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        kFormalParameterCountOffset)
531330ce411529579186181838984710b0b0980857aaricow@chromium.org
5314f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
5315f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        expected_nof_properties,
5316f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        kExpectedNofPropertiesOffset)
531730ce411529579186181838984710b0b0980857aaricow@chromium.orgPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
531843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5319f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, end_position, kEndPositionOffset)
5320f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
5321f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        start_position_and_type,
5322f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        kStartPositionAndTypeOffset)
5323f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
5324f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
5325f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        function_token_position,
5326f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        kFunctionTokenPositionOffset)
5327f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
5328f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        compiler_hints,
5329f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org                        kCompilerHintsOffset)
5330f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org
53312c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
53322c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org                        opt_count_and_bailout_reason,
53332c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org                        kOptCountAndBailoutReasonOffset)
5334d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, counters, kCountersOffset)
5335ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
53365aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.orgPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
53375aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org                        ast_node_count,
53385aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org                        kAstNodeCountOffset)
53395aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.orgPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
53405aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org                        profiler_ticks,
53415aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org                        kProfilerTicksOffset)
53425aed4fc58b91cbb1ed563e2e07b74490ba953037ulan@chromium.org
534330ce411529579186181838984710b0b0980857aaricow@chromium.org#endif
534443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
53467b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.orgBOOL_GETTER(SharedFunctionInfo,
53477b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org            compiler_hints,
53487b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org            optimization_disabled,
53497b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org            kOptimizationDisabled)
5350a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5351a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5352a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid SharedFunctionInfo::set_optimization_disabled(bool disable) {
5353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  set_compiler_hints(BooleanBit::set(compiler_hints(),
5354a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                     kOptimizationDisabled,
5355a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                     disable));
5356a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // If disabling optimizations we reflect that in the code object so
5357a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // it will not be counted as optimizable code.
5358a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if ((code()->kind() == Code::FUNCTION) && disable) {
5359a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    code()->set_optimizable(false);
5360a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
5361a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
5362a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5363a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5364486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgStrictMode SharedFunctionInfo::strict_mode() {
5365486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return BooleanBit::get(compiler_hints(), kStrictModeFunction)
5366486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      ? STRICT : SLOPPY;
5367394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
5368394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5369394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5370486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgvoid SharedFunctionInfo::set_strict_mode(StrictMode strict_mode) {
5371486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  // We only allow mode transitions from sloppy to strict.
5372486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  ASSERT(this->strict_mode() == SLOPPY || this->strict_mode() == strict_mode);
53731b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  int hints = compiler_hints();
5374486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  hints = BooleanBit::set(hints, kStrictModeFunction, strict_mode == STRICT);
53751b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org  set_compiler_hints(hints);
5376394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
5377394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5378394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
53797c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative)
53800cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, inline_builtin,
53810cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org               kInlineBuiltin)
53827c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints,
53837c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org               name_should_print_as_anonymous,
53847c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org               kNameShouldPrintAsAnonymous)
53857c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, bound, kBoundFunction)
53867c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_anonymous, kIsAnonymous)
538756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_function, kIsFunction)
538856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_optimize,
538956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org               kDontOptimize)
5390b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_inline, kDontInline)
539181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_cache, kDontCache)
5392906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_flush, kDontFlush)
5393f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_generator, kIsGenerator)
53946fe7a8e00388b38f66fc0127f3fe797d54b25492ricow@chromium.org
5395ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
5396ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
5397ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org
5398e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgACCESSORS(PolymorphicCodeCache, cache, Object, kCacheOffset)
5399e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org
5400152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.orgbool Script::HasValidSource() {
5401152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org  Object* src = this->source();
5402152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org  if (!src->IsString()) return true;
5403152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org  String* src_str = String::cast(src);
5404152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org  if (!StringShape(src_str).IsExternal()) return true;
54058e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  if (src_str->IsOneByteRepresentation()) {
5406152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org    return ExternalAsciiString::cast(src)->resource() != NULL;
5407152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org  } else if (src_str->IsTwoByteRepresentation()) {
5408152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org    return ExternalTwoByteString::cast(src)->resource() != NULL;
5409152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org  }
5410152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org  return true;
5411152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org}
5412152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org
5413152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org
5414b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgvoid SharedFunctionInfo::DontAdaptArguments() {
5415b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  ASSERT(code()->kind() == Code::BUILTIN);
5416b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  set_formal_parameter_count(kDontAdaptArgumentsSentinel);
5417b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org}
5418b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
5419b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org
542043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint SharedFunctionInfo::start_position() {
542143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return start_position_and_type() >> kStartPositionShift;
542243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
542343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
542443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
542543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid SharedFunctionInfo::set_start_position(int start_position) {
542643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_start_position_and_type((start_position << kStartPositionShift)
542743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    | (start_position_and_type() & ~kStartPositionMask));
542843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
542943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCode* SharedFunctionInfo::code() {
543243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Code::cast(READ_FIELD(this, kCodeOffset));
543343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
543443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
543543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgvoid SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
54370cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  ASSERT(value->kind() != Code::OPTIMIZED_FUNCTION);
543843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(this, kCodeOffset, value);
5439c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
544043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
544143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
544243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54439768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.orgvoid SharedFunctionInfo::ReplaceCode(Code* value) {
54449768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // If the GC metadata field is already used then the function was
54459768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  // enqueued as a code flushing candidate and we remove it now.
54469768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  if (code()->gc_metadata() != NULL) {
54479768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    CodeFlusher* flusher = GetHeap()->mark_compact_collector()->code_flusher();
54489768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org    flusher->EvictCandidate(this);
54499768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  }
54509768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
54519768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  ASSERT(code()->gc_metadata() == NULL && value->gc_metadata() == NULL);
5452a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
54539768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org  set_code(value);
54549768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org}
54559768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
54569768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org
5457c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgScopeInfo* SharedFunctionInfo::scope_info() {
5458c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset));
5459b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org}
5460b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org
5461b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org
5462c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid SharedFunctionInfo::set_scope_info(ScopeInfo* value,
5463b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org                                        WriteBarrierMode mode) {
5464b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org  WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value));
5465c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  CONDITIONAL_WRITE_BARRIER(GetHeap(),
5466c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                            this,
5467c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                            kScopeInfoOffset,
5468c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                            reinterpret_cast<Object*>(value),
5469c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                            mode);
5470b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org}
5471b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org
5472b5737496145078e47f3d28f19ed8d918e2254738ager@chromium.org
547343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool SharedFunctionInfo::is_compiled() {
5474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return code() !=
54754954674151afa960af66efb4831df06bde727333yangguo@chromium.org      GetIsolate()->builtins()->builtin(Builtins::kCompileUnoptimized);
547643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
547743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
547843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5479f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.orgbool SharedFunctionInfo::IsApiFunction() {
5480f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  return function_data()->IsFunctionTemplateInfo();
5481f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org}
5482f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
5483f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
5484f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.orgFunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
5485f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  ASSERT(IsApiFunction());
5486f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org  return FunctionTemplateInfo::cast(function_data());
5487f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org}
5488f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
5489f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
54905f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgbool SharedFunctionInfo::HasBuiltinFunctionId() {
5491720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org  return function_data()->IsSmi();
5492720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org}
5493720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
5494720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org
54955f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgBuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
54965f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  ASSERT(HasBuiltinFunctionId());
54975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value());
5498f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org}
5499f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
5500f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
55017028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgint SharedFunctionInfo::ic_age() {
55027028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return ICAgeBits::decode(counters());
55037028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
55047028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55057028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55067028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid SharedFunctionInfo::set_ic_age(int ic_age) {
55077028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  set_counters(ICAgeBits::update(counters(), ic_age));
55087028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
55097028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55107028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55117028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgint SharedFunctionInfo::deopt_count() {
55127028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return DeoptCountBits::decode(counters());
55137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
55147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55157028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55167028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid SharedFunctionInfo::set_deopt_count(int deopt_count) {
55177028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  set_counters(DeoptCountBits::update(counters(), deopt_count));
55187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
55197028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid SharedFunctionInfo::increment_deopt_count() {
55227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  int value = counters();
55237028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  int deopt_count = DeoptCountBits::decode(value);
55247028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  deopt_count = (deopt_count + 1) & DeoptCountBits::kMax;
55257028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  set_counters(DeoptCountBits::update(value, deopt_count));
55267028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
55277028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55287028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55297028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgint SharedFunctionInfo::opt_reenable_tries() {
55307028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  return OptReenableTriesBits::decode(counters());
55317028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
55327028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55337028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid SharedFunctionInfo::set_opt_reenable_tries(int tries) {
55357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  set_counters(OptReenableTriesBits::update(counters(), tries));
55367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
55377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55392c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgint SharedFunctionInfo::opt_count() {
55402c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  return OptCountBits::decode(opt_count_and_bailout_reason());
55412c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org}
55422c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
55432c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
55442c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgvoid SharedFunctionInfo::set_opt_count(int opt_count) {
55452c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  set_opt_count_and_bailout_reason(
55462c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org      OptCountBits::update(opt_count_and_bailout_reason(), opt_count));
55472c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org}
55482c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
55492c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
55502c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgBailoutReason SharedFunctionInfo::DisableOptimizationReason() {
55512c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  BailoutReason reason = static_cast<BailoutReason>(
55522c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org      DisabledOptimizationReasonBits::decode(opt_count_and_bailout_reason()));
55532c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  return reason;
55542c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org}
55552c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
55562c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
5557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool SharedFunctionInfo::has_deoptimization_support() {
5558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Code* code = this->code();
5559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return code->kind() == Code::FUNCTION && code->has_deoptimization_support();
5560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
5561a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5562a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
55637028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid SharedFunctionInfo::TryReenableOptimization() {
55647028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  int tries = opt_reenable_tries();
55657028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  set_opt_reenable_tries((tries + 1) & OptReenableTriesBits::kMax);
55667028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  // We reenable optimization whenever the number of tries is a large
55677028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  // enough power of 2.
55687028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  if (tries >= 16 && (((tries - 1) & tries) == 0)) {
55697028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    set_optimization_disabled(false);
55707028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    set_opt_count(0);
55717028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    set_deopt_count(0);
55727028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    code()->set_optimizable(true);
55737028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
55747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
55757028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55767028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
55770b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgbool JSFunction::IsBuiltin() {
557846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  return context()->global_object()->IsJSBuiltinsObject();
55790b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
55800b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
55810b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
5582d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgbool JSFunction::IsNative() {
5583d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Object* script = shared()->script();
5584d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  bool native = script->IsScript() &&
5585d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                Script::cast(script)->type()->value() == Script::TYPE_NATIVE;
5586d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  ASSERT(!IsBuiltin() || native);  // All builtins are also native.
5587d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  return native;
5588d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
5589d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
5590d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
5591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool JSFunction::NeedsArgumentsAdaption() {
5592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return shared()->formal_parameter_count() !=
5593a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      SharedFunctionInfo::kDontAdaptArgumentsSentinel;
5594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
5595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool JSFunction::IsOptimized() {
5598a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return code()->kind() == Code::OPTIMIZED_FUNCTION;
5599a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
5600a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5601a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5602a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgbool JSFunction::IsOptimizable() {
5603a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org  return code()->kind() == Code::FUNCTION && code()->optimizable();
5604a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org}
5605a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
5606a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
56074954674151afa960af66efb4831df06bde727333yangguo@chromium.orgbool JSFunction::IsMarkedForOptimization() {
56084954674151afa960af66efb4831df06bde727333yangguo@chromium.org  return code() == GetIsolate()->builtins()->builtin(
56094954674151afa960af66efb4831df06bde727333yangguo@chromium.org      Builtins::kCompileOptimized);
5610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
5611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
56134954674151afa960af66efb4831df06bde727333yangguo@chromium.orgbool JSFunction::IsMarkedForConcurrentOptimization() {
56146e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  return code() == GetIsolate()->builtins()->builtin(
56154954674151afa960af66efb4831df06bde727333yangguo@chromium.org      Builtins::kCompileOptimizedConcurrent);
5616304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
5617304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
5618304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
56194954674151afa960af66efb4831df06bde727333yangguo@chromium.orgbool JSFunction::IsInOptimizationQueue() {
5620304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  return code() == GetIsolate()->builtins()->builtin(
56214954674151afa960af66efb4831df06bde727333yangguo@chromium.org      Builtins::kInOptimizationQueue);
5622304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
5623304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
5624304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
5625011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.orgbool JSFunction::IsInobjectSlackTrackingInProgress() {
5626011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org  return has_initial_map() &&
5627011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org      initial_map()->construction_count() != JSFunction::kNoSlackTracking;
5628011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org}
5629011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
5630011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org
563143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenCode* JSFunction::code() {
56321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return Code::cast(
5633145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com      Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset)));
56340b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org}
56350b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org
56360b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org
563743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid JSFunction::set_code(Code* value) {
5638c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(!GetHeap()->InNewSpace(value));
5639145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  Address entry = value->entry();
5640145eff58d4f6ac0dcc53abb556dbf3cac6c3280aerik.corry@gmail.com  WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
5641c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  GetHeap()->incremental_marking()->RecordWriteOfCodeEntry(
5642c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      this,
5643c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      HeapObject::RawField(this, kCodeEntryOffset),
5644c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      value);
564543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
564643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
564743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56486e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.orgvoid JSFunction::set_code_no_write_barrier(Code* value) {
5649c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(!GetHeap()->InNewSpace(value));
56506e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  Address entry = value->entry();
56516e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org  WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
56526e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org}
56536e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
56546e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org
5655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid JSFunction::ReplaceCode(Code* code) {
5656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool was_optimized = IsOptimized();
5657a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
5658a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5659486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (was_optimized && is_optimized) {
5660486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    shared()->EvictFromOptimizedCodeMap(this->code(),
5661486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org        "Replacing with another optimized code");
5662486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  }
5663486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
5664a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  set_code(code);
5665a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5666a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Add/remove the function from the list of optimized functions for this
5667a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // context based on the state change.
5668a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (!was_optimized && is_optimized) {
566946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context()->native_context()->AddOptimizedFunction(this);
5670a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
5671a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (was_optimized && !is_optimized) {
56723d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org    // TODO(titzer): linear in the number of optimized functions; fix!
567346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    context()->native_context()->RemoveOptimizedFunction(this);
5674a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
5675a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
5676a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5677a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
567843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenContext* JSFunction::context() {
567943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Context::cast(READ_FIELD(this, kContextOffset));
568043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
568143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
568243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
568343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid JSFunction::set_context(Object* value) {
5684ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(value->IsUndefined() || value->IsContext());
568543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  WRITE_FIELD(this, kContextOffset, value);
5686c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
568743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
568843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
568943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(JSFunction, prototype_or_initial_map, Object,
569043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          kPrototypeOrInitialMapOffset)
569143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
569243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
569343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenMap* JSFunction::initial_map() {
569443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Map::cast(prototype_or_initial_map());
569543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
569643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
569743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
569843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid JSFunction::set_initial_map(Map* value) {
569943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_prototype_or_initial_map(value);
570043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
570143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
570243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
570343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool JSFunction::has_initial_map() {
570443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return prototype_or_initial_map()->IsMap();
570543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
570643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
570743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
570843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool JSFunction::has_instance_prototype() {
570943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return has_initial_map() || !prototype_or_initial_map()->IsTheHole();
571043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
571143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
571243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
571343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool JSFunction::has_prototype() {
571443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return map()->has_non_instance_prototype() || has_instance_prototype();
571543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
571643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
571743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
571843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* JSFunction::instance_prototype() {
571943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(has_instance_prototype());
572043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (has_initial_map()) return initial_map()->prototype();
572143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // When there is no initial map and the prototype is a JSObject, the
572243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // initial map field is used for the prototype field.
572343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return prototype_or_initial_map();
572443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
572543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
572643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
572743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* JSFunction::prototype() {
572843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(has_prototype());
572943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If the function's prototype property has been set to a non-JSObject
573043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // value, that value is stored in the constructor field of the map.
573143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (map()->has_non_instance_prototype()) return map()->constructor();
573243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return instance_prototype();
573343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
573443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
57364111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgbool JSFunction::should_have_prototype() {
57374111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org  return map()->function_with_prototype();
57384111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org}
57394111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org
574043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
574143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool JSFunction::is_compiled() {
57424954674151afa960af66efb4831df06bde727333yangguo@chromium.org  return code() !=
57434954674151afa960af66efb4831df06bde727333yangguo@chromium.org      GetIsolate()->builtins()->builtin(Builtins::kCompileUnoptimized);
574443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
574543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
574643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5747394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comFixedArray* JSFunction::literals() {
5748394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  ASSERT(!shared()->bound());
5749394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  return literals_or_bindings();
5750394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
5751394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5752394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5753394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid JSFunction::set_literals(FixedArray* literals) {
5754394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  ASSERT(!shared()->bound());
5755394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  set_literals_or_bindings(literals);
5756394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
5757394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5758394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5759394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comFixedArray* JSFunction::function_bindings() {
5760394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  ASSERT(shared()->bound());
5761394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  return literals_or_bindings();
5762394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
5763394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5764394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5765394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comvoid JSFunction::set_function_bindings(FixedArray* bindings) {
5766394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  ASSERT(shared()->bound());
5767394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // Bound function literal may be initialized to the empty fixed array
5768394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  // before the bindings are set.
5769394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  ASSERT(bindings == GetHeap()->empty_fixed_array() ||
5770394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com         bindings->map() == GetHeap()->fixed_cow_array_map());
5771394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  set_literals_or_bindings(bindings);
5772394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
5773394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
5774394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
57759fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.orgint JSFunction::NumberOfLiterals() {
5776394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  ASSERT(!shared()->bound());
57779fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org  return literals()->length();
57789fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org}
57799fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org
57809fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org
578143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenObject* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
5782c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  ASSERT(id < kJSBuiltinsCount);  // id is unsigned.
5783c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org  return READ_FIELD(this, OffsetOfFunctionWithId(id));
578443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
578543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
578643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
578743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
578843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                              Object* value) {
5789c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  ASSERT(id < kJSBuiltinsCount);  // id is unsigned.
5790c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org  WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
5791c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value);
5792c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org}
5793c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
5794c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
5795c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.orgCode* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
5796c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  ASSERT(id < kJSBuiltinsCount);  // id is unsigned.
5797c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org  return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
5798c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org}
5799c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
5800c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
5801c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.orgvoid JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
5802c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org                                                   Code* value) {
5803c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org  ASSERT(id < kJSBuiltinsCount);  // id is unsigned.
5804c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org  WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
5805c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  ASSERT(!GetHeap()->InNewSpace(value));
580643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
580743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
580843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgACCESSORS(JSProxy, handler, Object, kHandlerOffset)
5810c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comACCESSORS(JSProxy, hash, Object, kHashOffset)
581134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgACCESSORS(JSFunctionProxy, call_trap, Object, kCallTrapOffset)
581234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset)
581334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
581434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
581534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.orgvoid JSProxy::InitializeBody(int object_size, Object* value) {
581634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  ASSERT(!value->IsHeapObject() || !GetHeap()->InNewSpace(value));
581734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
581834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    WRITE_FIELD(this, offset, value);
581934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
582034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org}
58217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
58227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
5823394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comACCESSORS(JSSet, table, Object, kTableOffset)
5824394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comACCESSORS(JSMap, table, Object, kTableOffset)
58254ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org
58264ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org
58274ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org#define ORDERED_HASH_TABLE_ITERATOR_ACCESSORS(name, type, offset)    \
58284ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org  template<class Derived, class TableType>                           \
58294ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org  type* OrderedHashTableIterator<Derived, TableType>::name() {       \
58304ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org    return type::cast(READ_FIELD(this, offset));                     \
58314ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org  }                                                                  \
58324ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org  template<class Derived, class TableType>                           \
58334ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org  void OrderedHashTableIterator<Derived, TableType>::set_##name(     \
58344ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org      type* value, WriteBarrierMode mode) {                          \
58354ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org    WRITE_FIELD(this, offset, value);                                \
58364ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org    CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); \
58374ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org  }
58384ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org
58394ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgORDERED_HASH_TABLE_ITERATOR_ACCESSORS(table, Object, kTableOffset)
58404ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgORDERED_HASH_TABLE_ITERATOR_ACCESSORS(index, Smi, kIndexOffset)
58414ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.orgORDERED_HASH_TABLE_ITERATOR_ACCESSORS(kind, Smi, kKindOffset)
58424ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org
58434ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org#undef ORDERED_HASH_TABLE_ITERATOR_ACCESSORS
58444ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org
58454ef23eea527ce7f45bdc5edd52bd4d1a989e2359machenbach@chromium.org
5846ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgACCESSORS(JSWeakCollection, table, Object, kTableOffset)
5847ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgACCESSORS(JSWeakCollection, next, Object, kNextOffset)
58487c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
58497c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
5850c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgAddress Foreign::foreign_address() {
5851c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  return AddressFrom<Address>(READ_INTPTR_FIELD(this, kForeignAddressOffset));
585243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
585343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
585443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5855c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgvoid Foreign::set_foreign_address(Address value) {
5856c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  WRITE_INTPTR_FIELD(this, kForeignAddressOffset, OffsetFrom(value));
585743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
585843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
585943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5860e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgACCESSORS(JSGeneratorObject, function, JSFunction, kFunctionOffset)
586177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.orgACCESSORS(JSGeneratorObject, context, Context, kContextOffset)
5862ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgACCESSORS(JSGeneratorObject, receiver, Object, kReceiverOffset)
5863e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgSMI_ACCESSORS(JSGeneratorObject, continuation, kContinuationOffset)
5864e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgACCESSORS(JSGeneratorObject, operand_stack, FixedArray, kOperandStackOffset)
586557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgSMI_ACCESSORS(JSGeneratorObject, stack_handler_index, kStackHandlerIndexOffset)
5866e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
5867af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgbool JSGeneratorObject::is_suspended() {
5868af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  ASSERT_LT(kGeneratorExecuting, kGeneratorClosed);
5869af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  ASSERT_EQ(kGeneratorClosed, 0);
5870af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  return continuation() > 0;
5871af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org}
5872e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
5873fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.orgbool JSGeneratorObject::is_closed() {
5874fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  return continuation() == kGeneratorClosed;
5875fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org}
5876fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org
5877fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.orgbool JSGeneratorObject::is_executing() {
5878fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org  return continuation() == kGeneratorExecuting;
5879fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org}
5880fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org
5881e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgJSGeneratorObject* JSGeneratorObject::cast(Object* obj) {
5882e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ASSERT(obj->IsJSGeneratorObject());
5883e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ASSERT(HeapObject::cast(obj)->Size() == JSGeneratorObject::kSize);
5884e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return reinterpret_cast<JSGeneratorObject*>(obj);
5885e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
5886e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
5887e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
5888ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comACCESSORS(JSModule, context, Object, kContextOffset)
588981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgACCESSORS(JSModule, scope_info, ScopeInfo, kScopeInfoOffset)
5890ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
5891ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
5892ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comJSModule* JSModule::cast(Object* obj) {
5893ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  ASSERT(obj->IsJSModule());
5894ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  ASSERT(HeapObject::cast(obj)->Size() == JSModule::kSize);
5895ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  return reinterpret_cast<JSModule*>(obj);
5896ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}
5897ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
5898ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
589943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(JSValue, value, Object, kValueOffset)
590043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
590143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
590243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenJSValue* JSValue::cast(Object* obj) {
590343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(obj->IsJSValue());
590443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize);
590543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return reinterpret_cast<JSValue*>(obj);
590643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
590743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
590843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59094efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, value, Object, kValueOffset)
59104efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset)
59114efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, year, Object, kYearOffset)
59124efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, month, Object, kMonthOffset)
59134efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, day, Object, kDayOffset)
59144efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, weekday, Object, kWeekdayOffset)
59154efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, hour, Object, kHourOffset)
59164efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, min, Object, kMinOffset)
59174efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgACCESSORS(JSDate, sec, Object, kSecOffset)
59184efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
59194efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
59204efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.orgJSDate* JSDate::cast(Object* obj) {
59214efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  ASSERT(obj->IsJSDate());
59224efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  ASSERT(HeapObject::cast(obj)->Size() == JSDate::kSize);
59234efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org  return reinterpret_cast<JSDate*>(obj);
59244efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org}
59254efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
59264efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org
592731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgACCESSORS(JSMessageObject, type, String, kTypeOffset)
592831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
592931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgACCESSORS(JSMessageObject, script, Object, kScriptOffset)
593031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
593131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgSMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
593231b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgSMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
593331b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
593431b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
593531b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.orgJSMessageObject* JSMessageObject::cast(Object* obj) {
593631b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  ASSERT(obj->IsJSMessageObject());
593731b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize);
593831b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  return reinterpret_cast<JSMessageObject*>(obj);
593931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org}
594031b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
594131b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org
594243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenINT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
594383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.orgINT_ACCESSORS(Code, prologue_offset, kPrologueOffset)
59444a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.comACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
594504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.orgACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset)
5946a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
5947057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgACCESSORS(Code, raw_type_feedback_info, Object, kTypeFeedbackInfoOffset)
5948895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgACCESSORS(Code, next_code_link, Object, kNextCodeLinkOffset)
5949fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5950fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5951057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgvoid Code::WipeOutHeader() {
5952057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  WRITE_FIELD(this, kRelocationInfoOffset, NULL);
5953057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  WRITE_FIELD(this, kHandlerTableOffset, NULL);
5954057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  WRITE_FIELD(this, kDeoptimizationDataOffset, NULL);
5955486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  WRITE_FIELD(this, kConstantPoolOffset, NULL);
5956057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  // Do not wipe out e.g. a minor key.
5957057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) {
5958057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org    WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL);
5959057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  }
5960fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
5961fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5962fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5963fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgObject* Code::type_feedback_info() {
5964fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  ASSERT(kind() == FUNCTION);
5965057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  return raw_type_feedback_info();
5966fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
5967fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5968fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5969fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgvoid Code::set_type_feedback_info(Object* value, WriteBarrierMode mode) {
5970fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  ASSERT(kind() == FUNCTION);
5971057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  set_raw_type_feedback_info(value, mode);
5972fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kTypeFeedbackInfoOffset,
5973fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                            value, mode);
5974fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
5975fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5976fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5977fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgint Code::stub_info() {
5978ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  ASSERT(kind() == COMPARE_IC || kind() == COMPARE_NIL_IC ||
5979a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org         kind() == BINARY_OP_IC || kind() == LOAD_IC || kind() == CALL_IC);
5980057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  return Smi::cast(raw_type_feedback_info())->value();
5981fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
5982fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5983fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5984fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgvoid Code::set_stub_info(int value) {
59856bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org  ASSERT(kind() == COMPARE_IC ||
5986ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org         kind() == COMPARE_NIL_IC ||
59876bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org         kind() == BINARY_OP_IC ||
5988750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org         kind() == STUB ||
59896bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org         kind() == LOAD_IC ||
5990a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org         kind() == CALL_IC ||
5991d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org         kind() == KEYED_LOAD_IC ||
5992d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org         kind() == STORE_IC ||
5993d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org         kind() == KEYED_STORE_IC);
5994057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  set_raw_type_feedback_info(Smi::FromInt(value));
5995fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
5996fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5997fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5998659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset)
599988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.orgINT_ACCESSORS(Code, ic_age, kICAgeOffset)
600043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6001fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
600243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbyte* Code::instruction_start()  {
600343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return FIELD_ADDR(this, kHeaderSize);
600443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
600543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
600643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60074a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.combyte* Code::instruction_end()  {
60084a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com  return instruction_start() + instruction_size();
60094a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com}
60104a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com
60114a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com
601243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint Code::body_size() {
60134a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com  return RoundUp(instruction_size(), kObjectAlignment);
60144a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com}
60154a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com
60164a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com
60174a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.comByteArray* Code::unchecked_relocation_info() {
60184a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com  return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
601943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
602043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
602143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
602243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbyte* Code::relocation_start() {
60234a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com  return unchecked_relocation_info()->GetDataStartAddress();
60244a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com}
60254a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com
60264a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com
60274a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.comint Code::relocation_size() {
60284a2e25edf994c4e3ff22fea6d432839192666139erik.corry@gmail.com  return unchecked_relocation_info()->length();
602943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
603043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
603143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
603243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbyte* Code::entry() {
603343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return instruction_start();
603443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
603543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
603643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6037c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool Code::contains(byte* inner_pointer) {
6038c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return (address() <= inner_pointer) && (inner_pointer <= address() + Size());
603943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
604043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
604143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
604243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenACCESSORS(JSArray, length, Object, kLengthOffset)
604343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
604443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6045f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid* JSArrayBuffer::backing_store() {
6046f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  intptr_t ptr = READ_INTPTR_FIELD(this, kBackingStoreOffset);
6047f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  return reinterpret_cast<void*>(ptr);
6048f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
6049f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
6050f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
6051f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid JSArrayBuffer::set_backing_store(void* value, WriteBarrierMode mode) {
6052f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  intptr_t ptr = reinterpret_cast<intptr_t>(value);
6053f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  WRITE_INTPTR_FIELD(this, kBackingStoreOffset, ptr);
6054f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
6055f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
6056f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
6057f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgACCESSORS(JSArrayBuffer, byte_length, Object, kByteLengthOffset)
6058a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgACCESSORS_TO_SMI(JSArrayBuffer, flag, kFlagOffset)
6059a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
6060a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
6061a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgbool JSArrayBuffer::is_external() {
6062a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  return BooleanBit::get(flag(), kIsExternalBit);
6063a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
6064a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
6065a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
6066a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgvoid JSArrayBuffer::set_is_external(bool value) {
6067a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  set_flag(BooleanBit::set(flag(), kIsExternalBit, value));
6068a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
6069f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
6070f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
6071f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgbool JSArrayBuffer::should_be_freed() {
6072f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  return BooleanBit::get(flag(), kShouldBeFreed);
6073f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org}
6074f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org
6075f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org
6076f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgvoid JSArrayBuffer::set_should_be_freed(bool value) {
6077f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  set_flag(BooleanBit::set(flag(), kShouldBeFreed, value));
6078f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org}
6079f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org
6080f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org
60811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgACCESSORS(JSArrayBuffer, weak_next, Object, kWeakNextOffset)
60821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgACCESSORS(JSArrayBuffer, weak_first_view, Object, kWeakFirstViewOffset)
60831fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
60841fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
60851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgACCESSORS(JSArrayBufferView, buffer, Object, kBufferOffset)
60861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgACCESSORS(JSArrayBufferView, byte_offset, Object, kByteOffsetOffset)
60871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgACCESSORS(JSArrayBufferView, byte_length, Object, kByteLengthOffset)
60881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgACCESSORS(JSArrayBufferView, weak_next, Object, kWeakNextOffset)
6089e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgACCESSORS(JSTypedArray, length, Object, kLengthOffset)
6090e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
6091236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgACCESSORS(JSRegExp, data, Object, kDataOffset)
6092236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
6093236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
60949fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.orgJSRegExp::Type JSRegExp::TypeTag() {
60959fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org  Object* data = this->data();
60969fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org  if (data->IsUndefined()) return JSRegExp::NOT_COMPILED;
60979fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org  Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
60989fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org  return static_cast<JSRegExp::Type>(smi->value());
6099236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org}
6100236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
6101236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
6102bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgint JSRegExp::CaptureCount() {
6103bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  switch (TypeTag()) {
6104bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    case ATOM:
6105bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      return 0;
6106bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    case IRREGEXP:
6107bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value();
6108bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    default:
6109bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      UNREACHABLE();
6110bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      return -1;
6111bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  }
6112bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org}
6113bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
6114bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
6115a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgJSRegExp::Flags JSRegExp::GetFlags() {
6116a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ASSERT(this->data()->IsFixedArray());
6117a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Object* data = this->data();
6118a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex));
6119a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return Flags(smi->value());
6120a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
6121a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
6122a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
6123a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgString* JSRegExp::Pattern() {
6124a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  ASSERT(this->data()->IsFixedArray());
6125a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Object* data = this->data();
6126a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex));
6127a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return pattern;
6128a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
6129a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
6130a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
61319fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.orgObject* JSRegExp::DataAt(int index) {
61329fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org  ASSERT(TypeTag() != NOT_COMPILED);
61339fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org  return FixedArray::cast(data())->get(index);
6134236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org}
6135236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
6136236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org
61377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgvoid JSRegExp::SetDataAt(int index, Object* value) {
61387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  ASSERT(TypeTag() != NOT_COMPILED);
61397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  ASSERT(index >= kDataIndex);  // Only implementation data can be set this way.
61407be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  FixedArray::cast(data())->set(index, value);
61417be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org}
61427be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
61437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org
614483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.orgElementsKind JSObject::GetElementsKind() {
6145d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  ElementsKind kind = map()->elements_kind();
6146c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#if DEBUG
6147c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  FixedArrayBase* fixed_array =
6148c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset));
6149ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org
6150ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org  // If a GC was caused while constructing this object, the elements
6151ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org  // pointer may point to a one pointer filler map.
6152ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org  if (ElementsAreSafeToExamine()) {
6153ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org    Map* map = fixed_array->map();
6154ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org    ASSERT((IsFastSmiOrObjectElementsKind(kind) &&
6155ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org            (map == GetHeap()->fixed_array_map() ||
6156ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org             map == GetHeap()->fixed_cow_array_map())) ||
6157ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org           (IsFastDoubleElementsKind(kind) &&
6158ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org            (fixed_array->IsFixedDoubleArray() ||
6159ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org             fixed_array == GetHeap()->empty_fixed_array())) ||
6160ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org           (kind == DICTIONARY_ELEMENTS &&
6161394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com            fixed_array->IsFixedArray() &&
6162ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org            fixed_array->IsDictionary()) ||
6163ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org           (kind > DICTIONARY_ELEMENTS));
6164486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    ASSERT((kind != SLOPPY_ARGUMENTS_ELEMENTS) ||
6165ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org           (elements()->IsFixedArray() && elements()->length() >= 2));
6166ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org  }
6167c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#endif
6168d6076d96a1411932548838e5960b594564264010erik.corry@gmail.com  return kind;
61690b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
61700b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
61710b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
61727c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgElementsAccessor* JSObject::GetElementsAccessor() {
61737c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  return ElementsAccessor::ForKind(GetElementsKind());
61747c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org}
61757c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
61767c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
6177830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgbool JSObject::HasFastObjectElements() {
6178830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return IsFastObjectElementsKind(GetElementsKind());
61790b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
61800b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
61810b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
6182830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgbool JSObject::HasFastSmiElements() {
6183830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return IsFastSmiElementsKind(GetElementsKind());
6184c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
6185c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6186c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6187830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgbool JSObject::HasFastSmiOrObjectElements() {
6188830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return IsFastSmiOrObjectElementsKind(GetElementsKind());
6189c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
6190c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6191c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
61926d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgbool JSObject::HasFastDoubleElements() {
6193830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return IsFastDoubleElementsKind(GetElementsKind());
6194830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org}
6195830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org
6196830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org
6197830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.orgbool JSObject::HasFastHoleyElements() {
6198830d30c478be03b0ac560f4002833ab141e41effsvenpanne@chromium.org  return IsFastHoleyElementsKind(GetElementsKind());
61996d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}
62006d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
62016d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
6202fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgbool JSObject::HasFastElements() {
6203fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return IsFastElementsKind(GetElementsKind());
6204fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
6205fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
6206fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
62070b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgbool JSObject::HasDictionaryElements() {
62080b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  return GetElementsKind() == DICTIONARY_ELEMENTS;
62090b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org}
62100b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
62110b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org
6212486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgbool JSObject::HasSloppyArgumentsElements() {
6213486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS;
6214c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
6215c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6216c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
62173811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgbool JSObject::HasExternalArrayElements() {
62184d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  HeapObject* array = elements();
62194d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  ASSERT(array != NULL);
62204d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  return array->IsExternalArray();
62213811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
62223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
62233811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
6224af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#define EXTERNAL_ELEMENTS_CHECK(Type, type, TYPE, ctype, size)          \
6225af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgbool JSObject::HasExternal##Type##Elements() {                          \
6226af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  HeapObject* array = elements();                                       \
6227af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  ASSERT(array != NULL);                                                \
6228af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  if (!array->IsHeapObject())                                           \
6229af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    return false;                                                       \
6230af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  return array->map()->instance_type() == EXTERNAL_##TYPE##_ARRAY_TYPE; \
62313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
62323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
6233af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTYPED_ARRAYS(EXTERNAL_ELEMENTS_CHECK)
62343811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
6235af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org#undef EXTERNAL_ELEMENTS_CHECK
62363811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
62373811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
62385c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgbool JSObject::HasFixedTypedArrayElements() {
62395c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  HeapObject* array = elements();
62405c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  ASSERT(array != NULL);
62415c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  return array->IsFixedTypedArrayBase();
62425c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org}
62435c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
62445c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org
6245895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org#define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size)         \
6246895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgbool JSObject::HasFixed##Type##Elements() {                               \
6247895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  HeapObject* array = elements();                                         \
6248895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  ASSERT(array != NULL);                                                  \
6249895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  if (!array->IsHeapObject())                                             \
6250895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org    return false;                                                         \
6251895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org  return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE;      \
6252895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org}
6253895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
6254895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.orgTYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK)
6255895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
6256895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org#undef FIXED_TYPED_ELEMENTS_CHECK
6257895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
6258895f00d1d8c5a7a7209c36d690688e3552de3df4machenbach@chromium.org
625943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool JSObject::HasNamedInterceptor() {
626043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return map()->has_named_interceptor();
626143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
626243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
626343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
626443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool JSObject::HasIndexedInterceptor() {
626543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return map()->has_indexed_interceptor();
626643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
626743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
626843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6269750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgNameDictionary* JSObject::property_dictionary() {
627043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(!HasFastProperties());
6271750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return NameDictionary::cast(properties());
627243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
627343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
627443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6275f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comSeededNumberDictionary* JSObject::element_dictionary() {
62760b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org  ASSERT(HasDictionaryElements());
6277f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  return SeededNumberDictionary::cast(elements());
627843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
627943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
628043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62814a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgbool Name::IsHashFieldComputed(uint32_t field) {
628230ce411529579186181838984710b0b0980857aaricow@chromium.org  return (field & kHashNotComputedMask) == 0;
628330ce411529579186181838984710b0b0980857aaricow@chromium.org}
628430ce411529579186181838984710b0b0980857aaricow@chromium.org
628530ce411529579186181838984710b0b0980857aaricow@chromium.org
62864a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orgbool Name::HasHashCode() {
628730ce411529579186181838984710b0b0980857aaricow@chromium.org  return IsHashFieldComputed(hash_field());
628843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
628943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
629043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62914a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.orguint32_t Name::Hash() {
629243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Fast case: has hash code already been computed?
6293ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  uint32_t field = hash_field();
629430ce411529579186181838984710b0b0980857aaricow@chromium.org  if (IsHashFieldComputed(field)) return field >> kHashShift;
62954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  // Slow case: compute hash code and set it. Has to be a string.
62964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  return String::cast(this)->ComputeAndSetHash();
629743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
629843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
629943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6300fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.orgStringHasher::StringHasher(int length, uint32_t seed)
63017c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org  : length_(length),
6302fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org    raw_running_hash_(seed),
63037c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    array_index_(0),
63047c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org    is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize),
630533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    is_first_char_(true) {
6306f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  ASSERT(FLAG_randomize_hashes || raw_running_hash_ == 0);
6307fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org}
63087c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
63097c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
63107c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.orgbool StringHasher::has_trivial_hash() {
6311ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  return length_ > String::kMaxHashCalcLength;
63127c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
63137c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
63147c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
6315a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orguint32_t StringHasher::AddCharacterCore(uint32_t running_hash, uint16_t c) {
631633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  running_hash += c;
631733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  running_hash += (running_hash << 10);
631833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  running_hash ^= (running_hash >> 6);
631933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return running_hash;
632033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org}
632133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
632233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
632333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orguint32_t StringHasher::GetHashCore(uint32_t running_hash) {
632433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  running_hash += (running_hash << 3);
632533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  running_hash ^= (running_hash >> 11);
632633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  running_hash += (running_hash << 15);
632733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if ((running_hash & String::kHashBitMask) == 0) {
632889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    return kZeroHash;
632933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
633033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return running_hash;
633133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org}
633233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
633333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
6334a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgvoid StringHasher::AddCharacter(uint16_t c) {
63355a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  // Use the Jenkins one-at-a-time hash function to update the hash
63365a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  // for the given character.
633733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  raw_running_hash_ = AddCharacterCore(raw_running_hash_, c);
63387c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
63397c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
63407c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
6341a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgbool StringHasher::UpdateIndex(uint16_t c) {
6342a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  ASSERT(is_array_index_);
6343a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (c < '0' || c > '9') {
6344a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    is_array_index_ = false;
6345a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return false;
6346154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  }
6347a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  int d = c - '0';
6348a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (is_first_char_) {
6349a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    is_first_char_ = false;
6350a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    if (c == '0' && length_ > 1) {
6351a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      is_array_index_ = false;
6352a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      return false;
6353a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    }
6354a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
6355a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (array_index_ > 429496729U - ((d + 2) >> 3)) {
6356a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    is_array_index_ = false;
6357a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    return false;
6358a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
6359a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  array_index_ = array_index_ * 10 + d;
6360a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  return true;
63617c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
63627c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
63637c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
6364a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgtemplate<typename Char>
6365a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orginline void StringHasher::AddCharacters(const Char* chars, int length) {
6366a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  ASSERT(sizeof(Char) == 1 || sizeof(Char) == 2);
6367a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  int i = 0;
6368a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (is_array_index_) {
6369a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    for (; i < length; i++) {
6370a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      AddCharacter(chars[i]);
6371a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      if (!UpdateIndex(chars[i])) {
6372a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org        i++;
6373a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org        break;
6374a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org      }
6375a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    }
6376a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
6377a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  for (; i < length; i++) {
6378a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    ASSERT(!is_array_index_);
6379a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    AddCharacter(chars[i]);
6380a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  }
63817c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
63827c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
63837c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
6384b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.orgtemplate <typename schar>
6385a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orguint32_t StringHasher::HashSequentialString(const schar* chars,
6386a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                                            int length,
6387a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org                                            uint32_t seed) {
6388fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org  StringHasher hasher(length, seed);
6389a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org  if (!hasher.has_trivial_hash()) hasher.AddCharacters(chars, length);
6390b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org  return hasher.GetHashField();
6391b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org}
6392b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
6393b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org
6394750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgbool Name::AsArrayIndex(uint32_t* index) {
6395750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return IsString() && String::cast(this)->AsArrayIndex(index);
6396750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org}
6397750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
6398750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
639943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool String::AsArrayIndex(uint32_t* index) {
6400ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org  uint32_t field = hash_field();
64011af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) {
64021af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org    return false;
64031af7e1b5f676e5556c041fe09a5c4f5a906f27a0lrn@chromium.org  }
640443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return SlowAsArrayIndex(index);
640543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
640643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
640743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6408d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.orgObject* JSReceiver::GetPrototype() {
640999aa490225c81012235659d9a183226b286178c8yangguo@chromium.org  return map()->prototype();
641043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
641143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
641243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6413c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.orgObject* JSReceiver::GetConstructor() {
6414c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org  return map()->constructor();
6415c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org}
6416c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org
6417c74d674717b2e229addbb9349986cd157947f7edyangguo@chromium.org
6418528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgbool JSReceiver::HasProperty(Handle<JSReceiver> object,
6419528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                             Handle<Name> name) {
6420528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (object->IsJSProxy()) {
6421528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
6422528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return JSProxy::HasPropertyWithHandler(proxy, name);
6423717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  }
64241845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  return GetPropertyAttributes(object, name) != ABSENT;
6425717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org}
6426717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
6427717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
6428fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.orgbool JSReceiver::HasOwnProperty(Handle<JSReceiver> object, Handle<Name> name) {
6429528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (object->IsJSProxy()) {
6430528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
6431528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return JSProxy::HasPropertyWithHandler(proxy, name);
6432717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org  }
64331845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  return GetOwnPropertyAttributes(object, name) != ABSENT;
6434717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org}
6435717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
6436717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
64371845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgPropertyAttributes JSReceiver::GetPropertyAttributes(Handle<JSReceiver> object,
64381845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org                                                     Handle<Name> key) {
64398e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  uint32_t index;
6440381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (object->IsJSObject() && key->AsArrayIndex(&index)) {
6441381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    return GetElementAttribute(object, index);
64428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  }
64431845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  LookupIterator it(object, key);
64441845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org  return GetPropertyAttributes(&it);
644543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
644643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6447e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6448381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.orgPropertyAttributes JSReceiver::GetElementAttribute(Handle<JSReceiver> object,
6449381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org                                                   uint32_t index) {
6450381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (object->IsJSProxy()) {
6451381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    return JSProxy::GetElementAttributeWithHandler(
6452381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org        Handle<JSProxy>::cast(object), object, index);
6453e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
6454381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return JSObject::GetElementAttributeWithReceiver(
6455381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      Handle<JSObject>::cast(object), object, index, true);
6456e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
6457e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6458e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6459113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.orgbool JSGlobalObject::IsDetached() {
6460113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  return JSGlobalProxy::cast(global_receiver())->IsDetachedFrom(this);
6461113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org}
6462113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org
6463113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org
6464113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.orgbool JSGlobalProxy::IsDetachedFrom(GlobalObject* global) {
6465113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  return GetPrototype() != global;
6466c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
6467c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
6468c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
64693c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgHandle<Smi> JSReceiver::GetOrCreateIdentityHash(Handle<JSReceiver> object) {
6470057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  return object->IsJSProxy()
6471057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org      ? JSProxy::GetOrCreateIdentityHash(Handle<JSProxy>::cast(object))
6472057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org      : JSObject::GetOrCreateIdentityHash(Handle<JSObject>::cast(object));
6473057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org}
6474057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
6475057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org
6476057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.orgObject* JSReceiver::GetIdentityHash() {
6477c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return IsJSProxy()
6478057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org      ? JSProxy::cast(this)->GetIdentityHash()
6479057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org      : JSObject::cast(this)->GetIdentityHash();
6480c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}
6481c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
6482c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org
6483528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.orgbool JSReceiver::HasElement(Handle<JSReceiver> object, uint32_t index) {
6484528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (object->IsJSProxy()) {
6485528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
6486528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return JSProxy::HasElementWithHandler(proxy, index);
6487c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
6488381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return JSObject::GetElementAttributeWithReceiver(
6489381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      Handle<JSObject>::cast(object), object, index, true) != ABSENT;
6490e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
6491e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6492e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6493fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.orgbool JSReceiver::HasOwnElement(Handle<JSReceiver> object, uint32_t index) {
6494528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (object->IsJSProxy()) {
6495528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    Handle<JSProxy> proxy = Handle<JSProxy>::cast(object);
6496528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return JSProxy::HasElementWithHandler(proxy, index);
6497e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
6498381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return JSObject::GetElementAttributeWithReceiver(
6499381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      Handle<JSObject>::cast(object), object, index, false) != ABSENT;
6500e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org}
6501e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6502e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org
6503fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.orgPropertyAttributes JSReceiver::GetOwnElementAttribute(
6504381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Handle<JSReceiver> object, uint32_t index) {
6505381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (object->IsJSProxy()) {
6506381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    return JSProxy::GetElementAttributeWithHandler(
6507381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org        Handle<JSProxy>::cast(object), object, index);
6508e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org  }
6509381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  return JSObject::GetElementAttributeWithReceiver(
6510381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      Handle<JSObject>::cast(object), object, index, false);
651143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
651243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
651343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
651443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool AccessorInfo::all_can_read() {
651543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return BooleanBit::get(flag(), kAllCanReadBit);
651643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
651743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
651843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
651943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AccessorInfo::set_all_can_read(bool value) {
652043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_flag(BooleanBit::set(flag(), kAllCanReadBit, value));
652143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
652243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
652343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
652443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool AccessorInfo::all_can_write() {
652543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return BooleanBit::get(flag(), kAllCanWriteBit);
652643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
652743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
652843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
652943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AccessorInfo::set_all_can_write(bool value) {
653043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value));
653143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
653243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
653343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
653443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPropertyAttributes AccessorInfo::property_attributes() {
653543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return AttributesField::decode(static_cast<uint32_t>(flag()->value()));
653643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
653743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
653843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
653943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AccessorInfo::set_property_attributes(PropertyAttributes attributes) {
654083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  set_flag(Smi::FromInt(AttributesField::update(flag()->value(), attributes)));
654143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
654243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
654344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
65447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgbool AccessorInfo::IsCompatibleReceiver(Object* receiver) {
65457028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Object* function_template = expected_receiver_type();
65467028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  if (!function_template->IsFunctionTemplateInfo()) return true;
65479af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  return FunctionTemplateInfo::cast(function_template)->IsTemplateFor(receiver);
65487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
65497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
65507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
6551e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.orgvoid ExecutableAccessorInfo::clear_setter() {
6552e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  set_setter(GetIsolate()->heap()->undefined_value(), SKIP_WRITE_BARRIER);
6553e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org}
6554e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
6555e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
65561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgvoid AccessorPair::set_access_flags(v8::AccessControl access_control) {
65571e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  int current = access_flags()->value();
65581e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  current = BooleanBit::set(current,
65591e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                            kAllCanReadBit,
65601e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                            access_control & ALL_CAN_READ);
65611e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  current = BooleanBit::set(current,
65621e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                            kAllCanWriteBit,
65631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org                            access_control & ALL_CAN_WRITE);
65641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  set_access_flags(Smi::FromInt(current));
65651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
65661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
65671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
65681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgbool AccessorPair::all_can_read() {
65691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  return BooleanBit::get(access_flags(), kAllCanReadBit);
65701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
65711e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
65721e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
65731e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgbool AccessorPair::all_can_write() {
65741e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  return BooleanBit::get(access_flags(), kAllCanWriteBit);
65751e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
65761e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
65771e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
6578c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgtemplate<typename Derived, typename Shape, typename Key>
6579c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgvoid Dictionary<Derived, Shape, Key>::SetEntry(int entry,
6580865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                               Handle<Object> key,
6581865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                               Handle<Object> value) {
658244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org  SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
658344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org}
658444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
658544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
6586c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgtemplate<typename Derived, typename Shape, typename Key>
6587c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgvoid Dictionary<Derived, Shape, Key>::SetEntry(int entry,
6588865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                               Handle<Object> key,
6589865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                               Handle<Object> value,
6590c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org                                               PropertyDetails details) {
6591750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  ASSERT(!key->IsName() ||
659246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org         details.IsDeleted() ||
659346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org         details.dictionary_index() > 0);
6594c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  int index = DerivedHashTable::EntryToIndex(entry);
659579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org  DisallowHeapAllocation no_gc;
6596b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
6597865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  FixedArray::set(index, *key, mode);
6598865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  FixedArray::set(index+1, *value, mode);
6599394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  FixedArray::set(index+2, details.AsSmi());
660043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
660143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
660243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6603ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
6604ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(other->IsNumber());
6605ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return key == static_cast<uint32_t>(other->Number());
6606ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
6607ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6608ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6609f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comuint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) {
6610f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  return ComputeIntegerHash(key, 0);
6611ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
6612ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6613ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6614f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comuint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key,
6615f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com                                                      Object* other) {
6616ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(other->IsNumber());
6617f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0);
6618f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
6619f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
6620865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
6621f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comuint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) {
6622f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  return ComputeIntegerHash(key, seed);
6623ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
6624ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6625865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org
6626f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comuint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key,
6627f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com                                                          uint32_t seed,
6628f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com                                                          Object* other) {
6629f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  ASSERT(other->IsNumber());
6630f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed);
6631f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
6632ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6633ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6634f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.orgHandle<Object> NumberDictionaryShape::AsHandle(Isolate* isolate, uint32_t key) {
6635f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  return isolate->factory()->NewNumberFromUint(key);
6636f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org}
6637f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org
6638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6639f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.orgbool NameDictionaryShape::IsMatch(Handle<Name> key, Object* other) {
6640ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // We know that all entries in a hash table had their hash keys created.
6641ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Use that knowledge to have fast failure.
6642750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  if (key->Hash() != Name::cast(other)->Hash()) return false;
6643750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return key->Equals(Name::cast(other));
6644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
6645ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6646ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6647f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.orguint32_t NameDictionaryShape::Hash(Handle<Name> key) {
6648ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return key->Hash();
6649ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
6650ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6651ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6652f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.orguint32_t NameDictionaryShape::HashForObject(Handle<Name> key, Object* other) {
6653750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return Name::cast(other)->Hash();
6654ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
6655ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6656ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6657f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.orgHandle<Object> NameDictionaryShape::AsHandle(Isolate* isolate,
6658f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org                                             Handle<Name> key) {
66598e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  ASSERT(key->IsUniqueName());
6660ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return key;
6661ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
6662ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6663ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6664f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.orgvoid NameDictionary::DoGenerateNewEnumerationIndices(
6665f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org    Handle<NameDictionary> dictionary) {
6666f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org  DerivedDictionary::GenerateNewEnumerationIndices(dictionary);
6667f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org}
6668f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org
6669f2f0489407bbb5e50d16ae791442df29513b53b5machenbach@chromium.org
6670865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgbool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) {
6671394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  return key->SameValue(other);
66727943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org}
66737943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org
66747943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org
6675865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orguint32_t ObjectHashTableShape::Hash(Handle<Object> key) {
6676057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  return Smi::cast(key->GetHash())->value();
66777943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org}
66787943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org
66797943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org
6680865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orguint32_t ObjectHashTableShape::HashForObject(Handle<Object> key,
6681865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                             Object* other) {
6682057bd50c2c2d15923523777a296cddee5c8ba63bverwaest@chromium.org  return Smi::cast(other->GetHash())->value();
66837943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org}
66847943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org
66857943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org
6686865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgHandle<Object> ObjectHashTableShape::AsHandle(Isolate* isolate,
6687865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                              Handle<Object> key) {
66887943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org  return key;
66897943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org}
66907943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org
66917943d46751aa94f2738bef3002bd6675b520f3b5vegorov@chromium.org
6692c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgHandle<ObjectHashTable> ObjectHashTable::Shrink(
6693c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    Handle<ObjectHashTable> table, Handle<Object> key) {
6694865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  return DerivedHashTable::Shrink(table, key);
6695c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org}
6696c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
6697c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
669825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgtemplate <int entrysize>
6699865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgbool WeakHashTableShape<entrysize>::IsMatch(Handle<Object> key, Object* other) {
670025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  return key->SameValue(other);
670125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org}
670225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
670325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
670425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgtemplate <int entrysize>
6705865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orguint32_t WeakHashTableShape<entrysize>::Hash(Handle<Object> key) {
6706865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org  intptr_t hash = reinterpret_cast<intptr_t>(*key);
670725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  return (uint32_t)(hash & 0xFFFFFFFF);
670825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org}
670925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
671025b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
671125b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgtemplate <int entrysize>
6712865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orguint32_t WeakHashTableShape<entrysize>::HashForObject(Handle<Object> key,
671325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org                                                      Object* other) {
671425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  intptr_t hash = reinterpret_cast<intptr_t>(other);
671525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  return (uint32_t)(hash & 0xFFFFFFFF);
671625b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org}
671725b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
671825b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
671925b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.orgtemplate <int entrysize>
6720865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgHandle<Object> WeakHashTableShape<entrysize>::AsHandle(Isolate* isolate,
6721865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org                                                       Handle<Object> key) {
672225b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org  return key;
672325b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org}
672425b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
672525b0e21ac53cd2e892094493a65f75258fa977f0jkummerow@chromium.org
6726ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Map::ClearCodeCache(Heap* heap) {
672743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // No write barrier is needed since empty_fixed_array is not in new space.
672843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Please note this function is used during marking:
672943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  //  - MarkCompactCollector::MarkUnmarkedObject
673088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  //  - IncrementalMarking::Step
673172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  ASSERT(!heap->InNewSpace(heap->empty_fixed_array()));
673272204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  WRITE_FIELD(this, kCodeCacheOffset, heap->empty_fixed_array());
673343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
673443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
673543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6736b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.orgvoid JSArray::EnsureSize(Handle<JSArray> array, int required_size) {
6737b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  ASSERT(array->HasFastSmiOrObjectElements());
6738b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  Handle<FixedArray> elts = handle(FixedArray::cast(array->elements()));
67396141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org  const int kArraySizeThatFitsComfortablyInNewSpace = 128;
67406141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org  if (elts->length() < required_size) {
67416141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org    // Doubling in size would be overkill, but leave some slack to avoid
67426141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org    // constantly growing.
6743b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    Expand(array, required_size + (required_size >> 3));
67446141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org    // It's a performance benefit to keep a frequently used array in new-space.
6745b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  } else if (!array->GetHeap()->new_space()->Contains(*elts) &&
67466141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org             required_size < kArraySizeThatFitsComfortablyInNewSpace) {
67476141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org    // Expand will allocate a new backing store in new space even if the size
67486141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org    // we asked for isn't larger than what we had before.
6749b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    Expand(array, required_size);
67506141cbe3fd2be496590a3d5fe89b263c87eee58aager@chromium.org  }
67515aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org}
67525aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
67535aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org
6754b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid JSArray::set_length(Smi* length) {
6755c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  // Don't need a write barrier for a Smi.
6756b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
6757b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
6758b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
6759b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
67607ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.orgbool JSArray::AllowsSetElementsLength() {
67617ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray();
67627ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  ASSERT(result == !HasExternalArrayElements());
67637ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  return result;
67647ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org}
67657ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
67667ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org
6767fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.orgvoid JSArray::SetContent(Handle<JSArray> array,
6768fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org                         Handle<FixedArrayBase> storage) {
6769fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  EnsureCanContainElements(array, storage, storage->length(),
6770fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org                           ALLOW_COPIED_DOUBLE_ELEMENTS);
6771fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org
6772fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  ASSERT((storage->map() == array->GetHeap()->fixed_double_array_map() &&
6773fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org          IsFastDoubleElementsKind(array->GetElementsKind())) ||
6774fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org         ((storage->map() != array->GetHeap()->fixed_double_array_map()) &&
6775fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org          (IsFastObjectElementsKind(array->GetElementsKind()) ||
6776fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org           (IsFastSmiElementsKind(array->GetElementsKind()) &&
6777fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org            Handle<FixedArray>::cast(storage)->ContainsOnlySmisOrHoles()))));
6778fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  array->set_elements(*storage);
6779fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org  array->set_length(Smi::FromInt(storage->length()));
67807c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org}
67817c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
67827c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org
6783f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgHandle<Object> TypeFeedbackInfo::UninitializedSentinel(Isolate* isolate) {
6784ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return isolate->factory()->uninitialized_symbol();
6785fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org}
6786fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
6787fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
6788f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgHandle<Object> TypeFeedbackInfo::MegamorphicSentinel(Isolate* isolate) {
6789ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return isolate->factory()->megamorphic_symbol();
6790fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org}
6791fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
6792fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
6793f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgHandle<Object> TypeFeedbackInfo::MonomorphicArraySentinel(Isolate* isolate,
67944a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    ElementsKind elements_kind) {
67954a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  return Handle<Object>(Smi::FromInt(static_cast<int>(elements_kind)), isolate);
67964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}
67974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
67984a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org
6799f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgObject* TypeFeedbackInfo::RawUninitializedSentinel(Heap* heap) {
6800ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return heap->uninitialized_symbol();
6801fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org}
6802fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
6803fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
680446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgint TypeFeedbackInfo::ic_total_count() {
680546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int current = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
680646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  return ICTotalCountField::decode(current);
680746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
680846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
680946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
681046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid TypeFeedbackInfo::set_ic_total_count(int count) {
681146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int value = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
681246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  value = ICTotalCountField::update(value,
681346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org                                    ICTotalCountField::decode(count));
681446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  WRITE_FIELD(this, kStorage1Offset, Smi::FromInt(value));
681546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
681646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
681746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
681846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgint TypeFeedbackInfo::ic_with_type_info_count() {
681946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int current = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
682046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  return ICsWithTypeInfoCountField::decode(current);
682146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
682246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
682346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
682446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid TypeFeedbackInfo::change_ic_with_type_info_count(int delta) {
682546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
682646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int new_count = ICsWithTypeInfoCountField::decode(value) + delta;
682746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // We can get negative count here when the type-feedback info is
682846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // shared between two code objects. The can only happen when
682946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // the debugger made a shallow copy of code object (see Heap::CopyCode).
683046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // Since we do not optimize when the debugger is active, we can skip
683146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // this counter update.
683246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  if (new_count >= 0) {
683346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    new_count &= ICsWithTypeInfoCountField::kMask;
683446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    value = ICsWithTypeInfoCountField::update(value, new_count);
683546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org    WRITE_FIELD(this, kStorage2Offset, Smi::FromInt(value));
683646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  }
683746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
683846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
683946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
684046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid TypeFeedbackInfo::initialize_storage() {
684146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  WRITE_FIELD(this, kStorage1Offset, Smi::FromInt(0));
684246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  WRITE_FIELD(this, kStorage2Offset, Smi::FromInt(0));
684346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
684446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
684546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
684646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid TypeFeedbackInfo::change_own_type_change_checksum() {
684746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int value = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
684846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int checksum = OwnTypeChangeChecksum::decode(value);
684946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  checksum = (checksum + 1) % (1 << kTypeChangeChecksumBits);
685046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  value = OwnTypeChangeChecksum::update(value, checksum);
685146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // Ensure packed bit field is in Smi range.
685246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  if (value > Smi::kMaxValue) value |= Smi::kMinValue;
685346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  if (value < Smi::kMinValue) value &= ~Smi::kMinValue;
685446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  WRITE_FIELD(this, kStorage1Offset, Smi::FromInt(value));
685546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
685646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
685746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
685846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgvoid TypeFeedbackInfo::set_inlined_type_change_checksum(int checksum) {
685946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
686046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int mask = (1 << kTypeChangeChecksumBits) - 1;
686146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  value = InlinedTypeChangeChecksum::update(value, checksum & mask);
686246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  // Ensure packed bit field is in Smi range.
686346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  if (value > Smi::kMaxValue) value |= Smi::kMinValue;
686446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  if (value < Smi::kMinValue) value &= ~Smi::kMinValue;
686546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  WRITE_FIELD(this, kStorage2Offset, Smi::FromInt(value));
686646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
686746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
686846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
686946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgint TypeFeedbackInfo::own_type_change_checksum() {
687046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int value = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
687146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  return OwnTypeChangeChecksum::decode(value);
687246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
687346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
687446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
687546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgbool TypeFeedbackInfo::matches_inlined_type_change_checksum(int checksum) {
687646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
687746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  int mask = (1 << kTypeChangeChecksumBits) - 1;
687846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  return InlinedTypeChangeChecksum::decode(value) == (checksum & mask);
687946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org}
688046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
688146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org
6882ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgSMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot)
6883ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
6884ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
6885ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgRelocatable::Relocatable(Isolate* isolate) {
6886ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_ = isolate;
6887ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  prev_ = isolate->relocatable_top();
6888ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate->set_relocatable_top(this);
6889ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
6890ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6891ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
6892ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgRelocatable::~Relocatable() {
6893ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT_EQ(isolate_->relocatable_top(), this);
6894ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->set_relocatable_top(prev_);
68955a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org}
68965a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
68975a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org
6898ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgint JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) {
6899ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  return map->instance_size();
6900ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6901ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6902ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6903ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgvoid Foreign::ForeignIterateBody(ObjectVisitor* v) {
6904ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  v->VisitExternalReference(
6905c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
6906ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6907ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6908ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6909ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor>
6910ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.orgvoid Foreign::ForeignIterateBody() {
6911ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  StaticVisitor::VisitExternalReference(
6912c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
6913ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6914ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6915ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6916ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgvoid ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) {
6917ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  typedef v8::String::ExternalAsciiStringResource Resource;
6918ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  v->VisitExternalAsciiString(
6919ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
6920ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6921ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6922ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6923ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor>
6924ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgvoid ExternalAsciiString::ExternalAsciiStringIterateBody() {
6925ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  typedef v8::String::ExternalAsciiStringResource Resource;
6926ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  StaticVisitor::VisitExternalAsciiString(
6927ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
6928ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6929ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6930ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6931ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) {
6932ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  typedef v8::String::ExternalStringResource Resource;
6933ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  v->VisitExternalTwoByteString(
6934ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
6935ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6936ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6937ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6938ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<typename StaticVisitor>
6939ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
6940ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  typedef v8::String::ExternalStringResource Resource;
6941ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org  StaticVisitor::VisitExternalTwoByteString(
6942ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org      reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
6943ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6944ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6945ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6946ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<int start_offset, int end_offset, int size>
6947ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgvoid FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody(
6948ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org    HeapObject* obj,
6949ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org    ObjectVisitor* v) {
6950471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    v->VisitPointers(HeapObject::RawField(obj, start_offset),
6951471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                     HeapObject::RawField(obj, end_offset));
6952ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6953ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6954ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6955ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgtemplate<int start_offset>
6956ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgvoid FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj,
6957ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org                                                       int object_size,
6958ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org                                                       ObjectVisitor* v) {
6959471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  v->VisitPointers(HeapObject::RawField(obj, start_offset),
6960471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                   HeapObject::RawField(obj, object_size));
6961ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org}
6962ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
6963ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org
69642c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef TYPE_CHECKER
696543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef CAST_ACCESSOR
696643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef INT_ACCESSORS
696743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef ACCESSORS
69682c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef ACCESSORS_TO_SMI
69692c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef SMI_ACCESSORS
69705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org#undef SYNCHRONIZED_SMI_ACCESSORS
69715b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org#undef NOBARRIER_SMI_ACCESSORS
69722c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef BOOL_GETTER
69732c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef BOOL_ACCESSORS
697443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef FIELD_ADDR
697543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef READ_FIELD
69765b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org#undef NOBARRIER_READ_FIELD
697743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef WRITE_FIELD
69785b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org#undef NOBARRIER_WRITE_FIELD
697943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef WRITE_BARRIER
69805a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org#undef CONDITIONAL_WRITE_BARRIER
698143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef READ_DOUBLE_FIELD
698243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef WRITE_DOUBLE_FIELD
698343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef READ_INT_FIELD
698443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef WRITE_INT_FIELD
69852c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef READ_INTPTR_FIELD
69862c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef WRITE_INTPTR_FIELD
69872c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef READ_UINT32_FIELD
69882c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org#undef WRITE_UINT32_FIELD
698943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef READ_SHORT_FIELD
699043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef WRITE_SHORT_FIELD
699143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef READ_BYTE_FIELD
699243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef WRITE_BYTE_FIELD
69935b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org#undef NOBARRIER_READ_BYTE_FIELD
69945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org#undef NOBARRIER_WRITE_BYTE_FIELD
699543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
699643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
699743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
699843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_OBJECTS_INL_H_
6999