13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Review notes:
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - The use of macros in these inline functions may seem superfluous
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// but it is absolutely needed to make sure gcc generates optimal
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// code. gcc is not happy when attempting to inline too deep.
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_OBJECTS_INL_H_
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_OBJECTS_INL_H_
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/atomicops.h"
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h"
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/builtins/builtins.h"
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/contexts-inl.h"
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/conversions-inl.h"
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/factory.h"
2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/feedback-vector-inl.h"
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/field-index-inl.h"
23bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include "src/field-type.h"
24109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/handles-inl.h"
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap-inl.h"
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap.h"
273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/isolate-inl.h"
2813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/isolate.h"
2913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/keys.h"
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/layout-descriptor-inl.h"
31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/lookup-cache-inl.h"
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/lookup.h"
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/objects.h"
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/literal-objects.h"
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/module-info.h"
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/regexp-match-info.h"
3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/scope-info.h"
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/property.h"
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/prototype.h"
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/transitions-inl.h"
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8memory.h"
42592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails::PropertyDetails(Smi* smi) {
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value_ = smi->value();
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSmi* PropertyDetails::AsSmi() const {
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Ensure the upper 2 bits have the same value by sign extending it. This is
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // necessary to be able to use the 31st bit of the property details.
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = value_ << 1;
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Smi::FromInt(value >> 1);
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint PropertyDetails::field_width_in_words() const {
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(location() == kField);
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (!FLAG_unbox_double_fields) return 1;
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (kDoubleSize == kPointerSize) return 1;
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return representation().IsDouble() ? kDoubleSize / kPointerSize : 1;
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define INT_ACCESSORS(holder, name, offset)                                   \
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int holder::name() const { return READ_INT_FIELD(this, offset); }           \
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); }
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define ACCESSORS_CHECKED2(holder, name, type, offset, get_condition, \
7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                           set_condition)                             \
7262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  type* holder::name() const {                                        \
7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(get_condition);                                            \
7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return type::cast(READ_FIELD(this, offset));                      \
7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }                                                                   \
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void holder::set_##name(type* value, WriteBarrierMode mode) {       \
7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(set_condition);                                            \
7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    WRITE_FIELD(this, offset, value);                                 \
7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);  \
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define ACCESSORS_CHECKED(holder, name, type, offset, condition) \
8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ACCESSORS_CHECKED2(holder, name, type, offset, condition, condition)
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define ACCESSORS(holder, name, type, offset) \
85f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ACCESSORS_CHECKED(holder, name, type, offset, true)
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Getter that returns a Smi as an int and writes an int as a Smi.
88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define SMI_ACCESSORS_CHECKED(holder, name, offset, condition) \
89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int holder::name() const {                                   \
90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DCHECK(condition);                                         \
91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Object* value = READ_FIELD(this, offset);                  \
92f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return Smi::cast(value)->value();                          \
93f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }                                                            \
94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void holder::set_##name(int value) {                         \
95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    DCHECK(condition);                                         \
96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    WRITE_FIELD(this, offset, Smi::FromInt(value));            \
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define SMI_ACCESSORS(holder, name, offset) \
100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SMI_ACCESSORS_CHECKED(holder, name, offset, true)
101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define SYNCHRONIZED_SMI_ACCESSORS(holder, name, offset)    \
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int holder::synchronized_##name() const {                 \
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Object* value = ACQUIRE_READ_FIELD(this, offset);       \
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Smi::cast(value)->value();                       \
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }                                                         \
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void holder::synchronized_set_##name(int value) {         \
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    RELEASE_WRITE_FIELD(this, offset, Smi::FromInt(value)); \
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NOBARRIER_SMI_ACCESSORS(holder, name, offset)          \
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int holder::nobarrier_##name() const {                       \
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Object* value = NOBARRIER_READ_FIELD(this, offset);        \
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return Smi::cast(value)->value();                          \
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }                                                            \
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void holder::nobarrier_set_##name(int value) {               \
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    NOBARRIER_WRITE_FIELD(this, offset, Smi::FromInt(value));  \
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_GETTER(holder, field, name, offset)           \
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool holder::name() const {                              \
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return BooleanBit::get(field(), offset);               \
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }                                                        \
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_ACCESSORS(holder, field, name, offset)        \
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool holder::name() const {                              \
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return BooleanBit::get(field(), offset);               \
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }                                                        \
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  void holder::set_##name(bool value) {                    \
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    set_##field(BooleanBit::set(field(), offset, value));  \
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define TYPE_CHECKER(type, instancetype)           \
13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool HeapObject::Is##type() const {              \
13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return map()->instance_type() == instancetype; \
13762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
13862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
13962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE)
14062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(BytecodeArray, BYTECODE_ARRAY_TYPE)
14162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(Cell, CELL_TYPE)
14262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(Code, CODE_TYPE)
14362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)
14462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(Foreign, FOREIGN_TYPE)
14562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE)
14662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE)
14762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSArgumentsObject, JS_ARGUMENTS_TYPE)
14862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSArray, JS_ARRAY_TYPE)
14962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSArrayBuffer, JS_ARRAY_BUFFER_TYPE)
15062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSBoundFunction, JS_BOUND_FUNCTION_TYPE)
15162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE)
15262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSDataView, JS_DATA_VIEW_TYPE)
15362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSDate, JS_DATE_TYPE)
15462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSError, JS_ERROR_TYPE)
15562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE)
15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSGeneratorObject, JS_GENERATOR_OBJECT_TYPE)
15762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE)
15862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSMap, JS_MAP_TYPE)
15962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSMapIterator, JS_MAP_ITERATOR_TYPE)
16062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE)
16162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSModuleNamespace, JS_MODULE_NAMESPACE_TYPE)
16262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSPromiseCapability, JS_PROMISE_CAPABILITY_TYPE)
16362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSPromise, JS_PROMISE_TYPE)
16462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE)
16562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSSet, JS_SET_TYPE)
16662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE)
16762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSAsyncFromSyncIterator, JS_ASYNC_FROM_SYNC_ITERATOR_TYPE)
16862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSStringIterator, JS_STRING_ITERATOR_TYPE)
16962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSTypedArray, JS_TYPED_ARRAY_TYPE)
17062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSValue, JS_VALUE_TYPE)
17162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE)
17262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(JSWeakSet, JS_WEAK_SET_TYPE)
17362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(Map, MAP_TYPE)
17462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(MutableHeapNumber, MUTABLE_HEAP_NUMBER_TYPE)
17562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(Oddball, ODDBALL_TYPE)
17662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(PropertyCell, PROPERTY_CELL_TYPE)
17762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE)
17862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(Symbol, SYMBOL_TYPE)
17962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(TransitionArray, TRANSITION_ARRAY_TYPE)
18062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(WeakCell, WEAK_CELL_TYPE)
18162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPE_CHECKER(WeakFixedArray, FIXED_ARRAY_TYPE)
18262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
18362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define TYPED_ARRAY_TYPE_CHECKER(Type, type, TYPE, ctype, size) \
18462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  TYPE_CHECKER(Fixed##Type##Array, FIXED_##TYPE##_ARRAY_TYPE)
18562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochTYPED_ARRAYS(TYPED_ARRAY_TYPE_CHECKER)
18662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef TYPED_ARRAY_TYPE_CHECKER
18762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
18862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef TYPE_CHECKER
18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
190109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsFixedArrayBase() const {
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase();
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
194109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsFixedArray() const {
195109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  InstanceType instance_type = map()->instance_type();
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instance_type == FIXED_ARRAY_TYPE ||
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         instance_type == TRANSITION_ARRAY_TYPE;
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsBoilerplateDescription() const { return IsFixedArray(); }
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// External objects are not extensible, so the map check is enough.
203109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsExternal() const {
204109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return map() == GetHeap()->external_map();
2053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
207109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define IS_TYPE_FUNCTION_DEF(type_)                               \
208109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool Object::Is##type_() const {                                \
209109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return IsHeapObject() && HeapObject::cast(this)->Is##type_(); \
210109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
211109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DEF)
21213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef IS_TYPE_FUNCTION_DEF
21313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
21413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DEF(Type, Value)             \
21513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool Object::Is##Type(Isolate* isolate) const {     \
21613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return this == isolate->heap()->Value();          \
21713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }                                                   \
21813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool HeapObject::Is##Type(Isolate* isolate) const { \
21913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return this == isolate->heap()->Value();          \
22013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
221109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochODDBALL_LIST(IS_TYPE_FUNCTION_DEF)
222109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef IS_TYPE_FUNCTION_DEF
2233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsNullOrUndefined(Isolate* isolate) const {
22562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Heap* heap = isolate->heap();
22662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return this == heap->null_value() || this == heap->undefined_value();
22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
22862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
22962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsNullOrUndefined(Isolate* isolate) const {
23062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Heap* heap = isolate->heap();
23162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return this == heap->null_value() || this == heap->undefined_value();
23262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
23362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
234109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsString() const {
235109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return map()->instance_type() < FIRST_NONSTRING_TYPE;
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
238109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsName() const {
239109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return map()->instance_type() <= LAST_NAME_TYPE;
240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
242109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsUniqueName() const {
243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsInternalizedString() || IsSymbol();
244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
246109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Name::IsUniqueName() const {
247109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  uint32_t type = map()->instance_type();
248109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return (type & (kIsNotStringMask | kIsNotInternalizedMask)) !=
249109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch         (kStringTag | kNotInternalizedTag);
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
252109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsFunction() const {
253109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  STATIC_ASSERT(LAST_FUNCTION_TYPE == LAST_TYPE);
254109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return map()->instance_type() >= FIRST_FUNCTION_TYPE;
255f2e3994fa5148cc3d9946666f0b0596290192b0eBen Murdoch}
256f2e3994fa5148cc3d9946666f0b0596290192b0eBen Murdoch
257109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsCallable() const { return map()->is_callable(); }
258f2e3994fa5148cc3d9946666f0b0596290192b0eBen Murdoch
259109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsConstructor() const { return map()->is_constructor(); }
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
261109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsTemplateInfo() const {
262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsObjectTemplateInfo() || IsFunctionTemplateInfo();
263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
265109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsInternalizedString() const {
266109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  uint32_t type = map()->instance_type();
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  STATIC_ASSERT(kNotInternalizedTag != 0);
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return (type & (kIsNotStringMask | kIsNotInternalizedMask)) ==
269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      (kStringTag | kInternalizedTag);
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
272109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsConsString() const {
27369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!IsString()) return false;
27469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return StringShape(String::cast(this)).IsCons();
27569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
27669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
27762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsThinString() const {
27862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!IsString()) return false;
27962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return StringShape(String::cast(this)).IsThin();
28062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
28162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
282109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsSlicedString() const {
28369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!IsString()) return false;
28469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return StringShape(String::cast(this)).IsSliced();
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
287109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsSeqString() const {
288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential();
290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
292109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsSeqOneByteString() const {
293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential() &&
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         String::cast(this)->IsOneByteRepresentation();
296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
298109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsSeqTwoByteString() const {
299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsSequential() &&
301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsTwoByteRepresentation();
302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
304109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsExternalString() const {
305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal();
307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
309109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsExternalOneByteString() const {
310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal() &&
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         String::cast(this)->IsOneByteRepresentation();
313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
315109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool HeapObject::IsExternalTwoByteString() const {
316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (!IsString()) return false;
317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return StringShape(String::cast(this)).IsExternal() &&
318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block         String::cast(this)->IsTwoByteRepresentation();
319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsNumber() const { return IsSmi() || IsHeapNumber(); }
322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsFiller() const {
32462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  InstanceType instance_type = map()->instance_type();
32562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE;
326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsFixedTypedArrayBase() const {
32962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  InstanceType instance_type = map()->instance_type();
33062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
33162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE);
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsJSReceiver() const {
33562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
33662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map()->instance_type() >= FIRST_JS_RECEIVER_TYPE;
337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsJSObject() const {
34062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE);
34162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map()->IsJSObjectMap();
3423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
34462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsJSProxy() const { return map()->IsJSProxyMap(); }
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsJSArrayIterator() const {
34762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  InstanceType instance_type = map()->instance_type();
34862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (instance_type >= FIRST_ARRAY_ITERATOR_TYPE &&
34962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          instance_type <= LAST_ARRAY_ITERATOR_TYPE);
350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsJSWeakCollection() const {
35362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsJSWeakMap() || IsJSWeakSet();
354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsJSCollection() const { return IsJSMap() || IsJSSet(); }
357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsDescriptorArray() const { return IsFixedArray(); }
359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsFrameArray() const { return IsFixedArray(); }
361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsArrayList() const { return IsFixedArray(); }
363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsRegExpMatchInfo() const { return IsFixedArray(); }
365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsLayoutDescriptor() const {
36762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsSmi() || IsFixedTypedArrayBase();
368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsFeedbackVector() const {
37162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map() == GetHeap()->feedback_vector_map();
372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsFeedbackMetadata() const { return IsFixedArray(); }
375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsDeoptimizationInputData() const {
37762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Must be a fixed array.
37862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!IsFixedArray()) return false;
37969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
38062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // There's no sure way to detect the difference between a fixed array and
38162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // a deoptimization data array.  Since this is used for asserts we can
38262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // check that the length is zero or else the fixed size plus a multiple of
38362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // the entry size.
38462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int length = FixedArray::cast(this)->length();
38562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (length == 0) return true;
38669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
38762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  length -= DeoptimizationInputData::kFirstDeoptEntryIndex;
38862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return length >= 0 && length % DeoptimizationInputData::kDeoptEntrySize == 0;
38969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
39069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
39162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsDeoptimizationOutputData() const {
39262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!IsFixedArray()) return false;
39362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // There's actually no way to see the difference between a fixed array and
39462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // a deoptimization data array.  Since this is used for asserts we can check
39562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // that the length is plausible though.
39662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (FixedArray::cast(this)->length() % 2 != 0) return false;
39762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return true;
3986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
3996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
40062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsHandlerTable() const {
40162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!IsFixedArray()) return false;
40262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // There's actually no way to see the difference between a fixed array and
40362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // a handler table array.
40462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return true;
405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsTemplateList() const {
40862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!IsFixedArray()) return false;
40962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // There's actually no way to see the difference between a fixed array and
41062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // a template list.
41162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (FixedArray::cast(this)->length() < 1) return false;
41262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return true;
41369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
41469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
41562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsDependentCode() const {
41662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!IsFixedArray()) return false;
41762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // There's actually no way to see the difference between a fixed array and
41862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // a dependent codes array.
41962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return true;
42069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
42169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
42262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsContext() const {
42362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Map* map = this->map();
42462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Heap* heap = GetHeap();
42562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (
42662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      map == heap->function_context_map() || map == heap->catch_context_map() ||
42762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      map == heap->with_context_map() || map == heap->native_context_map() ||
42862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      map == heap->block_context_map() || map == heap->module_context_map() ||
42962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      map == heap->eval_context_map() || map == heap->script_context_map() ||
43062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      map == heap->debug_evaluate_context_map());
431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsNativeContext() const {
43462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map() == GetHeap()->native_context_map();
435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsScriptContextTable() const {
43862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map() == GetHeap()->script_context_table_map();
439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsScopeInfo() const {
44262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map() == GetHeap()->scope_info_map();
44369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
44469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
44562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsModuleInfo() const {
44662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map() == GetHeap()->module_info_map();
447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <>
45062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochinline bool Is<JSFunction>(Object* obj) {
45162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return obj->IsJSFunction();
452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsAbstractCode() const {
45562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsBytecodeArray() || IsCode();
456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
45862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsStringWrapper() const {
45962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsJSValue() && JSValue::cast(this)->value()->IsString();
46062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsBoolean() const {
46362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsOddball() &&
46462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0);
465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsJSArrayBufferView() const {
46862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsJSDataView() || IsJSTypedArray();
46962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
47162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <>
47262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochinline bool Is<JSArray>(Object* obj) {
47362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return obj->IsJSArray();
47462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsHashTable() const {
47762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map() == GetHeap()->hash_table_map();
47862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsWeakHashTable() const { return IsHashTable(); }
481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
48262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsDictionary() const {
48362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsHashTable() && this != GetHeap()->string_table();
484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
48662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsNameDictionary() const { return IsDictionary(); }
487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
48862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsGlobalDictionary() const { return IsDictionary(); }
489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsSeededNumberDictionary() const { return IsDictionary(); }
491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
49262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsUnseededNumberDictionary() const {
49362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map() == GetHeap()->unseeded_number_dictionary_map();
494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsStringTable() const { return IsHashTable(); }
497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsStringSet() const { return IsHashTable(); }
499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsObjectHashSet() const { return IsHashTable(); }
501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsNormalizedMapCache() const {
50362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return NormalizedMapCache::IsNormalizedMapCache(this);
504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochint NormalizedMapCache::GetIndex(Handle<Map> map) {
50762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map->Hash() % NormalizedMapCache::kEntries;
50885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch}
509592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
51062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool NormalizedMapCache::IsNormalizedMapCache(const HeapObject* obj) {
51162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!obj->IsFixedArray()) return false;
51262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (FixedArray::cast(obj)->length() != NormalizedMapCache::kEntries) {
51362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return false;
51462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
51562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifdef VERIFY_HEAP
51662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (FLAG_verify_heap) {
51762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    reinterpret_cast<NormalizedMapCache*>(const_cast<HeapObject*>(obj))
51862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        ->NormalizedMapCacheVerify();
51962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
52062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif
52162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return true;
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
52462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsCompilationCacheTable() const { return IsHashTable(); }
5253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
52662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsCodeCacheHashTable() const { return IsHashTable(); }
5273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
52862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsMapCache() const { return IsHashTable(); }
529257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
53062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsObjectHashTable() const { return IsHashTable(); }
531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
53262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsOrderedHashTable() const {
53362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map() == GetHeap()->ordered_hash_table_map();
53462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsOrderedHashSet() const { return IsOrderedHashTable(); }
537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsOrderedHashMap() const { return IsOrderedHashTable(); }
539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
54062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsPrimitive() const {
54162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsSmi() || HeapObject::cast(this)->map()->IsPrimitiveMap();
54262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
54462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsJSGlobalProxy() const {
54562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool result = map()->instance_type() == JS_GLOBAL_PROXY_TYPE;
54662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(!result || map()->is_access_check_needed());
54762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return result;
54862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
55062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsUndetectable() const { return map()->is_undetectable(); }
551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
55262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsAccessCheckNeeded() const {
55362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (IsJSGlobalProxy()) {
55462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    const JSGlobalProxy* proxy = JSGlobalProxy::cast(this);
55562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    JSGlobalObject* global = proxy->GetIsolate()->context()->global_object();
55662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return proxy->IsDetachedFrom(global);
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
55862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return map()->is_access_check_needed();
55962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
56162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HeapObject::IsStruct() const {
56262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (map()->instance_type()) {
56362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define MAKE_STRUCT_CASE(NAME, Name, name) \
56462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  case NAME##_TYPE:                        \
56562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return true;
56662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    STRUCT_LIST(MAKE_STRUCT_CASE)
56762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef MAKE_STRUCT_CASE
56862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    default:
56962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return false;
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
57162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
57362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define MAKE_STRUCT_PREDICATE(NAME, Name, name)                  \
57462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool Object::Is##Name() const {                                \
57562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return IsHeapObject() && HeapObject::cast(this)->Is##Name(); \
57662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }                                                              \
57762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool HeapObject::Is##Name() const {                            \
57862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return map()->instance_type() == NAME##_TYPE;                \
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
58062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTRUCT_LIST(MAKE_STRUCT_PREDICATE)
58162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef MAKE_STRUCT_PREDICATE
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochdouble Object::Number() const {
58462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(IsNumber());
58562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsSmi()
58662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch             ? static_cast<double>(reinterpret_cast<const Smi*>(this)->value())
58762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch             : reinterpret_cast<const HeapNumber*>(this)->value();
58862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsNaN() const {
59162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return this->IsHeapNumber() && std::isnan(HeapNumber::cast(this)->value());
59262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::IsMinusZero() const {
59562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return this->IsHeapNumber() &&
59662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         i::IsMinusZero(HeapNumber::cast(this)->value());
59762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// ------------------------------------
60062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Cast operations
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
60262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CAST_ACCESSOR(type)                       \
60362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  type* type::cast(Object* object) {              \
60462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    SLOW_DCHECK(object->Is##type());              \
60562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return reinterpret_cast<type*>(object);       \
60662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }                                               \
60762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const type* type::cast(const Object* object) {  \
60862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    SLOW_DCHECK(object->Is##type());              \
60962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return reinterpret_cast<const type*>(object); \
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
61262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(AbstractCode)
61362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ArrayList)
61462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(BoilerplateDescription)
61562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ByteArray)
61662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(BytecodeArray)
61762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Cell)
61862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Code)
61962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(CodeCacheHashTable)
62062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(CompilationCacheTable)
62162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ConsString)
62262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(DeoptimizationInputData)
62362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(DeoptimizationOutputData)
62462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(DependentCode)
62562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(DescriptorArray)
62662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ExternalOneByteString)
62762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ExternalString)
62862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ExternalTwoByteString)
62962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(FixedArray)
63062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(FixedArrayBase)
63162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(FixedDoubleArray)
63262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(FixedTypedArrayBase)
63362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Foreign)
63462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(FrameArray)
63562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(GlobalDictionary)
63662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(HandlerTable)
63762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(HeapObject)
63862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSArray)
63962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSArrayBuffer)
64062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSArrayBufferView)
64162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSBoundFunction)
64262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSDataView)
64362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSDate)
64462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSFunction)
64562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSGeneratorObject)
64662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSGlobalObject)
64762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSGlobalProxy)
64862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSMap)
64962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSMapIterator)
65062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSMessageObject)
65162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSModuleNamespace)
65262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSObject)
65362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSProxy)
65462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSReceiver)
65562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSRegExp)
65662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSPromiseCapability)
65762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSPromise)
65862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSSet)
65962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSSetIterator)
66062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSAsyncFromSyncIterator)
66162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSStringIterator)
66262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSArrayIterator)
66362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSTypedArray)
66462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSValue)
66562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSWeakCollection)
66662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSWeakMap)
66762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(JSWeakSet)
66862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(LayoutDescriptor)
66962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Map)
67062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ModuleInfo)
67162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Name)
67262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(NameDictionary)
67362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(NormalizedMapCache)
67462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Object)
67562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ObjectHashTable)
67662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ObjectHashSet)
67762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Oddball)
67862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(OrderedHashMap)
67962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(OrderedHashSet)
68062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(PropertyCell)
68162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(TemplateList)
68262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(RegExpMatchInfo)
68362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ScopeInfo)
68462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(SeededNumberDictionary)
68562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(SeqOneByteString)
68662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(SeqString)
68762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(SeqTwoByteString)
68862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(SharedFunctionInfo)
68962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(SlicedString)
69062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Smi)
69162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(String)
69262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(StringSet)
69362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(StringTable)
69462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Struct)
69562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(Symbol)
69662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(TemplateInfo)
69762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(ThinString)
69862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(UnseededNumberDictionary)
69962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(WeakCell)
70062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(WeakFixedArray)
70162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCAST_ACCESSOR(WeakHashTable)
702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
70362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name)
70462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTRUCT_LIST(MAKE_STRUCT_CAST)
70562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef MAKE_STRUCT_CAST
706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
70762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef CAST_ACCESSOR
708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
70962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::HasValidElements() {
71062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Dictionary is covered under FixedArray.
71162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsFixedArray() || IsFixedDoubleArray() || IsFixedTypedArrayBase();
712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
71462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::KeyEquals(Object* second) {
71562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Object* first = this;
71662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (second->IsNumber()) {
71762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (first->IsNumber()) return first->Number() == second->Number();
71862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Object* temp = first;
71962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    first = second;
72062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    second = temp;
72162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
72262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (first->IsNumber()) {
72362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK_LE(0, first->Number());
72462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    uint32_t expected = static_cast<uint32_t>(first->Number());
72562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    uint32_t index;
72662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return Name::cast(second)->AsArrayIndex(&index) && index == expected;
72762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
72862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return Name::cast(first)->Equals(Name::cast(second));
729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
73162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Object::FilterKey(PropertyFilter filter) {
73262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (IsSymbol()) {
73362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (filter & SKIP_SYMBOLS) return true;
73462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (Symbol::cast(this)->is_private()) return true;
73562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
73662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (filter & SKIP_STRINGS) return true;
73762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
73862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return false;
739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
74162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Object> Object::NewStorageFor(Isolate* isolate, Handle<Object> object,
74262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                     Representation representation) {
74362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!representation.IsDouble()) return object;
74462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<HeapNumber> result = isolate->factory()->NewHeapNumber(MUTABLE);
74562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (object->IsUninitialized(isolate)) {
74662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    result->set_value_as_bits(kHoleNanInt64);
74762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else if (object->IsMutableHeapNumber()) {
74862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Ensure that all bits of the double value are preserved.
74962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    result->set_value_as_bits(HeapNumber::cast(*object)->value_as_bits());
75062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
75162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    result->set_value(object->Number());
75262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
75362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return result;
754f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
755f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
75662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Object> Object::WrapForRead(Isolate* isolate, Handle<Object> object,
75762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                   Representation representation) {
75862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(!object->IsUninitialized(isolate));
75962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!representation.IsDouble()) {
76062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(object->FitsRepresentation(representation));
76162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return object;
76262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
76362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return isolate->factory()->NewHeapNumber(HeapNumber::cast(*object)->value());
7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
76662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochStringShape::StringShape(const String* str)
76762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    : type_(str->map()->instance_type()) {
76862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set_valid();
76962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK((type_ & kIsNotStringMask) == kStringTag);
770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
77262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochStringShape::StringShape(Map* map) : type_(map->instance_type()) {
77362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set_valid();
77462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK((type_ & kIsNotStringMask) == kStringTag);
775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
77762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochStringShape::StringShape(InstanceType t) : type_(static_cast<uint32_t>(t)) {
77862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set_valid();
77962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK((type_ & kIsNotStringMask) == kStringTag);
780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
78262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsInternalized() {
78362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(valid());
78462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(kNotInternalizedTag != 0);
78562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type_ & (kIsNotStringMask | kIsNotInternalizedMask)) ==
78662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         (kStringTag | kInternalizedTag);
78769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
78869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
78962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool String::IsOneByteRepresentation() const {
79062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t type = map()->instance_type();
79162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type & kStringEncodingMask) == kOneByteStringTag;
792f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
79369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
79462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool String::IsTwoByteRepresentation() const {
79562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t type = map()->instance_type();
79662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type & kStringEncodingMask) == kTwoByteStringTag;
797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool String::IsOneByteRepresentationUnderneath() {
80062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t type = map()->instance_type();
80162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(kIsIndirectStringTag != 0);
80262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
80362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(IsFlat());
80462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
80562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case kOneByteStringTag:
80662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return true;
80762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case kTwoByteStringTag:
80862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return false;
80962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    default:  // Cons or sliced string.  Need to go deeper.
81062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return GetUnderlying()->IsOneByteRepresentation();
81162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
812109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
81462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool String::IsTwoByteRepresentationUnderneath() {
81562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t type = map()->instance_type();
81662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(kIsIndirectStringTag != 0);
81762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
81862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(IsFlat());
81962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
82062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case kOneByteStringTag:
82162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return false;
82262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case kTwoByteStringTag:
82362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return true;
82462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    default:  // Cons or sliced string.  Need to go deeper.
82562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return GetUnderlying()->IsTwoByteRepresentation();
82662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
82962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool String::HasOnlyOneByteChars() {
83062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t type = map()->instance_type();
83162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type & kOneByteDataHintMask) == kOneByteDataHintTag ||
83262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         IsOneByteRepresentation();
833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
83562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsCons() {
83662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type_ & kStringRepresentationMask) == kConsStringTag;
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
83962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsThin() {
84062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type_ & kStringRepresentationMask) == kThinStringTag;
841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
84362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsSliced() {
84462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type_ & kStringRepresentationMask) == kSlicedStringTag;
845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
84762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsIndirect() {
84862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type_ & kIsIndirectStringMask) == kIsIndirectStringTag;
84962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
85162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsExternal() {
85262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type_ & kStringRepresentationMask) == kExternalStringTag;
853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
85562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsSequential() {
85662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type_ & kStringRepresentationMask) == kSeqStringTag;
85762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
85962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochStringRepresentationTag StringShape::representation_tag() {
86062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t tag = (type_ & kStringRepresentationMask);
86162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return static_cast<StringRepresentationTag>(tag);
862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
86462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint32_t StringShape::encoding_tag() { return type_ & kStringEncodingMask; }
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
86662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint32_t StringShape::full_representation_tag() {
86762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (type_ & (kStringRepresentationMask | kStringEncodingMask));
86862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
86962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
87062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTATIC_ASSERT((kStringRepresentationMask | kStringEncodingMask) ==
87162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              Internals::kFullStringRepresentationMask);
872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
87362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTATIC_ASSERT(static_cast<uint32_t>(kStringEncodingMask) ==
87462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              Internals::kStringEncodingMask);
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
87662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsSequentialOneByte() {
87762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return full_representation_tag() == (kSeqStringTag | kOneByteStringTag);
878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
88062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsSequentialTwoByte() {
88162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return full_representation_tag() == (kSeqStringTag | kTwoByteStringTag);
882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
88462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsExternalOneByte() {
88562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return full_representation_tag() == (kExternalStringTag | kOneByteStringTag);
88662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
88862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTATIC_ASSERT((kExternalStringTag | kOneByteStringTag) ==
88962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              Internals::kExternalOneByteRepresentationTag);
8903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
89162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTATIC_ASSERT(v8::String::ONE_BYTE_ENCODING == kOneByteStringTag);
892f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
89362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringShape::IsExternalTwoByte() {
89462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag);
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
89762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTATIC_ASSERT((kExternalStringTag | kTwoByteStringTag) ==
89862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              Internals::kExternalTwoByteRepresentationTag);
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
90062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTATIC_ASSERT(v8::String::TWO_BYTE_ENCODING == kTwoByteStringTag);
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
90262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuc32 FlatStringReader::Get(int index) {
90362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (is_one_byte_) {
90462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return Get<uint8_t>(index);
90562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
90662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return Get<uc16>(index);
9073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
90880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}
90980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen
91062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename Char>
91162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochChar FlatStringReader::Get(int index) {
91262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(is_one_byte_, sizeof(Char) == 1);
91362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(0 <= index && index <= length_);
91462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (sizeof(Char) == 1) {
91562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return static_cast<Char>(static_cast<const uint8_t*>(start_)[index]);
91662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
91762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return static_cast<Char>(static_cast<const uc16*>(start_)[index]);
91862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
91962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
9206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
92162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Object> StringTableShape::AsHandle(Isolate* isolate, HashTableKey* key) {
92262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return key->AsHandle(isolate);
923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
92562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Object> CompilationCacheShape::AsHandle(Isolate* isolate,
92662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                               HashTableKey* key) {
92762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return key->AsHandle(isolate);
92862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
93062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Object> CodeCacheHashTableShape::AsHandle(Isolate* isolate,
93162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                 HashTableKey* key) {
93262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return key->AsHandle(isolate);
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
93562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename Char>
93662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass SequentialStringKey : public HashTableKey {
93762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
93862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  explicit SequentialStringKey(Vector<const Char> string, uint32_t seed)
93962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : string_(string), hash_field_(0), seed_(seed) {}
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t Hash() override {
94262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    hash_field_ = StringHasher::HashSequentialString<Char>(
94362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        string_.start(), string_.length(), seed_);
944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    uint32_t result = hash_field_ >> String::kHashShift;
94662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(result != 0);  // Ensure that the hash value of 0 is never computed.
94762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return result;
94862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t HashForObject(Object* other) override {
95162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return String::cast(other)->Hash();
95262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
95462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Vector<const Char> string_;
95562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t hash_field_;
95662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t seed_;
95762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
95962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass OneByteStringKey : public SequentialStringKey<uint8_t> {
96062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
96162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  OneByteStringKey(Vector<const uint8_t> str, uint32_t seed)
96262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : SequentialStringKey<uint8_t>(str, seed) {}
963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
96462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool IsMatch(Object* string) override {
96562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return String::cast(string)->IsOneByteEqualTo(string_);
96662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
96862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Object> AsHandle(Isolate* isolate) override;
96962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
97162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass SeqOneByteSubStringKey : public HashTableKey {
97262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
97362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  SeqOneByteSubStringKey(Handle<SeqOneByteString> string, int from, int length)
97462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : string_(string), from_(from), length_(length) {
97562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(string_->IsSeqOneByteString());
976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
97862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t Hash() override {
97962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(length_ >= 0);
98062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(from_ + length_ <= string_->length());
98162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    const uint8_t* chars = string_->GetChars() + from_;
98262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    hash_field_ = StringHasher::HashSequentialString(
98362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        chars, length_, string_->GetHeap()->HashSeed());
98462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    uint32_t result = hash_field_ >> String::kHashShift;
98562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(result != 0);  // Ensure that the hash value of 0 is never computed.
98662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return result;
987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
98962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t HashForObject(Object* other) override {
99062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return String::cast(other)->Hash();
991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
99362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool IsMatch(Object* string) override;
99462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Object> AsHandle(Isolate* isolate) override;
995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
99662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private:
99762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<SeqOneByteString> string_;
99862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int from_;
99962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int length_;
100062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t hash_field_;
100162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
100362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass TwoByteStringKey : public SequentialStringKey<uc16> {
100462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
100562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed)
100662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : SequentialStringKey<uc16>(str, seed) {}
10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
100862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool IsMatch(Object* string) override {
100962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return String::cast(string)->IsTwoByteEqualTo(string_);
101062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
10113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
101262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Object> AsHandle(Isolate* isolate) override;
101362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
101462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
101562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Utf8StringKey carries a vector of chars as key.
101662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Utf8StringKey : public HashTableKey {
101762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public:
101862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  explicit Utf8StringKey(Vector<const char> string, uint32_t seed)
101962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : string_(string), hash_field_(0), seed_(seed) {}
102062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
102162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool IsMatch(Object* string) override {
102262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return String::cast(string)->IsUtf8EqualTo(string_);
102362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
102462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
102562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t Hash() override {
102662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (hash_field_ != 0) return hash_field_ >> String::kHashShift;
102762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_);
102862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    uint32_t result = hash_field_ >> String::kHashShift;
102962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(result != 0);  // Ensure that the hash value of 0 is never computed.
103062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return result;
103162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
103262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
103362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t HashForObject(Object* other) override {
103462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return String::cast(other)->Hash();
103562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
103662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
103762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Object> AsHandle(Isolate* isolate) override {
103862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (hash_field_ == 0) Hash();
103962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return isolate->factory()->NewInternalizedStringFromUtf8(string_, chars_,
104062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                             hash_field_);
104162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Vector<const char> string_;
104462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t hash_field_;
104562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int chars_;  // Caches the number of characters when computing the hash code.
104662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t seed_;
104762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch};
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRepresentation Object::OptimalRepresentation() {
1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!FLAG_track_fields) return Representation::Tagged();
1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (IsSmi()) {
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Representation::Smi();
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (FLAG_track_double_fields && IsHeapNumber()) {
1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Representation::Double();
105513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } else if (FLAG_track_computed_fields &&
105613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch             IsUninitialized(HeapObject::cast(this)->GetIsolate())) {
1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Representation::None();
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (FLAG_track_heap_object_fields) {
1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(IsHeapObject());
1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Representation::HeapObject();
1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Representation::Tagged();
1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochElementsKind Object::OptimalElementsKind() {
1068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (IsSmi()) return FAST_SMI_ELEMENTS;
1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (IsNumber()) return FAST_DOUBLE_ELEMENTS;
1070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return FAST_ELEMENTS;
1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Object::FitsRepresentation(Representation representation) {
1075109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (FLAG_track_fields && representation.IsSmi()) {
1076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return IsSmi();
1077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (FLAG_track_double_fields && representation.IsDouble()) {
1078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return IsMutableHeapNumber() || IsNumber();
1079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (FLAG_track_heap_object_fields && representation.IsHeapObject()) {
1080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return IsHeapObject();
1081109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  } else if (FLAG_track_fields && representation.IsNone()) {
1082109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return false;
1083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return true;
1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
10873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Object::ToUint32(uint32_t* value) {
10883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (IsSmi()) {
10893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int num = Smi::cast(this)->value();
10903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (num < 0) return false;
10913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    *value = static_cast<uint32_t>(num);
10923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return true;
10933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
10943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (IsHeapNumber()) {
10953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    double num = HeapNumber::cast(this)->value();
109662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return DoubleToUint32IfEqualToSelf(num, value);
10973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
10983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return false;
10993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybeHandle<JSReceiver> Object::ToObject(Isolate* isolate,
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         Handle<Object> object) {
1104109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (object->IsJSReceiver()) return Handle<JSReceiver>::cast(object);
1105109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return ToObject(isolate, object, isolate->native_context());
1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
11103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochMaybeHandle<Name> Object::ToName(Isolate* isolate, Handle<Object> input) {
11113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (input->IsName()) return Handle<Name>::cast(input);
11123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return ConvertToName(isolate, input);
11133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
11143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
11153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// static
111662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Object> Object::ToPropertyKey(Isolate* isolate,
111762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                          Handle<Object> value) {
111862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (value->IsSmi() || HeapObject::cast(*value)->IsName()) return value;
111962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return ConvertToPropertyKey(isolate, value);
112062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
112162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
112262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
112362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Object> Object::ToPrimitive(Handle<Object> input,
112462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                        ToPrimitiveHint hint) {
112562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (input->IsPrimitive()) return input;
112662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(input), hint);
112762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
112862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
112962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
113062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Object> Object::ToNumber(Handle<Object> input) {
113162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (input->IsNumber()) return input;
113262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return ConvertToNumber(HeapObject::cast(*input)->GetIsolate(), input);
113362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
113462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
113562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
113662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Object> Object::ToInteger(Isolate* isolate, Handle<Object> input) {
113762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (input->IsSmi()) return input;
113862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return ConvertToInteger(isolate, input);
113962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
114062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
114162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
114262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Object> Object::ToInt32(Isolate* isolate, Handle<Object> input) {
114362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (input->IsSmi()) return input;
114462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return ConvertToInt32(isolate, input);
114562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
114662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
114762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
114862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Object> Object::ToUint32(Isolate* isolate, Handle<Object> input) {
114962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (input->IsSmi()) return handle(Smi::cast(*input)->ToUint32Smi(), isolate);
115062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return ConvertToUint32(isolate, input);
115162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
115262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
115362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
115462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<String> Object::ToString(Isolate* isolate, Handle<Object> input) {
115562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (input->IsString()) return Handle<String>::cast(input);
115662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return ConvertToString(isolate, input);
115762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
115862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
115962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
116062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Object> Object::ToLength(Isolate* isolate, Handle<Object> input) {
116162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (input->IsSmi()) {
116262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    int value = std::max(Smi::cast(*input)->value(), 0);
116362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return handle(Smi::FromInt(value), isolate);
116462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
116562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return ConvertToLength(isolate, input);
116662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
116762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
116862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
116962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Object> Object::ToIndex(Isolate* isolate, Handle<Object> input,
117062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                    MessageTemplate::Template error_index) {
117162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (input->IsSmi() && Smi::cast(*input)->value() >= 0) return input;
117262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return ConvertToIndex(isolate, input, error_index);
1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Object::HasSpecificClassOf(String* name) {
1176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return this->IsJSObject() && (JSObject::cast(this)->class_name() == name);
1177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybeHandle<Object> Object::GetProperty(Handle<Object> object,
1180109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                        Handle<Name> name) {
1181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it(object, name);
11823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!it.IsFound()) return it.factory()->undefined_value();
1183109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return GetProperty(&it);
1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
11863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochMaybeHandle<Object> JSReceiver::GetProperty(Handle<JSReceiver> receiver,
11873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                            Handle<Name> name) {
11883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it(receiver, name, receiver);
11893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!it.IsFound()) return it.factory()->undefined_value();
11903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return Object::GetProperty(&it);
11913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
11923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybeHandle<Object> Object::GetElement(Isolate* isolate, Handle<Object> object,
1194109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                       uint32_t index) {
1195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it(isolate, object, index);
11963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!it.IsFound()) return it.factory()->undefined_value();
1197109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return GetProperty(&it);
1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochMaybeHandle<Object> JSReceiver::GetElement(Isolate* isolate,
12013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                           Handle<JSReceiver> receiver,
12023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                           uint32_t index) {
12033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it(isolate, receiver, index, receiver);
12043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!it.IsFound()) return it.factory()->undefined_value();
12053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return Object::GetProperty(&it);
12063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
12073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
12083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochHandle<Object> JSReceiver::GetDataProperty(Handle<JSReceiver> object,
12093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                           Handle<Name> name) {
12103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it(object, name, object,
12113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                    LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
12123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!it.IsFound()) return it.factory()->undefined_value();
12133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return GetDataProperty(&it);
12143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybeHandle<Object> Object::SetElement(Isolate* isolate, Handle<Object> object,
1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       uint32_t index, Handle<Object> value,
1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                       LanguageMode language_mode) {
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it(isolate, object, index);
1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MAYBE_RETURN_NULL(
1221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      SetProperty(&it, value, language_mode, MAY_BE_STORE_FROM_KEYED));
1222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return value;
12235913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck}
12245913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck
1225109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochMaybeHandle<Object> JSReceiver::GetPrototype(Isolate* isolate,
1226109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                             Handle<JSReceiver> receiver) {
1227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // We don't expect access checks to be needed on JSProxy objects.
1228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!receiver->IsAccessCheckNeeded() || receiver->IsJSObject());
122913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  PrototypeIterator iter(isolate, receiver, kStartAtReceiver,
1230109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                         PrototypeIterator::END_AT_NON_HIDDEN);
1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  do {
1232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!iter.AdvanceFollowingProxies()) return MaybeHandle<Object>();
1233109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  } while (!iter.IsAtEnd());
1234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return PrototypeIterator::GetCurrent(iter);
1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochMaybeHandle<Object> JSReceiver::GetProperty(Isolate* isolate,
12383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                            Handle<JSReceiver> receiver,
12393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                            const char* name) {
1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<String> str = isolate->factory()->InternalizeUtf8String(name);
12413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return GetProperty(receiver, str);
1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
124413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// static
124513e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochMUST_USE_RESULT MaybeHandle<FixedArray> JSReceiver::OwnPropertyKeys(
124613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Handle<JSReceiver> object) {
124713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return KeyAccumulator::GetKeys(object, KeyCollectionMode::kOwnOnly,
124813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                 ALL_PROPERTIES,
124913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                 GetKeysConversion::kConvertToString);
125013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
1251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool JSObject::PrototypeHasNoElements(Isolate* isolate, JSObject* object) {
1253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DisallowHeapAllocation no_gc;
1254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  HeapObject* prototype = HeapObject::cast(object->map()->prototype());
1255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  HeapObject* null = isolate->heap()->null_value();
1256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  HeapObject* empty = isolate->heap()->empty_fixed_array();
1257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  while (prototype != null) {
1258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Map* map = prototype->map();
1259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (map->instance_type() <= LAST_CUSTOM_ELEMENTS_RECEIVER) return false;
1260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (JSObject::cast(prototype)->elements() != empty) return false;
1261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    prototype = HeapObject::cast(map->prototype());
1262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
1263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return true;
1264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
1265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define FIELD_ADDR(p, offset) \
1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag)
1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIELD_ADDR_CONST(p, offset) \
1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (reinterpret_cast<const byte*>(p) + offset - kHeapObjectTag)
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_FIELD(p, offset) \
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (*reinterpret_cast<Object* const*>(FIELD_ADDR_CONST(p, offset)))
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ACQUIRE_READ_FIELD(p, offset)           \
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  reinterpret_cast<Object*>(base::Acquire_Load( \
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<const base::AtomicWord*>(FIELD_ADDR_CONST(p, offset))))
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NOBARRIER_READ_FIELD(p, offset)           \
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  reinterpret_cast<Object*>(base::NoBarrier_Load( \
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<const base::AtomicWord*>(FIELD_ADDR_CONST(p, offset))))
1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_FIELD(p, offset, value) \
1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value)
1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RELEASE_WRITE_FIELD(p, offset, value)                     \
1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::Release_Store(                                            \
1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset)), \
1289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<base::AtomicWord>(value));
1290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NOBARRIER_WRITE_FIELD(p, offset, value)                   \
1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::NoBarrier_Store(                                          \
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<base::AtomicWord*>(FIELD_ADDR(p, offset)), \
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<base::AtomicWord>(value));
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1296109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define WRITE_BARRIER(heap, object, offset, value)          \
1297109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  heap->incremental_marking()->RecordWrite(                 \
1298109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      object, HeapObject::RawField(object, offset), value); \
1299109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  heap->RecordWrite(object, offset, value);
13003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1301bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define FIXED_ARRAY_ELEMENTS_WRITE_BARRIER(heap, array, start, length) \
1302bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  do {                                                                 \
1303bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    heap->RecordFixedArrayElements(array, start, length);              \
1304bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    heap->incremental_marking()->IterateBlackObject(array);            \
1305bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  } while (false)
1306bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \
1308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (mode != SKIP_WRITE_BARRIER) {                                  \
1309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (mode == UPDATE_WRITE_BARRIER) {                              \
1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      heap->incremental_marking()->RecordWrite(                      \
1311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          object, HeapObject::RawField(object, offset), value);      \
1312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }                                                                \
1313109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    heap->RecordWrite(object, offset, value);                        \
1314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define READ_DOUBLE_FIELD(p, offset) \
1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ReadDoubleValue(FIELD_ADDR_CONST(p, offset))
1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define WRITE_DOUBLE_FIELD(p, offset, value) \
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WriteDoubleValue(FIELD_ADDR(p, offset), value)
1321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INT_FIELD(p, offset) \
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (*reinterpret_cast<const int*>(FIELD_ADDR_CONST(p, offset)))
1324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INT_FIELD(p, offset, value) \
1326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value)
1327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INTPTR_FIELD(p, offset) \
1329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (*reinterpret_cast<const intptr_t*>(FIELD_ADDR_CONST(p, offset)))
1330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INTPTR_FIELD(p, offset, value) \
1332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value)
1333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define READ_UINT8_FIELD(p, offset) \
1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<const uint8_t*>(FIELD_ADDR_CONST(p, offset)))
1336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define WRITE_UINT8_FIELD(p, offset, value) \
1338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<uint8_t*>(FIELD_ADDR(p, offset)) = value)
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define READ_INT8_FIELD(p, offset) \
1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<const int8_t*>(FIELD_ADDR_CONST(p, offset)))
1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define WRITE_INT8_FIELD(p, offset, value) \
1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<int8_t*>(FIELD_ADDR(p, offset)) = value)
1345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define READ_UINT16_FIELD(p, offset) \
1347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<const uint16_t*>(FIELD_ADDR_CONST(p, offset)))
1348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define WRITE_UINT16_FIELD(p, offset, value) \
1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value)
1351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define READ_INT16_FIELD(p, offset) \
1353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<const int16_t*>(FIELD_ADDR_CONST(p, offset)))
1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define WRITE_INT16_FIELD(p, offset, value) \
1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<int16_t*>(FIELD_ADDR(p, offset)) = value)
1357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_UINT32_FIELD(p, offset) \
1359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (*reinterpret_cast<const uint32_t*>(FIELD_ADDR_CONST(p, offset)))
1360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_UINT32_FIELD(p, offset, value) \
1362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value)
1363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define READ_INT32_FIELD(p, offset) \
1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (*reinterpret_cast<const int32_t*>(FIELD_ADDR_CONST(p, offset)))
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define WRITE_INT32_FIELD(p, offset, value) \
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (*reinterpret_cast<int32_t*>(FIELD_ADDR(p, offset)) = value)
1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define READ_FLOAT_FIELD(p, offset) \
1371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<const float*>(FIELD_ADDR_CONST(p, offset)))
1372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define WRITE_FLOAT_FIELD(p, offset, value) \
1374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<float*>(FIELD_ADDR(p, offset)) = value)
1375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define READ_UINT64_FIELD(p, offset) \
1377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<const uint64_t*>(FIELD_ADDR_CONST(p, offset)))
1378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define WRITE_UINT64_FIELD(p, offset, value) \
1380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  (*reinterpret_cast<uint64_t*>(FIELD_ADDR(p, offset)) = value)
1381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
13823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define READ_INT64_FIELD(p, offset) \
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (*reinterpret_cast<const int64_t*>(FIELD_ADDR_CONST(p, offset)))
13843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define WRITE_INT64_FIELD(p, offset, value) \
13863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value)
13873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_BYTE_FIELD(p, offset) \
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  (*reinterpret_cast<const byte*>(FIELD_ADDR_CONST(p, offset)))
1390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NOBARRIER_READ_BYTE_FIELD(p, offset) \
1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static_cast<byte>(base::NoBarrier_Load(    \
1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<base::Atomic8*>(FIELD_ADDR(p, offset))))
1394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_BYTE_FIELD(p, offset, value) \
1396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value)
1397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NOBARRIER_WRITE_BYTE_FIELD(p, offset, value)           \
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::NoBarrier_Store(                                       \
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<base::Atomic8*>(FIELD_ADDR(p, offset)), \
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      static_cast<base::Atomic8>(value));
1402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject** HeapObject::RawField(HeapObject* obj, int byte_offset) {
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<Object**>(FIELD_ADDR(obj, byte_offset));
1405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMapWord MapWord::FromMap(const Map* map) {
1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(map));
1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* MapWord::ToMap() {
1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<Map*>(value_);
1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1417bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool MapWord::IsForwardingAddress() const {
1418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HAS_SMI_TAG(reinterpret_cast<Object*>(value_));
1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromForwardingAddress(HeapObject* object) {
1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag;
1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return MapWord(reinterpret_cast<uintptr_t>(raw));
1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* MapWord::ToForwardingAddress() {
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsForwardingAddress());
1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return HeapObject::FromAddress(reinterpret_cast<Address>(value_));
1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP
1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::VerifyObjectField(int offset) {
1436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  VerifyPointer(READ_FIELD(this, offset));
1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
14387f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
14397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid HeapObject::VerifySmiField(int offset) {
1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(READ_FIELD(this, offset)->IsSmi());
14417f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
1442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHeap* HeapObject::GetHeap() const {
1446109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Heap* heap = MemoryChunk::FromAddress(
1447109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                   reinterpret_cast<Address>(const_cast<HeapObject*>(this)))
1448109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                   ->heap();
1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(heap != NULL);
14503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return heap;
145144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
145244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
145344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochIsolate* HeapObject::GetIsolate() const {
145544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return GetHeap()->isolate();
145644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
145744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
145844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMap* HeapObject::map() const {
1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Clear mark potentially added by PathTracer.
1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uintptr_t raw_value =
1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      map_word().ToRawValue() & ~static_cast<uintptr_t>(PathTracer::kMarkTag);
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MapWord::FromRawValue(raw_value).ToMap();
1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else
1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map_word().ToMap();
1467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
1468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map(Map* value) {
1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_map_word(MapWord::FromMap(value));
147362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (value != nullptr) {
14743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // TODO(1600) We are passing NULL as a slot because maps can never be on
14753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // evacuation candidate.
147662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    value->GetHeap()->incremental_marking()->RecordWrite(this, nullptr, value);
147762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifdef VERIFY_HEAP
147862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    value->GetHeap()->VerifyObjectLayoutChange(this, value);
147962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif
14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMap* HeapObject::synchronized_map() {
1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return synchronized_map_word().ToMap();
1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HeapObject::synchronized_set_map(Map* value) {
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  synchronized_set_map_word(MapWord::FromMap(value));
149162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (value != nullptr) {
1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(1600) We are passing NULL as a slot because maps can never be on
1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // evacuation candidate.
149462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    value->GetHeap()->incremental_marking()->RecordWrite(this, nullptr, value);
149562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#ifdef VERIFY_HEAP
149662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    value->GetHeap()->VerifyObjectLayoutChange(this, value);
149762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif
1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HeapObject::synchronized_set_map_no_write_barrier(Map* value) {
1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  synchronized_set_map_word(MapWord::FromMap(value));
1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Unsafe accessor omitting write barrier.
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HeapObject::set_map_no_write_barrier(Map* value) {
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_map_word(MapWord::FromMap(value));
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMapWord HeapObject::map_word() const {
1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MapWord(
1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<uintptr_t>(NOBARRIER_READ_FIELD(this, kMapOffset)));
1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HeapObject::set_map_word(MapWord map_word) {
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NOBARRIER_WRITE_FIELD(
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMapWord HeapObject::synchronized_map_word() const {
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MapWord(
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<uintptr_t>(ACQUIRE_READ_FIELD(this, kMapOffset)));
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HeapObject::synchronized_set_map_word(MapWord map_word) {
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RELEASE_WRITE_FIELD(
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint HeapObject::Size() {
1538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return SizeFromMap(map());
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdouble HeapNumber::value() const {
1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_DOUBLE_FIELD(this, kValueOffset);
1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HeapNumber::set_value(double value) {
1548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_DOUBLE_FIELD(this, kValueOffset, value);
1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
155162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint64_t HeapNumber::value_as_bits() const {
155262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return READ_UINT64_FIELD(this, kValueOffset);
155362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
155462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
155562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid HeapNumber::set_value_as_bits(uint64_t bits) {
155662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  WRITE_UINT64_FIELD(this, kValueOffset, bits);
155762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
1558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint HeapNumber::get_exponent() {
1560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ((READ_INT_FIELD(this, kExponentOffset) & kExponentMask) >>
1561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kExponentShift) - kExponentBias;
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint HeapNumber::get_sign() {
1566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_INT_FIELD(this, kExponentOffset) & kSignMask;
1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSReceiver, properties, FixedArray, kPropertiesOffset)
15703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
15723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochObject** FixedArray::GetFirstElementAddress() {
15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0)));
1574c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
1575c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1576c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool FixedArray::ContainsOnlySmisOrHoles() {
15783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object* the_hole = GetHeap()->the_hole_value();
15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object** current = GetFirstElementAddress();
15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < length(); ++i) {
15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Object* candidate = *current++;
15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!candidate->IsSmi() && candidate != the_hole) return false;
15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return true;
1585c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
1586c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1587c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFixedArrayBase* JSObject::elements() const {
15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Object* array = READ_FIELD(this, kElementsOffset);
15903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return static_cast<FixedArrayBase*>(array);
1591592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1592592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid AllocationSite::Initialize() {
1595c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_transition_info(Smi::kZero);
1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetElementsKind(GetInitialFastElementsKind());
1597c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_nested_site(Smi::kZero);
1598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_pretenure_data(0);
1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_pretenure_create_count(0);
1600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_dependent_code(DependentCode::cast(GetHeap()->empty_fixed_array()),
1601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     SKIP_WRITE_BARRIER);
1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AllocationSite::IsZombie() { return pretenure_decision() == kZombie; }
1606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AllocationSite::IsMaybeTenure() {
1609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return pretenure_decision() == kMaybeTenure;
1610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AllocationSite::PretenuringDecisionMade() {
1614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return pretenure_decision() != kUndecided;
1615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid AllocationSite::MarkZombie() {
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!IsZombie());
1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Initialize();
1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_pretenure_decision(kZombie);
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochElementsKind AllocationSite::GetElementsKind() {
1626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!SitePointsToLiteral());
1627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = Smi::cast(transition_info())->value();
1628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ElementsKindBits::decode(value);
1629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AllocationSite::SetElementsKind(ElementsKind kind) {
1633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = Smi::cast(transition_info())->value();
1634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_transition_info(Smi::FromInt(ElementsKindBits::update(value, kind)),
1635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      SKIP_WRITE_BARRIER);
1636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AllocationSite::CanInlineCall() {
1640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = Smi::cast(transition_info())->value();
1641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return DoNotInlineBit::decode(value) == 0;
1642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AllocationSite::SetDoNotInlineCall() {
1646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = Smi::cast(transition_info())->value();
1647014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_transition_info(Smi::FromInt(DoNotInlineBit::update(value, true)),
1648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                      SKIP_WRITE_BARRIER);
1649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AllocationSite::SitePointsToLiteral() {
1653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If transition_info is a smi, then it represents an ElementsKind
1654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // for a constructed array. Otherwise, it must be a boilerplate
1655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // for an object or array literal.
1656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return transition_info()->IsJSArray() || transition_info()->IsJSObject();
1657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Heuristic: We only need to create allocation site info if the boilerplate
1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// elements kind is the initial elements kind.
1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAllocationSiteMode AllocationSite::GetMode(
1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ElementsKind boilerplate_elements_kind) {
1664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (IsFastSmiElementsKind(boilerplate_elements_kind)) {
1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return TRACK_ALLOCATION_SITE;
16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DONT_TRACK_ALLOCATION_SITE;
1669592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1670592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool AllocationSite::CanTrack(InstanceType type) {
167262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (FLAG_turbo) {
167362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // TurboFan doesn't care at all about String pretenuring feedback,
167462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // so don't bother even trying to track that.
167562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return type == JS_ARRAY_TYPE || type == JS_OBJECT_TYPE;
167662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_allocation_site_pretenuring) {
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return type == JS_ARRAY_TYPE ||
1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        type == JS_OBJECT_TYPE ||
1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        type < FIRST_NONSTRING_TYPE;
16813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return type == JS_ARRAY_TYPE;
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochAllocationSite::PretenureDecision AllocationSite::pretenure_decision() {
1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = pretenure_data();
1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return PretenureDecisionBits::decode(value);
1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AllocationSite::set_pretenure_decision(PretenureDecision decision) {
1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = pretenure_data();
1694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_pretenure_data(PretenureDecisionBits::update(value, decision));
1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AllocationSite::deopt_dependent_code() {
1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = pretenure_data();
1700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return DeoptDependentCodeBit::decode(value);
1701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AllocationSite::set_deopt_dependent_code(bool deopt) {
1705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = pretenure_data();
1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_pretenure_data(DeoptDependentCodeBit::update(value, deopt));
1707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint AllocationSite::memento_found_count() {
1711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = pretenure_data();
1712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return MementoFoundCountBits::decode(value);
1713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void AllocationSite::set_memento_found_count(int count) {
1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = pretenure_data();
1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Verify that we can count more mementos than we can possibly find in one
1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // new space collection.
1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((GetHeap()->MaxSemiSpaceSize() /
1721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          (Heap::kMinObjectSizeInWords * kPointerSize +
1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           AllocationMemento::kSize)) < MementoFoundCountBits::kMax);
1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(count < MementoFoundCountBits::kMax);
1724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_pretenure_data(MementoFoundCountBits::update(value, count));
1725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint AllocationSite::memento_create_count() { return pretenure_create_count(); }
1729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AllocationSite::set_memento_create_count(int count) {
1732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_pretenure_create_count(count);
1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AllocationSite::IncrementMementoFoundCount(int increment) {
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (IsZombie()) return false;
1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = memento_found_count();
1740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_memento_found_count(value + increment);
1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return memento_found_count() >= kPretenureMinimumCreated;
1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void AllocationSite::IncrementMementoCreateCount() {
1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(FLAG_allocation_site_pretenuring);
1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = memento_create_count();
1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_memento_create_count(value + 1);
1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool AllocationSite::MakePretenureDecision(
1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PretenureDecision current_decision,
1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    double ratio,
1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool maximum_size_scavenge) {
1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Here we just allow state transitions from undecided or maybe tenure
1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // to don't tenure, maybe tenure, or tenure.
1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((current_decision == kUndecided || current_decision == kMaybeTenure)) {
1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (ratio >= kPretenureRatio) {
1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // We just transition into tenure state when the semi-space was at
1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      // maximum capacity.
1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (maximum_size_scavenge) {
1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        set_deopt_dependent_code(true);
1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        set_pretenure_decision(kTenure);
1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // Currently we just need to deopt when we make a state transition to
1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        // tenure.
1767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return true;
1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_pretenure_decision(kMaybeTenure);
1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      set_pretenure_decision(kDontTenure);
17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return false;
1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool AllocationSite::DigestPretenuringFeedback(
1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool maximum_size_scavenge) {
1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool deopt = false;
1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int create_count = memento_create_count();
1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int found_count = memento_found_count();
1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool minimum_mementos_created = create_count >= kPretenureMinimumCreated;
1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double ratio =
1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      minimum_mementos_created || FLAG_trace_pretenuring_statistics ?
1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          static_cast<double>(found_count) / create_count : 0.0;
1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PretenureDecision current_decision = pretenure_decision();
1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (minimum_mementos_created) {
1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    deopt = MakePretenureDecision(
1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        current_decision, ratio, maximum_size_scavenge);
17923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
17933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (FLAG_trace_pretenuring_statistics) {
1795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    PrintIsolate(GetIsolate(),
1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 "pretenuring: AllocationSite(%p): (created, found, ratio) "
1797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 "(%d, %d, %f) %s => %s\n",
179813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                 static_cast<void*>(this), create_count, found_count, ratio,
1799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 PretenureDecisionName(current_decision),
1800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                 PretenureDecisionName(pretenure_decision()));
18013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Clear feedback calculation fields until the next gc.
1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_memento_found_count(0);
1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_memento_create_count(0);
1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return deopt;
1807592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
1808592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
1809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AllocationMemento::IsValid() {
1811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return allocation_site()->IsAllocationSite() &&
1812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         !AllocationSite::cast(allocation_site())->IsZombie();
1813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochAllocationSite* AllocationMemento::GetAllocationSite() {
1817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsValid());
1818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AllocationSite::cast(allocation_site());
1819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
1820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1821109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochAddress AllocationMemento::GetAllocationSiteUnchecked() {
1822109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return reinterpret_cast<Address>(allocation_site());
1823109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
1824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSObject::EnsureCanContainHeapObjectElements(Handle<JSObject> object) {
1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObject::ValidateElements(object);
1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind elements_kind = object->map()->elements_kind();
1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!IsFastObjectElementsKind(elements_kind)) {
1829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (IsFastHoleyElementsKind(elements_kind)) {
1830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TransitionElementsKind(object, FAST_HOLEY_ELEMENTS);
1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TransitionElementsKind(object, FAST_ELEMENTS);
1833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
18365d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
18375d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
1838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSObject::EnsureCanContainElements(Handle<JSObject> object,
1839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Object** objects,
1840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        uint32_t count,
1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        EnsureElementsMode mode) {
1842bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  ElementsKind current_kind = object->GetElementsKind();
1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementsKind target_kind = current_kind;
1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {
1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DisallowHeapAllocation no_allocation;
1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    bool is_holey = IsFastHoleyElementsKind(current_kind);
1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (current_kind == FAST_HOLEY_ELEMENTS) return;
184913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Object* the_hole = object->GetHeap()->the_hole_value();
1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (uint32_t i = 0; i < count; ++i) {
1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Object* current = *objects++;
1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (current == the_hole) {
1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        is_holey = true;
1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        target_kind = GetHoleyElementsKind(target_kind);
1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      } else if (!current->IsSmi()) {
1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && current->IsNumber()) {
1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          if (IsFastSmiElementsKind(target_kind)) {
1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            if (is_holey) {
1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              target_kind = FAST_HOLEY_DOUBLE_ELEMENTS;
1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            } else {
1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              target_kind = FAST_DOUBLE_ELEMENTS;
1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            }
1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          }
1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        } else if (is_holey) {
1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          target_kind = FAST_HOLEY_ELEMENTS;
1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          break;
1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        } else {
1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          target_kind = FAST_ELEMENTS;
1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        }
18703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
18713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
18723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (target_kind != current_kind) {
1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TransitionElementsKind(object, target_kind);
1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
18765d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}
18775d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
18785d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
1879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSObject::EnsureCanContainElements(Handle<JSObject> object,
1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        Handle<FixedArrayBase> elements,
1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        uint32_t length,
1882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                        EnsureElementsMode mode) {
1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = object->GetHeap();
1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (elements->map() != heap->fixed_double_array_map()) {
1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(elements->map() == heap->fixed_array_map() ||
1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           elements->map() == heap->fixed_cow_array_map());
1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (mode == ALLOW_COPIED_DOUBLE_ELEMENTS) {
1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      mode = DONT_ALLOW_DOUBLE_ELEMENTS;
18893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Object** objects =
1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<FixedArray>::cast(elements)->GetFirstElementAddress();
1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    EnsureCanContainElements(object, objects, length, mode);
1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return;
18943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(mode == ALLOW_COPIED_DOUBLE_ELEMENTS);
1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (object->GetElementsKind() == FAST_HOLEY_SMI_ELEMENTS) {
1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS);
1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (object->GetElementsKind() == FAST_SMI_ELEMENTS) {
1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<FixedDoubleArray> double_array =
1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Handle<FixedDoubleArray>::cast(elements);
1902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (uint32_t i = 0; i < length; ++i) {
1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (double_array->is_the_hole(i)) {
1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS);
1905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return;
1906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
1907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS);
1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSObject::SetMapAndElements(Handle<JSObject> object,
1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 Handle<Map> new_map,
1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                 Handle<FixedArrayBase> value) {
1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObject::MigrateToMap(object, new_map);
1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((object->map()->has_fast_smi_or_object_elements() ||
1918109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          (*value == object->GetHeap()->empty_fixed_array()) ||
1919109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          object->map()->has_fast_string_wrapper_elements()) ==
1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         (value->map() == object->GetHeap()->fixed_array_map() ||
1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          value->map() == object->GetHeap()->fixed_cow_array_map()));
1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((*value == object->GetHeap()->empty_fixed_array()) ||
1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         (object->map()->has_fast_double_elements() ==
1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          value->IsFixedDoubleArray()));
1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  object->set_elements(*value);
19263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) {
1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kElementsOffset, value);
1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
1932c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
1933c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1934c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_elements() {
1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FixedArrayBase* elements = map()->GetInitialElements();
1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kElementsOffset, elements);
1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochInterceptorInfo* JSObject::GetIndexedInterceptor() {
19423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return map()->GetIndexedInterceptor();
19433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
19443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
19453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochInterceptorInfo* JSObject::GetNamedInterceptor() {
19463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return map()->GetNamedInterceptor();
19473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
19483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
19493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochInterceptorInfo* Map::GetNamedInterceptor() {
19503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(has_named_interceptor());
19513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  JSFunction* constructor = JSFunction::cast(GetConstructor());
1952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(constructor->shared()->IsApiFunction());
19533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return InterceptorInfo::cast(
19543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      constructor->shared()->get_api_func_data()->named_property_handler());
19553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
19563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
19573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochInterceptorInfo* Map::GetIndexedInterceptor() {
19583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(has_indexed_interceptor());
19593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  JSFunction* constructor = JSFunction::cast(GetConstructor());
19603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(constructor->shared()->IsApiFunction());
19613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return InterceptorInfo::cast(
19623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      constructor->shared()->get_api_func_data()->indexed_property_handler());
19638defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
19648defd9ff6930b4e24729971a61cf7469daf119beSteve Block
1965bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochdouble Oddball::to_number_raw() const {
1966bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return READ_DOUBLE_FIELD(this, kToNumberRawOffset);
1967bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
1968bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1969bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Oddball::set_to_number_raw(double value) {
1970bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  WRITE_DOUBLE_FIELD(this, kToNumberRawOffset, value);
1971bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
19728defd9ff6930b4e24729971a61cf7469daf119beSteve Block
1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_string, String, kToStringOffset)
1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_number, Object, kToNumberOffset)
1975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(Oddball, type_of, String, kTypeOfOffset)
1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbyte Oddball::kind() const {
19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Smi::cast(READ_FIELD(this, kKindOffset))->value();
198044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
198144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
198244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
198344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Oddball::set_kind(byte value) {
19843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_FIELD(this, kKindOffset, Smi::FromInt(value));
198544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
198644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
198744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
1989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Object> Oddball::ToNumber(Handle<Oddball> input) {
1990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return handle(input->to_number(), input->GetIsolate());
1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(Cell, value, Object, kValueOffset)
1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset)
1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(PropertyCell, property_details_raw, Object, kDetailsOffset)
1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(PropertyCell, value, Object, kValueOffset)
1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPropertyDetails PropertyCell::property_details() {
2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return PropertyDetails(Smi::cast(property_details_raw()));
2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid PropertyCell::set_property_details(PropertyDetails details) {
2006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_property_details_raw(details.AsSmi());
2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierObject* WeakCell::value() const { return READ_FIELD(this, kValueOffset); }
2011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid WeakCell::clear() {
2014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Either the garbage collector is clearing the cell or we are simply
2015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // initializing the root empty weak cell.
2016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(GetHeap()->gc_state() == Heap::MARK_COMPACT ||
2017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         this == GetHeap()->empty_weak_cell());
2018c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  WRITE_FIELD(this, kValueOffset, Smi::kZero);
2019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid WeakCell::initialize(HeapObject* val) {
2023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  WRITE_FIELD(this, kValueOffset, val);
2024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // We just have to execute the generational barrier here because we never
2025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // mark through a weak cell and collect evacuation candidates when we process
2026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // all weak cells.
202762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  WriteBarrierMode mode = ObjectMarking::IsBlack(this)
2028f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                              ? UPDATE_WRITE_BARRIER
2029f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                              : UPDATE_WEAK_WRITE_BARRIER;
20303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kValueOffset, val, mode);
2031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2033c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool WeakCell::cleared() const { return value() == Smi::kZero; }
2034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierObject* WeakCell::next() const { return READ_FIELD(this, kNextOffset); }
2036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid WeakCell::set_next(Object* val, WriteBarrierMode mode) {
2039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  WRITE_FIELD(this, kNextOffset, val);
2040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (mode == UPDATE_WRITE_BARRIER) {
2041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    WRITE_BARRIER(GetHeap(), this, kNextOffset, val);
2042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid WeakCell::clear_next(Object* the_hole_value) {
2047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(GetHeap()->the_hole_value(), the_hole_value);
2048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_next(the_hole_value, SKIP_WRITE_BARRIER);
2049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
205113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool WeakCell::next_cleared() { return next()->IsTheHole(GetIsolate()); }
2052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint JSObject::GetHeaderSize() { return GetHeaderSize(map()->instance_type()); }
2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint JSObject::GetHeaderSize(InstanceType type) {
2057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Check for the most common kind of JavaScript object before
2058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // falling into the generic switch. This speeds up the internal
2059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // field operations considerably on average.
2060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize;
2061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (type) {
2062bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    case JS_API_OBJECT_TYPE:
20633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case JS_SPECIAL_API_OBJECT_TYPE:
20643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return JSObject::kHeaderSize;
2065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_GENERATOR_OBJECT_TYPE:
2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSGeneratorObject::kSize;
2067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_PROXY_TYPE:
2068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSGlobalProxy::kSize;
2069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_GLOBAL_OBJECT_TYPE:
2070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSGlobalObject::kSize;
2071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case JS_BOUND_FUNCTION_TYPE:
2072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return JSBoundFunction::kSize;
2073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_FUNCTION_TYPE:
2074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSFunction::kSize;
2075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_VALUE_TYPE:
2076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSValue::kSize;
20773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case JS_DATE_TYPE:
20783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return JSDate::kSize;
2079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_ARRAY_TYPE:
20803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return JSArray::kSize;
2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_ARRAY_BUFFER_TYPE:
2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSArrayBuffer::kSize;
2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_TYPED_ARRAY_TYPE:
2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSTypedArray::kSize;
2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_DATA_VIEW_TYPE:
2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSDataView::kSize;
2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_SET_TYPE:
2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSSet::kSize;
2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_MAP_TYPE:
2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSMap::kSize;
2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_SET_ITERATOR_TYPE:
2092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSSetIterator::kSize;
2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_MAP_ITERATOR_TYPE:
2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSMapIterator::kSize;
209569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case JS_WEAK_MAP_TYPE:
209669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return JSWeakMap::kSize;
2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case JS_WEAK_SET_TYPE:
2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return JSWeakSet::kSize;
209962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case JS_PROMISE_CAPABILITY_TYPE:
210062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return JSPromiseCapability::kSize;
2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case JS_PROMISE_TYPE:
210262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return JSPromise::kSize;
2103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_REGEXP_TYPE:
21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return JSRegExp::kSize;
2105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
2106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return JSObject::kHeaderSize;
21071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    case JS_MESSAGE_OBJECT_TYPE:
21081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      return JSMessageObject::kSize;
210913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case JS_ARGUMENTS_TYPE:
211013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return JSArgumentsObject::kHeaderSize;
211113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case JS_ERROR_TYPE:
211213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return JSObject::kHeaderSize;
2113f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    case JS_STRING_ITERATOR_TYPE:
2114f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return JSStringIterator::kSize;
211562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case JS_MODULE_NAMESPACE_TYPE:
211662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return JSModuleNamespace::kHeaderSize;
2117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
211862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      if (type >= FIRST_ARRAY_ITERATOR_TYPE &&
211962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          type <= LAST_ARRAY_ITERATOR_TYPE) {
212062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        return JSArrayIterator::kSize;
212162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      }
2122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      UNREACHABLE();
2123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return 0;
2124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
212762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochinline bool IsSpecialReceiverInstanceType(InstanceType instance_type) {
212862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return instance_type <= LAST_SPECIAL_RECEIVER_TYPE;
212962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint JSObject::GetInternalFieldCount(Map* map) {
2132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int instance_size = map->instance_size();
2133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instance_size == kVariableSizeSentinel) return 0;
2134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  InstanceType instance_type = map->instance_type();
2135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ((instance_size - GetHeaderSize(instance_type)) >> kPointerSizeLog2) -
2136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         map->GetInObjectProperties();
2137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint JSObject::GetInternalFieldCount() { return GetInternalFieldCount(map()); }
2141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
214344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint JSObject::GetInternalFieldOffset(int index) {
2144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index < GetInternalFieldCount() && index >= 0);
214544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return GetHeaderSize() + (kPointerSize * index);
214644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
214744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
214844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::GetInternalField(int index) {
2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index < GetInternalFieldCount() && index >= 0);
2151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Internal objects do follow immediately after the header, whereas in-object
2152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // properties are at the end of the object. Therefore there is no need
2153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // to adjust the index here.
2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index));
2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SetInternalField(int index, Object* value) {
2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index < GetInternalFieldCount() && index >= 0);
2160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Internal objects do follow immediately after the header, whereas in-object
2161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // properties are at the end of the object. Therefore there is no need
2162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // to adjust the index here.
2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = GetHeaderSize() + (kPointerSize * index);
2164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
21653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BARRIER(GetHeap(), this, offset, value);
21663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::SetInternalField(int index, Smi* value) {
2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index < GetInternalFieldCount() && index >= 0);
21713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Internal objects do follow immediately after the header, whereas in-object
21723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // properties are at the end of the object. Therefore there is no need
21733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // to adjust the index here.
21743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int offset = GetHeaderSize() + (kPointerSize * index);
21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_FIELD(this, offset, value);
2176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool JSObject::IsUnboxedDoubleField(FieldIndex index) {
2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (!FLAG_unbox_double_fields) return false;
2181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return map()->IsUnboxedDoubleField(index);
2182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool Map::IsUnboxedDoubleField(FieldIndex index) {
2186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (!FLAG_unbox_double_fields) return false;
2187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (index.is_hidden_field() || !index.is_inobject()) return false;
2188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return !layout_descriptor()->IsTagged(index.property_index());
2189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Access fast-case object properties at index. The use of these routines
2193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is needed to correctly distinguish between properties stored in-object and
2194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// properties stored in the properties array.
2195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* JSObject::RawFastPropertyAt(FieldIndex index) {
2196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(!IsUnboxedDoubleField(index));
2197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (index.is_inobject()) {
2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return READ_FIELD(this, index.offset());
2199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return properties()->get(index.outobject_array_index());
2201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierdouble JSObject::RawFastDoublePropertyAt(FieldIndex index) {
2206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(IsUnboxedDoubleField(index));
2207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return READ_DOUBLE_FIELD(this, index.offset());
2208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
221062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint64_t JSObject::RawFastDoublePropertyAsBitsAt(FieldIndex index) {
221162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(IsUnboxedDoubleField(index));
221262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return READ_UINT64_FIELD(this, index.offset());
221362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
2214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid JSObject::RawFastPropertyAtPut(FieldIndex index, Object* value) {
2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (index.is_inobject()) {
2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int offset = index.offset();
2218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);
22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    WRITE_BARRIER(GetHeap(), this, offset, value);
2220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else {
2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    properties()->set(index.outobject_array_index(), value);
2222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
222562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid JSObject::RawFastDoublePropertyAsBitsAtPut(FieldIndex index,
222662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                uint64_t bits) {
222762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  WRITE_UINT64_FIELD(this, index.offset(), bits);
2228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid JSObject::FastPropertyAtPut(FieldIndex index, Object* value) {
2231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (IsUnboxedDoubleField(index)) {
2232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(value->IsMutableHeapNumber());
223362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Ensure that all bits of the double value are preserved.
223462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    RawFastDoublePropertyAsBitsAtPut(index,
223562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                     HeapNumber::cast(value)->value_as_bits());
2236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else {
2237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    RawFastPropertyAtPut(index, value);
2238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2241109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid JSObject::WriteToField(int descriptor, PropertyDetails details,
2242109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                            Object* value) {
224362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(kField, details.location());
224462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(kData, details.kind());
2245109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DisallowHeapAllocation no_gc;
2246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FieldIndex index = FieldIndex::ForDescriptor(map(), descriptor);
2247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (details.representation().IsDouble()) {
2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Nothing more to be done.
224913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (value->IsUninitialized(this->GetIsolate())) {
225013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return;
225113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    }
225262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Manipulating the signaling NaN used for the hole and uninitialized
225362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // double field sentinel in C++, e.g. with bit_cast or value()/set_value(),
225462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // will change its value on ia32 (the x87 stack is used to return values
225562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // and stores to the stack silently clear the signalling bit).
225662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    uint64_t bits;
225762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (value->IsSmi()) {
225862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      bits = bit_cast<uint64_t>(static_cast<double>(Smi::cast(value)->value()));
225962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    } else {
226062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      DCHECK(value->IsHeapNumber());
226162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      bits = HeapNumber::cast(value)->value_as_bits();
226262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (IsUnboxedDoubleField(index)) {
226462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      RawFastDoublePropertyAsBitsAtPut(index, bits);
2265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else {
2266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      HeapNumber* box = HeapNumber::cast(RawFastPropertyAt(index));
2267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DCHECK(box->IsMutableHeapNumber());
226862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      box->set_value_as_bits(bits);
2269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
2270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    RawFastPropertyAtPut(index, value);
2272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
227544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint JSObject::GetInObjectPropertyOffset(int index) {
2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return map()->GetInObjectPropertyOffset(index);
227744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
227844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
227944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAt(int index) {
2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset = GetInObjectPropertyOffset(index);
2282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, offset);
2283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAtPut(int index,
2287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        Object* value,
2288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                                        WriteBarrierMode mode) {
2289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Adjust for the number of properties stored in the object.
2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset = GetInObjectPropertyOffset(index);
2291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, offset, value);
22923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
2293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return value;
2294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSObject::InitializeBody(Map* map, int start_offset,
22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              Object* pre_allocated_value,
22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              Object* filler_value) {
2300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!filler_value->IsHeapObject() ||
23013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         !GetHeap()->InNewSpace(filler_value));
2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!pre_allocated_value->IsHeapObject() ||
23033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch         !GetHeap()->InNewSpace(pre_allocated_value));
23043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int size = map->instance_size();
2305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int offset = start_offset;
23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (filler_value != pre_allocated_value) {
2307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int end_of_pre_allocated_offset =
2308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        size - (map->unused_property_fields() * kPointerSize);
2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_LE(kHeaderSize, end_of_pre_allocated_offset);
2310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    while (offset < end_of_pre_allocated_offset) {
23113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      WRITE_FIELD(this, offset, pre_allocated_value);
23123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      offset += kPointerSize;
23133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
23143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
23153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (offset < size) {
23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    WRITE_FIELD(this, offset, filler_value);
23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    offset += kPointerSize;
2318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::TooManyFastProperties(StoreFromKeyed store_mode) {
2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (unused_property_fields() != 0) return false;
2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (is_prototype_map()) return false;
2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int minimum = store_mode == CERTAINLY_NOT_STORE_FROM_KEYED ? 128 : 12;
2326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int limit = Max(minimum, GetInObjectProperties());
2327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int external = NumberOfFields() - GetInObjectProperties();
2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return external > limit;
23298defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
23308defd9ff6930b4e24729971a61cf7469daf119beSteve Block
23318defd9ff6930b4e24729971a61cf7469daf119beSteve Block
2332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Struct::InitializeBody(int object_size) {
233344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Object* value = GetHeap()->undefined_value();
2334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
2335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    WRITE_FIELD(this, offset, value);
2336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
2337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Object::ToArrayLength(uint32_t* index) { return Object::ToUint32(index); }
2340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
23427f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool Object::ToArrayIndex(uint32_t* index) {
2343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Object::ToUint32(index) && *index != kMaxUInt32;
2344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Object::VerifyApiCallResultType() {
2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if DEBUG
234913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (IsSmi()) return;
235013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(IsHeapObject());
235113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate = HeapObject::cast(this)->GetIsolate();
235213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (!(IsString() || IsSymbol() || IsJSReceiver() || IsHeapNumber() ||
235362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        IsUndefined(isolate) || IsTrue(isolate) || IsFalse(isolate) ||
235462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        IsNull(isolate))) {
2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FATAL("API call returned invalid object");
2356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // DEBUG
23583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
23593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
23603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierObject* FixedArray::get(int index) const {
2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(index >= 0 && index < this->length());
236362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return NOBARRIER_READ_FIELD(this, kHeaderSize + index * kPointerSize);
2364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2366109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<Object> FixedArray::get(FixedArray* array, int index, Isolate* isolate) {
2367109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return handle(array->get(index), isolate);
2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T>
2371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMaybeHandle<T> FixedArray::GetValue(Isolate* isolate, int index) const {
2372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Object* obj = get(index);
2373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (obj->IsUndefined(isolate)) return MaybeHandle<T>();
2374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return Handle<T>(T::cast(obj), isolate);
2375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
2377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <class T>
2378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<T> FixedArray::GetValueChecked(Isolate* isolate, int index) const {
2379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Object* obj = get(index);
2380f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CHECK(!obj->IsUndefined(isolate));
2381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return Handle<T>(T::cast(obj), isolate);
2382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
2383c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool FixedArray::is_the_hole(Isolate* isolate, int index) {
2384c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return get(index)->IsTheHole(isolate);
2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Smi* value) {
2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(map() != GetHeap()->fixed_cow_array_map());
2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < this->length());
2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(reinterpret_cast<Object*>(value)->IsSmi());
2391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = kHeaderSize + index * kPointerSize;
239262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  NOBARRIER_WRITE_FIELD(this, offset, value);
2393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Object* value) {
2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_NE(GetHeap()->fixed_cow_array_map(), map());
2398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsFixedArray());
2399109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK_GE(index, 0);
2400109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK_LT(index, this->length());
2401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  int offset = kHeaderSize + index * kPointerSize;
240262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  NOBARRIER_WRITE_FIELD(this, offset, value);
24033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BARRIER(GetHeap(), this, offset, value);
2404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
240769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochdouble FixedDoubleArray::get_scalar(int index) {
2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(map() != GetHeap()->fixed_cow_array_map() &&
2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         map() != GetHeap()->fixed_array_map());
2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < this->length());
2411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!is_the_hole(index));
2412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize);
24133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
24143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochuint64_t FixedDoubleArray::get_representation(int index) {
2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(map() != GetHeap()->fixed_cow_array_map() &&
2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         map() != GetHeap()->fixed_array_map());
2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < this->length());
2420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int offset = kHeaderSize + index * kDoubleSize;
2421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_UINT64_FIELD(this, offset);
24223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2424109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<Object> FixedDoubleArray::get(FixedDoubleArray* array, int index,
2425109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     Isolate* isolate) {
2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (array->is_the_hole(index)) {
2427109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return isolate->factory()->the_hole_value();
242869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  } else {
2429109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return isolate->factory()->NewNumber(array->get_scalar(index));
243069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
243169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
243269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
243369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
24343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid FixedDoubleArray::set(int index, double value) {
2435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(map() != GetHeap()->fixed_cow_array_map() &&
2436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         map() != GetHeap()->fixed_array_map());
24373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int offset = kHeaderSize + index * kDoubleSize;
2438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (std::isnan(value)) {
2439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WRITE_DOUBLE_FIELD(this, offset, std::numeric_limits<double>::quiet_NaN());
2440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
2441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WRITE_DOUBLE_FIELD(this, offset, value);
2442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!is_the_hole(index));
24443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
24453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
244662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid FixedDoubleArray::set_the_hole(Isolate* isolate, int index) {
244762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set_the_hole(index);
244862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
24493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
24503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid FixedDoubleArray::set_the_hole(int index) {
2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(map() != GetHeap()->fixed_cow_array_map() &&
2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         map() != GetHeap()->fixed_array_map());
24533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  int offset = kHeaderSize + index * kDoubleSize;
2454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_UINT64_FIELD(this, offset, kHoleNanInt64);
24553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
24563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2457c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool FixedDoubleArray::is_the_hole(Isolate* isolate, int index) {
2458c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return is_the_hole(index);
2459c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
24603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
24613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool FixedDoubleArray::is_the_hole(int index) {
2462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return get_representation(index) == kHoleNanInt64;
24633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
24643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
24653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble* FixedDoubleArray::data_start() {
2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<double*>(FIELD_ADDR(this, kHeaderSize));
2468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FixedDoubleArray::FillWithHoles(int from, int to) {
2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = from; i < to; i++) {
2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_the_hole(i);
2474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
24753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
24763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
24773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierObject* WeakFixedArray::Get(int index) const {
2479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Object* raw = FixedArray::cast(this)->get(index + kFirstIndex);
2480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (raw->IsSmi()) return raw;
2481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(raw->IsWeakCell());
2482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return WeakCell::cast(raw)->value();
2483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool WeakFixedArray::IsEmptySlot(int index) const {
2487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(index < Length());
2488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return Get(index)->IsSmi();
2489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid WeakFixedArray::Clear(int index) {
2493c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  FixedArray::cast(this)->set(index + kFirstIndex, Smi::kZero);
2494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint WeakFixedArray::Length() const {
2498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return FixedArray::cast(this)->length() - kFirstIndex;
2499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint WeakFixedArray::last_used_index() const {
2503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return Smi::cast(FixedArray::cast(this)->get(kLastUsedIndexIndex))->value();
2504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid WeakFixedArray::set_last_used_index(int index) {
2508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  FixedArray::cast(this)->set(kLastUsedIndexIndex, Smi::FromInt(index));
2509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class T>
2513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochT* WeakFixedArray::Iterator::Next() {
2514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (list_ != NULL) {
2515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Assert that list did not change during iteration.
2516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_EQ(last_used_index_, list_->last_used_index());
2517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    while (index_ < list_->Length()) {
2518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Object* item = list_->Get(index_++);
2519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (item != Empty()) return T::cast(item);
2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    list_ = NULL;
2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return NULL;
2524592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
2525592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2526592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint ArrayList::Length() {
2528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FixedArray::cast(this)->length() == 0) return 0;
2529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Smi::cast(FixedArray::cast(this)->get(kLengthIndex))->value();
2530592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
2531592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2532592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
2533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ArrayList::SetLength(int length) {
2534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return FixedArray::cast(this)->set(kLengthIndex, Smi::FromInt(length));
2535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
2536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* ArrayList::Get(int index) {
2539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return FixedArray::cast(this)->get(kFirstIndex + index);
254069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
254169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
254269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
2543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject** ArrayList::Slot(int index) {
2544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return data_start() + kFirstIndex + index;
254544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
254644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2547f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid ArrayList::Set(int index, Object* obj, WriteBarrierMode mode) {
2548f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  FixedArray::cast(this)->set(kFirstIndex + index, obj, mode);
254944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
255044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
255144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ArrayList::Clear(int index, Object* undefined) {
255313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(undefined->IsUndefined(GetIsolate()));
2554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FixedArray::cast(this)
2555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ->set(kFirstIndex + index, undefined, SKIP_WRITE_BARRIER);
2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2558c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochint RegExpMatchInfo::NumberOfCaptureRegisters() {
2559c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_GE(length(), kLastMatchOverhead);
2560c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Object* obj = get(kNumberOfCapturesIndex);
2561c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return Smi::cast(obj)->value();
2562c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2563c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2564c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid RegExpMatchInfo::SetNumberOfCaptureRegisters(int value) {
2565c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_GE(length(), kLastMatchOverhead);
2566c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set(kNumberOfCapturesIndex, Smi::FromInt(value));
2567c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2568c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2569c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochString* RegExpMatchInfo::LastSubject() {
2570c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_GE(length(), kLastMatchOverhead);
2571c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Object* obj = get(kLastSubjectIndex);
2572c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return String::cast(obj);
2573c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2574c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2575c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid RegExpMatchInfo::SetLastSubject(String* value) {
2576c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_GE(length(), kLastMatchOverhead);
2577c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set(kLastSubjectIndex, value);
2578c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2579c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2580c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochObject* RegExpMatchInfo::LastInput() {
2581c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_GE(length(), kLastMatchOverhead);
2582c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return get(kLastInputIndex);
2583c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2584c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2585c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid RegExpMatchInfo::SetLastInput(Object* value) {
2586c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_GE(length(), kLastMatchOverhead);
2587c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set(kLastInputIndex, value);
2588c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2589c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2590c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochint RegExpMatchInfo::Capture(int i) {
2591c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_LT(i, NumberOfCaptureRegisters());
2592c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Object* obj = get(kFirstCaptureIndex + i);
2593c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return Smi::cast(obj)->value();
2594c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2595c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2596c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid RegExpMatchInfo::SetCapture(int i, int value) {
2597c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_LT(i, NumberOfCaptureRegisters());
2598c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set(kFirstCaptureIndex + i, Smi::FromInt(value));
2599c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochWriteBarrierMode HeapObject::GetWriteBarrierMode(
2602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const DisallowHeapAllocation& promise) {
2603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap* heap = GetHeap();
2604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return UPDATE_WRITE_BARRIER;
2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochAllocationAlignment HeapObject::RequiredAlignment() {
2611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef V8_HOST_ARCH_32_BIT
2612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if ((IsFixedFloat64Array() || IsFixedDoubleArray()) &&
2613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      FixedArrayBase::cast(this)->length() != 0) {
2614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return kDoubleAligned;
2615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (IsHeapNumber()) return kDoubleUnaligned;
2617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_HOST_ARCH_32_BIT
2618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return kWordAligned;
2619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
2620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
2622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FixedArray::set(int index,
2623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     Object* value,
2624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                     WriteBarrierMode mode) {
262562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_NE(map(), GetHeap()->fixed_cow_array_map());
262662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_GE(index, 0);
262762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_LT(index, this->length());
2628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset = kHeaderSize + index * kPointerSize;
2629c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  NOBARRIER_WRITE_FIELD(this, offset, value);
2630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
2631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FixedArray::NoWriteBarrierSet(FixedArray* array,
2635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   int index,
2636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                   Object* value) {
263762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_NE(array->map(), array->GetHeap()->fixed_cow_array_map());
263862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_GE(index, 0);
263962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_LT(index, array->length());
2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!array->GetHeap()->InNewSpace(value));
2641c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  NOBARRIER_WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value);
2642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FixedArray::set_undefined(int index) {
264562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set_undefined(GetIsolate(), index);
2646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
264862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid FixedArray::set_undefined(Isolate* isolate, int index) {
264962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  FixedArray::NoWriteBarrierSet(this, index,
265062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                isolate->heap()->undefined_value());
2651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
265362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid FixedArray::set_null(int index) { set_null(GetIsolate(), index); }
2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
265562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid FixedArray::set_null(Isolate* isolate, int index) {
265662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  FixedArray::NoWriteBarrierSet(this, index, isolate->heap()->null_value());
2657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
265962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid FixedArray::set_the_hole(int index) { set_the_hole(GetIsolate(), index); }
266062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
266162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid FixedArray::set_the_hole(Isolate* isolate, int index) {
266262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  FixedArray::NoWriteBarrierSet(this, index, isolate->heap()->the_hole_value());
266362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
2664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FixedArray::FillWithHoles(int from, int to) {
266662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Isolate* isolate = GetIsolate();
2667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = from; i < to; i++) {
266862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    set_the_hole(isolate, i);
2669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject** FixedArray::data_start() {
2674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return HeapObject::RawField(this, kHeaderSize);
2675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject** FixedArray::RawFieldOfElementAt(int index) {
2679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return HeapObject::RawField(this, OffsetOfElementAt(index));
2680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2682f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define DEFINE_FRAME_ARRAY_ACCESSORS(name, type)                              \
2683f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  type* FrameArray::name(int frame_ix) const {                                \
2684f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Object* obj =                                                             \
2685f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        get(kFirstIndex + frame_ix * kElementsPerFrame + k##name##Offset);    \
2686f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return type::cast(obj);                                                   \
2687f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }                                                                           \
2688f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                                                              \
2689f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void FrameArray::Set##name(int frame_ix, type* value) {                     \
2690f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    set(kFirstIndex + frame_ix * kElementsPerFrame + k##name##Offset, value); \
2691f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
2692f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochFRAME_ARRAY_FIELD_LIST(DEFINE_FRAME_ARRAY_ACCESSORS)
2693f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef DEFINE_FRAME_ARRAY_ACCESSORS
2694f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
2695f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochbool FrameArray::IsWasmFrame(int frame_ix) const {
2696f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  const int flags = Flags(frame_ix)->value();
2697f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return (flags & kIsWasmFrame) != 0;
2698f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
2699f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
2700c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool FrameArray::IsAsmJsWasmFrame(int frame_ix) const {
2701c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  const int flags = Flags(frame_ix)->value();
2702c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return (flags & kIsAsmJsWasmFrame) != 0;
2703c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
2704c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
2705f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochint FrameArray::FrameCount() const {
2706f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  const int frame_count = Smi::cast(get(kFrameCountIndex))->value();
2707f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  DCHECK_LE(0, frame_count);
2708f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  return frame_count;
2709f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
2710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool DescriptorArray::IsEmpty() {
2712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(length() >= kFirstIndex ||
2713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         this == GetHeap()->empty_descriptor_array());
2714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return length() < kFirstIndex;
2715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint DescriptorArray::number_of_descriptors() {
2719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(length() >= kFirstIndex || IsEmpty());
2720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int len = length();
2721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return len == 0 ? 0 : Smi::cast(get(kDescriptorLengthIndex))->value();
2722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint DescriptorArray::number_of_descriptors_storage() {
2726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int len = length();
272762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return len == 0 ? 0 : (len - kFirstIndex) / kEntrySize;
2728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint DescriptorArray::NumberOfSlackDescriptors() {
2732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return number_of_descriptors_storage() - number_of_descriptors();
2733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DescriptorArray::SetNumberOfDescriptors(int number_of_descriptors) {
2737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(
2738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this, kDescriptorLengthOffset, Smi::FromInt(number_of_descriptors));
2739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline int DescriptorArray::number_of_entries() {
2743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return number_of_descriptors();
2744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool DescriptorArray::HasEnumCache() {
2748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !IsEmpty() && !get(kEnumCacheIndex)->IsSmi();
2749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DescriptorArray::CopyEnumCacheFrom(DescriptorArray* array) {
2753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(kEnumCacheIndex, array->get(kEnumCacheIndex));
2754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochFixedArray* DescriptorArray::GetEnumCache() {
2758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(HasEnumCache());
2759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex));
2760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return FixedArray::cast(bridge->get(kEnumCacheBridgeCacheIndex));
2761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool DescriptorArray::HasEnumIndicesCache() {
2765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (IsEmpty()) return false;
2766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* object = get(kEnumCacheIndex);
2767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (object->IsSmi()) return false;
2768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FixedArray* bridge = FixedArray::cast(object);
2769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !bridge->get(kEnumCacheBridgeIndicesCacheIndex)->IsSmi();
2770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochFixedArray* DescriptorArray::GetEnumIndicesCache() {
2774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(HasEnumIndicesCache());
2775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FixedArray* bridge = FixedArray::cast(get(kEnumCacheIndex));
2776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return FixedArray::cast(bridge->get(kEnumCacheBridgeIndicesCacheIndex));
2777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject** DescriptorArray::GetEnumCacheSlot() {
2781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(HasEnumCache());
2782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return HeapObject::RawField(reinterpret_cast<HeapObject*>(this),
2783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              kEnumCacheOffset);
2784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2786109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Perform a binary search in a fixed array.
2787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <SearchMode search_mode, typename T>
2788109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint BinarySearch(T* array, Name* name, int valid_entries,
2789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                 int* out_insertion_index) {
2790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(search_mode == ALL_ENTRIES || out_insertion_index == NULL);
2791109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int low = 0;
2792109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  int high = array->number_of_entries() - 1;
2793109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  uint32_t hash = name->hash_field();
2794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int limit = high;
2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(low <= high);
2797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (low != high) {
2799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int mid = low + (high - low) / 2;
2800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Name* mid_name = array->GetSortedKey(mid);
2801109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    uint32_t mid_hash = mid_name->hash_field();
2802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (mid_hash >= hash) {
2804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      high = mid;
2805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      low = mid + 1;
2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (; low <= limit; ++low) {
2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int sort_index = array->GetSortedKeyIndex(low);
2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Name* entry = array->GetKey(sort_index);
2813109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    uint32_t current_hash = entry->hash_field();
2814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (current_hash != hash) {
2815109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
2816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        *out_insertion_index = sort_index + (current_hash > hash ? 0 : 1);
2817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
2818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return T::kNotFound;
2819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
2820109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (entry == name) {
2821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (search_mode == ALL_ENTRIES || sort_index < valid_entries) {
2822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return sort_index;
2823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
2824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return T::kNotFound;
2825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2828109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
2829109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    *out_insertion_index = limit + 1;
2830109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
2831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return T::kNotFound;
2832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Perform a linear search in this fixed array. len is the number of entry
2836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// indices that are valid.
2837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <SearchMode search_mode, typename T>
2838109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint LinearSearch(T* array, Name* name, int valid_entries,
2839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                 int* out_insertion_index) {
2840109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
2841109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    uint32_t hash = name->hash_field();
2842109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    int len = array->number_of_entries();
2843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int number = 0; number < len; number++) {
2844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      int sorted_index = array->GetSortedKeyIndex(number);
2845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Name* entry = array->GetKey(sorted_index);
2846109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      uint32_t current_hash = entry->hash_field();
2847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (current_hash > hash) {
2848109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch        *out_insertion_index = sorted_index;
2849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return T::kNotFound;
2850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
2851109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      if (entry == name) return sorted_index;
2852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2853109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    *out_insertion_index = len;
2854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return T::kNotFound;
2855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2856109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    DCHECK_LE(valid_entries, array->number_of_entries());
2857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_NULL(out_insertion_index);  // Not supported here.
2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (int number = 0; number < valid_entries; number++) {
2859109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      if (array->GetKey(number) == name) return number;
2860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
2861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return T::kNotFound;
2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <SearchMode search_mode, typename T>
2867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint Search(T* array, Name* name, int valid_entries, int* out_insertion_index) {
2868109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  SLOW_DCHECK(array->IsSortedNoDuplicates());
2869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2870109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (valid_entries == 0) {
2871109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) {
2872109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      *out_insertion_index = 0;
2873109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    }
2874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return T::kNotFound;
2875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Fast case: do linear search for small arrays.
2878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int kMaxElementsForLinearSearch = 8;
2879109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (valid_entries <= kMaxElementsForLinearSearch) {
2880109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return LinearSearch<search_mode>(array, name, valid_entries,
2881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                     out_insertion_index);
2882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Slow case: perform binary search.
2885109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return BinarySearch<search_mode>(array, name, valid_entries,
2886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                   out_insertion_index);
2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint DescriptorArray::Search(Name* name, int valid_descriptors) {
2891109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK(name->IsUniqueName());
2892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return internal::Search<VALID_ENTRIES>(this, name, valid_descriptors, NULL);
2893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2895109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint DescriptorArray::SearchWithCache(Isolate* isolate, Name* name, Map* map) {
2896109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK(name->IsUniqueName());
2897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int number_of_own_descriptors = map->NumberOfOwnDescriptors();
2898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (number_of_own_descriptors == 0) return kNotFound;
2899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2900109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DescriptorLookupCache* cache = isolate->descriptor_lookup_cache();
2901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int number = cache->Lookup(map, name);
2902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (number == DescriptorLookupCache::kAbsent) {
2904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    number = Search(name, number_of_own_descriptors);
2905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    cache->Update(map, name, number);
2906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
2907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return number;
2909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPropertyDetails Map::GetLastDescriptorDetails() {
2912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return instance_descriptors()->GetDetails(LastAdded());
2913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Map::LastAdded() {
2917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int number_of_own_descriptors = NumberOfOwnDescriptors();
2918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(number_of_own_descriptors > 0);
2919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return number_of_own_descriptors - 1;
2920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Map::NumberOfOwnDescriptors() {
2924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return NumberOfOwnDescriptorsBits::decode(bit_field3());
2925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::SetNumberOfOwnDescriptors(int number) {
2929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(number <= instance_descriptors()->number_of_descriptors());
2930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field3(NumberOfOwnDescriptorsBits::update(bit_field3(), number));
2931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
2932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Map::EnumLength() { return EnumLengthBits::decode(bit_field3()); }
2935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
2937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::SetEnumLength(int length) {
2938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (length != kInvalidEnumCacheSentinel) {
2939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(length >= 0);
2940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(length == 0 || instance_descriptors()->HasEnumCache());
2941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(length <= NumberOfOwnDescriptors());
2942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
2943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field3(EnumLengthBits::update(bit_field3(), length));
2944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFixedArrayBase* Map::GetInitialElements() {
294813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  FixedArrayBase* result = nullptr;
2949109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (has_fast_elements() || has_fast_string_wrapper_elements()) {
295013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    result = GetHeap()->empty_fixed_array();
295113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } else if (has_fast_sloppy_arguments_elements()) {
295213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    result = GetHeap()->empty_sloppy_arguments_elements();
2953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else if (has_fixed_typed_array_elements()) {
295413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    result = GetHeap()->EmptyFixedTypedArrayForMap(this);
2955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
2956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    UNREACHABLE();
2957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
295813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(!GetHeap()->InNewSpace(result));
295913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return result;
2960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject** DescriptorArray::GetKeySlot(int descriptor_number) {
2963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(descriptor_number < number_of_descriptors());
2964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return RawFieldOfElementAt(ToKeyIndex(descriptor_number));
2965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject** DescriptorArray::GetDescriptorStartSlot(int descriptor_number) {
2969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetKeySlot(descriptor_number);
2970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject** DescriptorArray::GetDescriptorEndSlot(int descriptor_number) {
2974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetValueSlot(descriptor_number - 1) + 1;
2975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochName* DescriptorArray::GetKey(int descriptor_number) {
2979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(descriptor_number < number_of_descriptors());
2980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Name::cast(get(ToKeyIndex(descriptor_number)));
2981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint DescriptorArray::GetSortedKeyIndex(int descriptor_number) {
2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetDetails(descriptor_number).pointer();
2986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochName* DescriptorArray::GetSortedKey(int descriptor_number) {
2990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetKey(GetSortedKeyIndex(descriptor_number));
2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DescriptorArray::SetSortedKey(int descriptor_index, int pointer) {
2995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PropertyDetails details = GetDetails(descriptor_index);
2996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set(ToDetailsIndex(descriptor_index), details.set_pointer(pointer).AsSmi());
2997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
2998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
2999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject** DescriptorArray::GetValueSlot(int descriptor_number) {
3001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(descriptor_number < number_of_descriptors());
3002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return RawFieldOfElementAt(ToValueIndex(descriptor_number));
3003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint DescriptorArray::GetValueOffset(int descriptor_number) {
3007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OffsetOfElementAt(ToValueIndex(descriptor_number));
3008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* DescriptorArray::GetValue(int descriptor_number) {
3012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(descriptor_number < number_of_descriptors());
3013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return get(ToValueIndex(descriptor_number));
3014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DescriptorArray::SetValue(int descriptor_index, Object* value) {
3018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set(ToValueIndex(descriptor_index), value);
3019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
3023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(descriptor_number < number_of_descriptors());
3024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* details = get(ToDetailsIndex(descriptor_number));
3025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return PropertyDetails(Smi::cast(details));
3026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint DescriptorArray::GetFieldIndex(int descriptor_number) {
3029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(GetDetails(descriptor_number).location() == kField);
3030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetDetails(descriptor_number).field_index();
3031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
303362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochFieldType* DescriptorArray::GetFieldType(int descriptor_number) {
303462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(GetDetails(descriptor_number).location() == kField);
303562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Object* wrapped_type = GetValue(descriptor_number);
303662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return Map::UnwrapFieldType(wrapped_type);
3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
3040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  desc->Init(handle(GetKey(descriptor_number), GetIsolate()),
3041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             handle(GetValue(descriptor_number), GetIsolate()),
3042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch             GetDetails(descriptor_number));
3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
304562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid DescriptorArray::Set(int descriptor_number, Name* key, Object* value,
304662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                          PropertyDetails details) {
3047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Range check.
3048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(descriptor_number < number_of_descriptors());
304962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set(ToKeyIndex(descriptor_number), key);
305062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set(ToValueIndex(descriptor_number), value);
305162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set(ToDetailsIndex(descriptor_number), details.AsSmi());
3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DescriptorArray::Set(int descriptor_number, Descriptor* desc) {
305562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Name* key = *desc->GetKey();
305662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Object* value = *desc->GetValue();
305762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Set(descriptor_number, key, value, desc->GetDetails());
3058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DescriptorArray::Append(Descriptor* desc) {
3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_gc;
3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int descriptor_number = number_of_descriptors();
3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetNumberOfDescriptors(descriptor_number + 1);
3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Set(descriptor_number, desc);
3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t hash = desc->GetKey()->Hash();
3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int insertion;
3070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (insertion = descriptor_number; insertion > 0; --insertion) {
3072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Name* key = GetSortedKey(insertion - 1);
3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (key->Hash() <= hash) break;
3074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    SetSortedKey(insertion, GetSortedKeyIndex(insertion - 1));
3075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetSortedKey(insertion, descriptor_number);
3078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DescriptorArray::SwapSortedKeys(int first, int second) {
3082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int first_key = GetSortedKeyIndex(first);
3083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetSortedKey(first, GetSortedKeyIndex(second));
3084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetSortedKey(second, first_key);
3085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint HashTableBase::NumberOfElements() {
3089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Smi::cast(get(kNumberOfElementsIndex))->value();
3090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint HashTableBase::NumberOfDeletedElements() {
3094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Smi::cast(get(kNumberOfDeletedElementsIndex))->value();
3095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint HashTableBase::Capacity() {
3099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Smi::cast(get(kCapacityIndex))->value();
3100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HashTableBase::ElementAdded() {
3104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SetNumberOfElements(NumberOfElements() + 1);
3105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HashTableBase::ElementRemoved() {
3109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SetNumberOfElements(NumberOfElements() - 1);
3110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SetNumberOfDeletedElements(NumberOfDeletedElements() + 1);
3111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HashTableBase::ElementsRemoved(int n) {
3115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SetNumberOfElements(NumberOfElements() - n);
3116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SetNumberOfDeletedElements(NumberOfDeletedElements() + n);
3117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
3121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint HashTableBase::ComputeCapacity(int at_least_space_for) {
3122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int capacity = base::bits::RoundUpToPowerOfTwo32(at_least_space_for * 2);
3123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Max(capacity, kMinCapacity);
3124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
312613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool HashTableBase::IsKey(Isolate* isolate, Object* k) {
312713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Heap* heap = isolate->heap();
31283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return k != heap->the_hole_value() && k != heap->undefined_value();
31293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
3130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool HashTableBase::IsKey(Object* k) {
313213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate = this->GetIsolate();
313313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return !k->IsTheHole(isolate) && !k->IsUndefined(isolate);
3134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HashTableBase::SetNumberOfElements(int nof) {
3138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(kNumberOfElementsIndex, Smi::FromInt(nof));
3139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HashTableBase::SetNumberOfDeletedElements(int nod) {
3143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(kNumberOfDeletedElementsIndex, Smi::FromInt(nod));
3144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochtemplate <typename Key>
3147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMap* BaseShape<Key>::GetMap(Isolate* isolate) {
3148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return isolate->heap()->hash_table_map();
3149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
3150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Derived, typename Shape, typename Key>
3152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint HashTable<Derived, Shape, Key>::FindEntry(Key key) {
3153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return FindEntry(GetIsolate(), key);
3154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename Derived, typename Shape, typename Key>
3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint HashTable<Derived, Shape, Key>::FindEntry(Isolate* isolate, Key key) {
3159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return FindEntry(isolate, key, HashTable::Hash(key));
3160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Find entry for key otherwise return kNotFound.
3163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Derived, typename Shape, typename Key>
3164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint HashTable<Derived, Shape, Key>::FindEntry(Isolate* isolate, Key key,
316562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                              int32_t hash) {
316662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t capacity = Capacity();
316762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t entry = FirstProbe(hash, capacity);
316862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t count = 1;
316962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // EnsureCapacity will guarantee the hash table is never full.
317062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Object* undefined = isolate->heap()->undefined_value();
317162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Object* the_hole = isolate->heap()->the_hole_value();
317262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  while (true) {
317362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Object* element = KeyAt(entry);
317462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // Empty entry. Uses raw unchecked accessors because it is called by the
317562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // string table during bootstrapping.
317662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (element == undefined) break;
317762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (element != the_hole && Shape::IsMatch(key, element)) return entry;
317862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    entry = NextProbe(entry, count++, capacity);
317962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
318062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return kNotFound;
318162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
318262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
318362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename Derived, typename Shape, typename Key>
318462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HashTable<Derived, Shape, Key>::Has(Key key) {
318562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return FindEntry(key) != kNotFound;
318662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
318762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
318862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <typename Derived, typename Shape, typename Key>
318962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool HashTable<Derived, Shape, Key>::Has(Isolate* isolate, Key key) {
319062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return FindEntry(isolate, key) != kNotFound;
319162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
319262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
319362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool ObjectHashSet::Has(Isolate* isolate, Handle<Object> key, int32_t hash) {
319462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return FindEntry(isolate, key, hash) != kNotFound;
319562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
319662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
319762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool ObjectHashSet::Has(Isolate* isolate, Handle<Object> key) {
319862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Object* hash = key->GetHash();
319962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!hash->IsSmi()) return false;
320062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return FindEntry(isolate, key, Smi::cast(hash)->value()) != kNotFound;
320162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
320262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
320362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool StringSetShape::IsMatch(String* key, Object* value) {
320462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return value->IsString() && key->Equals(String::cast(value));
320562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
320662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
320762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint32_t StringSetShape::Hash(String* key) { return key->Hash(); }
320862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
320962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint32_t StringSetShape::HashForObject(String* key, Object* object) {
321062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return object->IsString() ? String::cast(object)->Hash() : 0;
321162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
321262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
321362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool SeededNumberDictionary::requires_slow_elements() {
321462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Object* max_index_object = get(kMaxNumberKeyIndex);
321562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!max_index_object->IsSmi()) return false;
321662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return 0 !=
321762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
321862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
321962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
322062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
322162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint32_t SeededNumberDictionary::max_number_key() {
322262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(!requires_slow_elements());
322362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Object* max_index_object = get(kMaxNumberKeyIndex);
322462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (!max_index_object->IsSmi()) return 0;
322562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
322662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return value >> kRequiresSlowElementsTagSize;
322762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
322862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
322962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
323062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid SeededNumberDictionary::set_requires_slow_elements() {
323162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
323262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
323362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3235c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochtemplate <class T>
3236c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochPodArray<T>* PodArray<T>::cast(Object* object) {
3237c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  SLOW_DCHECK(object->IsByteArray());
3238c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return reinterpret_cast<PodArray<T>*>(object);
3239c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
3240c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochtemplate <class T>
3241c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochconst PodArray<T>* PodArray<T>::cast(const Object* object) {
3242c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  SLOW_DCHECK(object->IsByteArray());
3243c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return reinterpret_cast<const PodArray<T>*>(object);
3244c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
3245c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
3246c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// static
3247c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochtemplate <class T>
3248c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<PodArray<T>> PodArray<T>::New(Isolate* isolate, int length,
3249c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                     PretenureFlag pretenure) {
3250c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return Handle<PodArray<T>>::cast(
3251c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      isolate->factory()->NewByteArray(length * sizeof(T), pretenure));
3252c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
3255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <class Traits>
3256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSTATIC_CONST_MEMBER_DEFINITION const InstanceType
3257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    FixedTypedArray<Traits>::kInstanceType;
3258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
3261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFixedTypedArray<Traits>* FixedTypedArray<Traits>::cast(Object* object) {
3262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(object->IsHeapObject() &&
3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              HeapObject::cast(object)->map()->instance_type() ==
3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              Traits::kInstanceType);
3265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<FixedTypedArray<Traits>*>(object);
3266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
3270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst FixedTypedArray<Traits>*
3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochFixedTypedArray<Traits>::cast(const Object* object) {
3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(object->IsHeapObject() &&
3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              HeapObject::cast(object)->map()->instance_type() ==
3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              Traits::kInstanceType);
3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<FixedTypedArray<Traits>*>(object);
3276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DEFINE_DEOPT_ELEMENT_ACCESSORS(name, type)       \
3280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  type* DeoptimizationInputData::name() {                \
3281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return type::cast(get(k##name##Index));              \
3282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }                                                      \
3283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DeoptimizationInputData::Set##name(type* value) { \
3284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    set(k##name##Index, value);                          \
3285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(TranslationByteArray, ByteArray)
3288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(InlinedFunctionCount, Smi)
3289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(LiteralArray, FixedArray)
3290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(OsrAstId, Smi)
3291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(OsrPcOffset, Smi)
3292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(OptimizationId, Smi)
3293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(SharedFunctionInfo, Object)
3294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(WeakCellCache, Object)
3295c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochDEFINE_DEOPT_ELEMENT_ACCESSORS(InliningPositions, PodArray<InliningPosition>)
3296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DEFINE_DEOPT_ELEMENT_ACCESSORS
3298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DEFINE_DEOPT_ENTRY_ACCESSORS(name, type)                \
3301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  type* DeoptimizationInputData::name(int i) {                  \
3302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return type::cast(get(IndexForEntry(i) + k##name##Offset)); \
3303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }                                                             \
3304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DeoptimizationInputData::Set##name(int i, type* value) { \
3305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    set(IndexForEntry(i) + k##name##Offset, value);             \
3306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
3307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ENTRY_ACCESSORS(AstIdRaw, Smi)
3309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ENTRY_ACCESSORS(TranslationIndex, Smi)
3310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ENTRY_ACCESSORS(ArgumentsStackHeight, Smi)
3311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_DEOPT_ENTRY_ACCESSORS(Pc, Smi)
3312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DEFINE_DEOPT_ENTRY_ACCESSORS
3314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochBailoutId DeoptimizationInputData::AstId(int i) {
3317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return BailoutId(AstIdRaw(i)->value());
3318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DeoptimizationInputData::SetAstId(int i, BailoutId value) {
3322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SetAstIdRaw(i, Smi::FromInt(value.ToInt()));
3323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint DeoptimizationInputData::DeoptCount() {
3327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return (length() - kFirstDeoptEntryIndex) / kDeoptEntrySize;
3328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint DeoptimizationOutputData::DeoptPoints() { return length() / 2; }
3332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochBailoutId DeoptimizationOutputData::AstId(int index) {
3335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return BailoutId(Smi::cast(get(index * 2))->value());
3336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DeoptimizationOutputData::SetAstId(int index, BailoutId id) {
3340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(index * 2, Smi::FromInt(id.ToInt()));
3341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSmi* DeoptimizationOutputData::PcAndState(int index) {
3345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Smi::cast(get(1 + index * 2));
3346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DeoptimizationOutputData::SetPcAndState(int index, Smi* offset) {
3350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(1 + index * 2, offset);
3351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3353109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint HandlerTable::GetRangeStart(int index) const {
3354109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return Smi::cast(get(index * kRangeEntrySize + kRangeStartIndex))->value();
3355109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
3356109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3357109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint HandlerTable::GetRangeEnd(int index) const {
3358109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return Smi::cast(get(index * kRangeEntrySize + kRangeEndIndex))->value();
3359109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
3360109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3361109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint HandlerTable::GetRangeHandler(int index) const {
3362109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return HandlerOffsetField::decode(
3363109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      Smi::cast(get(index * kRangeEntrySize + kRangeHandlerIndex))->value());
3364109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
3365109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3366109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint HandlerTable::GetRangeData(int index) const {
3367109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return Smi::cast(get(index * kRangeEntrySize + kRangeDataIndex))->value();
3368109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
3369109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
3370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HandlerTable::SetRangeStart(int index, int value) {
3371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(index * kRangeEntrySize + kRangeStartIndex, Smi::FromInt(value));
3372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HandlerTable::SetRangeEnd(int index, int value) {
3376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(index * kRangeEntrySize + kRangeEndIndex, Smi::FromInt(value));
3377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HandlerTable::SetRangeHandler(int index, int offset,
3381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                   CatchPrediction prediction) {
3382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int value = HandlerOffsetField::encode(offset) |
3383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              HandlerPredictionField::encode(prediction);
3384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(index * kRangeEntrySize + kRangeHandlerIndex, Smi::FromInt(value));
3385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3387109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid HandlerTable::SetRangeData(int index, int value) {
3388109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  set(index * kRangeEntrySize + kRangeDataIndex, Smi::FromInt(value));
3389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid HandlerTable::SetReturnOffset(int index, int value) {
3393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(index * kReturnEntrySize + kReturnOffsetIndex, Smi::FromInt(value));
3394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid HandlerTable::SetReturnHandler(int index, int offset) {
3397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int value = HandlerOffsetField::encode(offset);
3398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(index * kReturnEntrySize + kReturnHandlerIndex, Smi::FromInt(value));
3399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3401109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint HandlerTable::NumberOfRangeEntries() const {
3402109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return length() / kRangeEntrySize;
3403109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
3404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename Derived, typename Shape, typename Key>
3406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHashTable<Derived, Shape, Key>*
3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHashTable<Derived, Shape, Key>::cast(Object* obj) {
3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(obj->IsHashTable());
3409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<HashTable*>(obj);
3410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename Derived, typename Shape, typename Key>
3414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst HashTable<Derived, Shape, Key>*
3415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHashTable<Derived, Shape, Key>::cast(const Object* obj) {
3416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(obj->IsHashTable());
3417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<const HashTable*>(obj);
3418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34213fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochSMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
3422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSYNCHRONIZED_SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
3423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(FreeSpace, size, kSizeOffset)
3425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochNOBARRIER_SMI_ACCESSORS(FreeSpace, size, kSizeOffset)
3426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(String, length, kLengthOffset)
3428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSYNCHRONIZED_SMI_ACCESSORS(String, length, kLengthOffset)
3429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint FreeSpace::Size() { return size(); }
3432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochFreeSpace* FreeSpace::next() {
3435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(map() == GetHeap()->root(Heap::kFreeSpaceMapRootIndex) ||
3436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         (!GetHeap()->deserialization_complete() && map() == NULL));
3437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_LE(kNextOffset + kPointerSize, nobarrier_size());
3438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return reinterpret_cast<FreeSpace*>(
3439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Memory::Address_at(address() + kNextOffset));
3440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid FreeSpace::set_next(FreeSpace* next) {
3444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(map() == GetHeap()->root(Heap::kFreeSpaceMapRootIndex) ||
3445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         (!GetHeap()->deserialization_complete() && map() == NULL));
3446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_LE(kNextOffset + kPointerSize, nobarrier_size());
3447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  base::NoBarrier_Store(
3448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      reinterpret_cast<base::AtomicWord*>(address() + kNextOffset),
3449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      reinterpret_cast<base::AtomicWord>(next));
3450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
3453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochFreeSpace* FreeSpace::cast(HeapObject* o) {
3454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SLOW_DCHECK(!o->GetHeap()->deserialization_complete() || o->IsFreeSpace());
3455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return reinterpret_cast<FreeSpace*>(o);
3456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
3457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t Name::hash_field() {
3460d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return READ_UINT32_FIELD(this, kHashFieldOffset);
3461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Name::set_hash_field(uint32_t value) {
3465d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  WRITE_UINT32_FIELD(this, kHashFieldOffset, value);
34667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_64_BIT
3467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_LITTLE_ENDIAN
3468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  WRITE_UINT32_FIELD(this, kHashFieldSlot + kIntSize, 0);
3469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else
3470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  WRITE_UINT32_FIELD(this, kHashFieldSlot, 0);
3471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
34727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif
3473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Name::Equals(Name* other) {
3477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (other == this) return true;
3478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((this->IsInternalizedString() && other->IsInternalizedString()) ||
3479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this->IsSymbol() || other->IsSymbol()) {
3480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
3481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return String::cast(this)->SlowEquals(String::cast(other));
3483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Name::Equals(Handle<Name> one, Handle<Name> two) {
3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (one.is_identical_to(two)) return true;
3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((one->IsInternalizedString() && two->IsInternalizedString()) ||
3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      one->IsSymbol() || two->IsSymbol()) {
3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return String::SlowEquals(Handle<String>::cast(one),
3493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            Handle<String>::cast(two));
3494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(Symbol, name, Object, kNameOffset)
3498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(Symbol, flags, kFlagsOffset)
3499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBOOL_ACCESSORS(Symbol, flags, is_private, kPrivateBit)
3500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochBOOL_ACCESSORS(Symbol, flags, is_well_known_symbol, kWellKnownSymbolBit)
350162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(Symbol, flags, is_public, kPublicBit)
3502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3503d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockbool String::Equals(String* other) {
3504d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  if (other == this) return true;
3505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (this->IsInternalizedString() && other->IsInternalizedString()) {
3506d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return false;
3507d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
3508d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return SlowEquals(other);
3509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool String::Equals(Handle<String> one, Handle<String> two) {
3513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (one.is_identical_to(two)) return true;
3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (one->IsInternalizedString() && two->IsInternalizedString()) {
3515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return SlowEquals(one, two);
3518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> String::Flatten(Handle<String> string, PretenureFlag pretenure) {
352262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (string->IsConsString()) {
352362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<ConsString> cons = Handle<ConsString>::cast(string);
352462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (cons->IsFlat()) {
352562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      string = handle(cons->first());
352662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    } else {
352762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return SlowFlatten(cons, pretenure);
352862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
352962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
353062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (string->IsThinString()) {
353162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    string = handle(Handle<ThinString>::cast(string)->actual());
353262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    DCHECK(!string->IsConsString());
353362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
353462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return string;
3535f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke}
3536f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
3537f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
3538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t String::Get(int index) {
3539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < length());
3540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (StringShape(this).full_representation_tag()) {
3541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kSeqStringTag | kOneByteStringTag:
3542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return SeqOneByteString::cast(this)->SeqOneByteStringGet(index);
3543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kSeqStringTag | kTwoByteStringTag:
3544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
3545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kConsStringTag | kOneByteStringTag:
3546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kConsStringTag | kTwoByteStringTag:
3547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return ConsString::cast(this)->ConsStringGet(index);
3548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kExternalStringTag | kOneByteStringTag:
3549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return ExternalOneByteString::cast(this)->ExternalOneByteStringGet(index);
3550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case kExternalStringTag | kTwoByteStringTag:
3551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
3552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case kSlicedStringTag | kOneByteStringTag:
355369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    case kSlicedStringTag | kTwoByteStringTag:
355469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      return SlicedString::cast(this)->SlicedStringGet(index);
355562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case kThinStringTag | kOneByteStringTag:
355662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case kThinStringTag | kTwoByteStringTag:
355762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return ThinString::cast(this)->ThinStringGet(index);
3558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
3559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      break;
3560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
3561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  UNREACHABLE();
3563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return 0;
3564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid String::Set(int index, uint16_t value) {
3568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < length());
3569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(StringShape(this).IsSequential());
3570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return this->IsOneByteRepresentation()
3572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ? SeqOneByteString::cast(this)->SeqOneByteStringSet(index, value)
3573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value);
3574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsFlat() {
357869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (!StringShape(this).IsCons()) return true;
357969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return ConsString::cast(this)->second()->length() == 0;
358069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
358169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
358269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
358369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochString* String::GetUnderlying() {
358469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Giving direct access to underlying string only makes sense if the
358569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // wrapping string is already flattened.
3586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(this->IsFlat());
3587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(StringShape(this).IsIndirect());
358869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset);
358962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(ConsString::kFirstOffset == ThinString::kActualOffset);
359069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  const int kUnderlyingOffset = SlicedString::kParentOffset;
359169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return String::cast(READ_FIELD(this, kUnderlyingOffset));
3592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Visitor>
3596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochConsString* String::VisitFlat(Visitor* visitor,
3597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              String* string,
3598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                              const int offset) {
3599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int slice_offset = offset;
3600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int length = string->length();
3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(offset <= length);
3602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  while (true) {
3603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int32_t type = string->map()->instance_type();
3604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    switch (type & (kStringRepresentationMask | kStringEncodingMask)) {
3605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kSeqStringTag | kOneByteStringTag:
3606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        visitor->VisitOneByteString(
3607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            SeqOneByteString::cast(string)->GetChars() + slice_offset,
3608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            length - offset);
3609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return NULL;
3610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kSeqStringTag | kTwoByteStringTag:
3612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        visitor->VisitTwoByteString(
3613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            SeqTwoByteString::cast(string)->GetChars() + slice_offset,
3614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            length - offset);
3615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return NULL;
3616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kExternalStringTag | kOneByteStringTag:
3618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        visitor->VisitOneByteString(
3619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            ExternalOneByteString::cast(string)->GetChars() + slice_offset,
3620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            length - offset);
3621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return NULL;
3622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kExternalStringTag | kTwoByteStringTag:
3624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        visitor->VisitTwoByteString(
3625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            ExternalTwoByteString::cast(string)->GetChars() + slice_offset,
3626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            length - offset);
3627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return NULL;
3628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kSlicedStringTag | kOneByteStringTag:
3630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kSlicedStringTag | kTwoByteStringTag: {
3631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        SlicedString* slicedString = SlicedString::cast(string);
3632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        slice_offset += slicedString->offset();
3633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        string = slicedString->parent();
3634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        continue;
3635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
3636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kConsStringTag | kOneByteStringTag:
3638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      case kConsStringTag | kTwoByteStringTag:
3639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return ConsString::cast(string);
3640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
364162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case kThinStringTag | kOneByteStringTag:
364262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case kThinStringTag | kTwoByteStringTag:
364362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        string = ThinString::cast(string)->actual();
364462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        continue;
364562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
3646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      default:
3647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        UNREACHABLE();
3648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        return NULL;
3649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
3650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
3651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <>
3655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierinline Vector<const uint8_t> String::GetCharVector() {
3656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  String::FlatContent flat = GetFlatContent();
3657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(flat.IsOneByte());
3658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return flat.ToOneByteVector();
3659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
3660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <>
3663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierinline Vector<const uc16> String::GetCharVector() {
3664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  String::FlatContent flat = GetFlatContent();
3665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(flat.IsTwoByte());
3666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return flat.ToUC16Vector();
3667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
3668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
366962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochuint32_t String::ToValidIndex(Object* number) {
367062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t index = PositiveNumberToUint32(number);
367162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t length_value = static_cast<uint32_t>(length());
367262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (index > length_value) return length_value;
367362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return index;
367462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
3675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint16_t SeqOneByteString::SeqOneByteStringGet(int index) {
3677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < length());
3678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
3679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SeqOneByteString::SeqOneByteStringSet(int index, uint16_t value) {
3683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < length() && value <= kMaxOneByteCharCode);
3684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize,
3685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block                   static_cast<byte>(value));
3686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochAddress SeqOneByteString::GetCharsAddress() {
3690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
3691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint8_t* SeqOneByteString::GetChars() {
3695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<uint8_t*>(GetCharsAddress());
3696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqTwoByteString::GetCharsAddress() {
3700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
3701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc16* SeqTwoByteString::GetChars() {
3705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize));
3706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) {
3710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < length());
3711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_UINT16_FIELD(this, kHeaderSize + index * kShortSize);
3712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) {
3716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < length());
3717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_UINT16_FIELD(this, kHeaderSize + index * kShortSize, value);
3718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) {
37226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return SizeFor(length());
3723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint SeqOneByteString::SeqOneByteStringSize(InstanceType instance_type) {
37276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return SizeFor(length());
3728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
373169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochString* SlicedString::parent() {
373269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return String::cast(READ_FIELD(this, kParentOffset));
373369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
373469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
373569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SlicedString::set_parent(String* parent, WriteBarrierMode mode) {
3737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(parent->IsSeqString() || parent->IsExternalString());
373869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  WRITE_FIELD(this, kParentOffset, parent);
3739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kParentOffset, parent, mode);
374069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
374169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
374269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
374369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochSMI_ACCESSORS(SlicedString, offset, kOffsetOffset)
374469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
374569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::first() {
3747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return String::cast(READ_FIELD(this, kFirstOffset));
3748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_first() {
3752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kFirstOffset);
3753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_first(String* value, WriteBarrierMode mode) {
3757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kFirstOffset, value);
37583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode);
3759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::second() {
3763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return String::cast(READ_FIELD(this, kSecondOffset));
3764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_second() {
3768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kSecondOffset);
3769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_second(String* value, WriteBarrierMode mode) {
3773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kSecondOffset, value);
37743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode);
37753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
37763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
377762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(ThinString, actual, String, kActualOffset);
37783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
37793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool ExternalString::is_short() {
37803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InstanceType type = map()->instance_type();
37813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (type & kShortExternalStringMask) == kShortExternalStringTag;
3782592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}
3783592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3784592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch
3785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst ExternalOneByteString::Resource* ExternalOneByteString::resource() {
3786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
3787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ExternalOneByteString::update_data_cache() {
37913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (is_short()) return;
37923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const char** data_field =
37933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset));
37943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  *data_field = resource()->data();
37953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
37963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
37973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ExternalOneByteString::set_resource(
3799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const ExternalOneByteString::Resource* resource) {
3800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsAligned(reinterpret_cast<intptr_t>(resource), kPointerSize));
38013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  *reinterpret_cast<const Resource**>(
38023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      FIELD_ADDR(this, kResourceOffset)) = resource;
38033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (resource != NULL) update_data_cache();
38043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
38053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
38063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint8_t* ExternalOneByteString::GetChars() {
3808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<const uint8_t*>(resource()->data());
3809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint16_t ExternalOneByteString::ExternalOneByteStringGet(int index) {
3813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < length());
3814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetChars()[index];
3815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst ExternalTwoByteString::Resource* ExternalTwoByteString::resource() {
3819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
3820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ExternalTwoByteString::update_data_cache() {
3824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (is_short()) return;
3825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const uint16_t** data_field =
3826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset));
3827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  *data_field = resource()->data();
3828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ExternalTwoByteString::set_resource(
3832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const ExternalTwoByteString::Resource* resource) {
3833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  *reinterpret_cast<const Resource**>(
3834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      FIELD_ADDR(this, kResourceOffset)) = resource;
3835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (resource != NULL) update_data_cache();
3836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint16_t* ExternalTwoByteString::GetChars() {
3840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return resource()->data();
3841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) {
3845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < length());
3846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetChars()[index];
3847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData(
3851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      unsigned start) {
3852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetChars() + start;
3853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint ConsStringIterator::OffsetForDepth(int depth) { return depth & kDepthMask; }
3857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid ConsStringIterator::PushLeft(ConsString* string) {
3860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  frames_[depth_++ & kDepthMask] = string;
3861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid ConsStringIterator::PushRight(ConsString* string) {
3865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Inplace update.
3866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  frames_[(depth_-1) & kDepthMask] = string;
3867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
3868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid ConsStringIterator::AdjustMaximumDepth() {
3871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (depth_ > maximum_depth_) maximum_depth_ = depth_;
3872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid ConsStringIterator::Pop() {
3876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(depth_ > 0);
3877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(depth_ <= maximum_depth_);
3878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  depth_--;
38793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
38803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
38813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint16_t StringCharacterStream::GetNext() {
3883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(buffer8_ != NULL && end_ != NULL);
3884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Advance cursor if needed.
3885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (buffer8_ == end_) HasMore();
3886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(buffer8_ < end_);
3887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return is_one_byte_ ? *buffer8_++ : *buffer16_++;
3888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierStringCharacterStream::StringCharacterStream(String* string, int offset)
3892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    : is_one_byte_(false) {
3893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Reset(string, offset);
38943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
38953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
38963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StringCharacterStream::Reset(String* string, int offset) {
3898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  buffer8_ = NULL;
3899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  end_ = NULL;
3900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConsString* cons_string = String::VisitFlat(this, string, offset);
3901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  iter_.Reset(cons_string, offset);
3902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (cons_string != NULL) {
3903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    string = iter_.Next(&offset);
3904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (string != NULL) String::VisitFlat(this, string, offset);
3905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
39063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
39073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
39083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool StringCharacterStream::HasMore() {
3910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (buffer8_ != end_) return true;
3911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int offset;
3912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  String* string = iter_.Next(&offset);
3913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(offset, 0);
3914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (string == NULL) return false;
3915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  String::VisitFlat(this, string);
3916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(buffer8_ != end_);
3917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
39183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
39193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
39203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StringCharacterStream::VisitOneByteString(
3922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const uint8_t* chars, int length) {
3923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  is_one_byte_ = true;
3924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  buffer8_ = chars;
3925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  end_ = chars + length;
39263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
39273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
39283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StringCharacterStream::VisitTwoByteString(
3930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    const uint16_t* chars, int length) {
3931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  is_one_byte_ = false;
3932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  buffer16_ = chars;
3933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  end_ = reinterpret_cast<const uint8_t*>(chars + length);
3934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint ByteArray::Size() { return RoundUp(length() + kHeaderSize, kPointerSize); }
3938b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
3939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte ByteArray::get(int index) {
3940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < this->length());
3941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
3942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ByteArray::set(int index, byte value) {
3945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= 0 && index < this->length());
3946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
3947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3949bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid ByteArray::copy_in(int index, const byte* buffer, int length) {
3950c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(index >= 0 && length >= 0 && length <= kMaxInt - index &&
3951bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         index + length <= this->length());
3952bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  byte* dst_addr = FIELD_ADDR(this, kHeaderSize + index * kCharSize);
3953bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  memcpy(dst_addr, buffer, length);
3954bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
3955bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
3956bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid ByteArray::copy_out(int index, byte* buffer, int length) {
3957c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(index >= 0 && length >= 0 && length <= kMaxInt - index &&
3958bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         index + length <= this->length());
3959bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  const byte* src_addr = FIELD_ADDR(this, kHeaderSize + index * kCharSize);
3960bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  memcpy(buffer, src_addr, length);
3961bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
3962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint ByteArray::get_int(int index) {
3964bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(index >= 0 && index < this->length() / kIntSize);
3965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_INT_FIELD(this, kHeaderSize + index * kIntSize);
3966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3968bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid ByteArray::set_int(int index, int value) {
3969bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(index >= 0 && index < this->length() / kIntSize);
3970bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  WRITE_INT_FIELD(this, kHeaderSize + index * kIntSize, value);
3971bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
3972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockByteArray* ByteArray::FromDataStartAddress(Address address) {
3974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_TAG_ALIGNED(address);
3975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
3976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
3977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
3979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint ByteArray::ByteArraySize() { return SizeFor(this->length()); }
39803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
39813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochAddress ByteArray::GetDataStartAddress() {
3983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
398469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
398569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
398669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
3987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbyte BytecodeArray::get(int index) {
3988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(index >= 0 && index < this->length());
3989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
39903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
39913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
39923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BytecodeArray::set(int index, byte value) {
3994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(index >= 0 && index < this->length());
3995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
39963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
39973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
39983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
3999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BytecodeArray::set_frame_size(int frame_size) {
4000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_GE(frame_size, 0);
4001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsAligned(frame_size, static_cast<unsigned>(kPointerSize)));
4002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_INT_FIELD(this, kFrameSizeOffset, frame_size);
400369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
400469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
400569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint BytecodeArray::frame_size() const {
4007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_INT_FIELD(this, kFrameSizeOffset);
40083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
40093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
40103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint BytecodeArray::register_count() const {
4012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return frame_size() / kPointerSize;
40133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
40143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
40153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BytecodeArray::set_parameter_count(int number_of_parameters) {
4017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_GE(number_of_parameters, 0);
4018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Parameter count is stored as the size on stack of the parameters to allow
4019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // it to be used directly by generated code.
4020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_INT_FIELD(this, kParameterSizeOffset,
4021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  (number_of_parameters << kPointerSizeLog2));
402269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
402369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4024109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochint BytecodeArray::interrupt_budget() const {
4025109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return READ_INT_FIELD(this, kInterruptBudgetOffset);
4026109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
4027109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
4028109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid BytecodeArray::set_interrupt_budget(int interrupt_budget) {
4029109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK_GE(interrupt_budget, 0);
4030109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  WRITE_INT_FIELD(this, kInterruptBudgetOffset, interrupt_budget);
4031109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
403269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4033f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochint BytecodeArray::osr_loop_nesting_level() const {
4034f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return READ_INT8_FIELD(this, kOSRNestingLevelOffset);
4035f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
4036f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4037f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid BytecodeArray::set_osr_loop_nesting_level(int depth) {
4038f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(0 <= depth && depth <= AbstractCode::kMaxLoopNestingMarker);
4039f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  STATIC_ASSERT(AbstractCode::kMaxLoopNestingMarker < kMaxInt8);
4040f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  WRITE_INT8_FIELD(this, kOSRNestingLevelOffset, depth);
4041f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
4042f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
404362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBytecodeArray::Age BytecodeArray::bytecode_age() const {
404462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return static_cast<Age>(READ_INT8_FIELD(this, kBytecodeAgeOffset));
404562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
404662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
404762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid BytecodeArray::set_bytecode_age(BytecodeArray::Age age) {
404862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_GE(age, kFirstBytecodeAge);
404962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_LE(age, kLastBytecodeAge);
405062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  STATIC_ASSERT(kLastBytecodeAge <= kMaxInt8);
405162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  WRITE_INT8_FIELD(this, kBytecodeAgeOffset, static_cast<int8_t>(age));
405262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
405362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint BytecodeArray::parameter_count() const {
4055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Parameter count is stored as the size on stack of the parameters to allow
4056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // it to be used directly by generated code.
4057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_INT_FIELD(this, kParameterSizeOffset) >> kPointerSizeLog2;
40583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
40593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(BytecodeArray, constant_pool, FixedArray, kConstantPoolOffset)
4061109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochACCESSORS(BytecodeArray, handler_table, FixedArray, kHandlerTableOffset)
40623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochACCESSORS(BytecodeArray, source_position_table, ByteArray,
4063109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch          kSourcePositionTableOffset)
40643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochAddress BytecodeArray::GetFirstBytecodeAddress() {
4066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
406769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
406869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
406969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint BytecodeArray::BytecodeArraySize() { return SizeFor(this->length()); }
40713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
407213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochint BytecodeArray::SizeIncludingMetadata() {
407313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  int size = BytecodeArraySize();
407413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  size += constant_pool()->Size();
407513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  size += handler_table()->Size();
407613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  size += source_position_table()->Size();
407713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return size;
407813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
40793bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
4080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(FixedTypedArrayBase, base_pointer, Object, kBasePointerOffset)
4081257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4082257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* FixedTypedArrayBase::external_pointer() const {
4084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
4085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return reinterpret_cast<void*>(ptr);
408669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
408769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
408869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
4089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid FixedTypedArrayBase::set_external_pointer(void* value,
4090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               WriteBarrierMode mode) {
4091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  intptr_t ptr = reinterpret_cast<intptr_t>(value);
4092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
4093257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
4094257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4095257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid* FixedTypedArrayBase::DataPtr() {
4097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return reinterpret_cast<void*>(
4098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      reinterpret_cast<intptr_t>(base_pointer()) +
4099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      reinterpret_cast<intptr_t>(external_pointer()));
4100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint FixedTypedArrayBase::ElementSize(InstanceType type) {
4104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int element_size;
4105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (type) {
4106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size)                       \
4107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    case FIXED_##TYPE##_ARRAY_TYPE:                                           \
4108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      element_size = size;                                                    \
4109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      break;
4110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    TYPED_ARRAYS(TYPED_ARRAY_CASE)
4112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef TYPED_ARRAY_CASE
4113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default:
4114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      UNREACHABLE();
4115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 0;
4116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return element_size;
4118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint FixedTypedArrayBase::DataSize(InstanceType type) {
4122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (base_pointer() == Smi::kZero) return 0;
4123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return length() * ElementSize(type);
4124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint FixedTypedArrayBase::DataSize() {
4128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DataSize(map()->instance_type());
4129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint FixedTypedArrayBase::size() {
4133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OBJECT_POINTER_ALIGN(kDataOffset + DataSize());
4134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint FixedTypedArrayBase::TypedArraySize(InstanceType type) {
4138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OBJECT_POINTER_ALIGN(kDataOffset + DataSize(type));
4139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint FixedTypedArrayBase::TypedArraySize(InstanceType type, int length) {
4143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return OBJECT_POINTER_ALIGN(kDataOffset + length * ElementSize(type));
4144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint8_t Uint8ArrayTraits::defaultValue() { return 0; }
4148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint8_t Uint8ClampedArrayTraits::defaultValue() { return 0; }
4151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint8_t Int8ArrayTraits::defaultValue() { return 0; }
4154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint16_t Uint16ArrayTraits::defaultValue() { return 0; }
4157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint16_t Int16ArrayTraits::defaultValue() { return 0; }
4160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t Uint32ArrayTraits::defaultValue() { return 0; }
4163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint32_t Int32ArrayTraits::defaultValue() { return 0; }
4166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfloat Float32ArrayTraits::defaultValue() {
4169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return std::numeric_limits<float>::quiet_NaN();
4170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdouble Float64ArrayTraits::defaultValue() {
4174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return std::numeric_limits<double>::quiet_NaN();
4175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
4179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) {
4180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((index >= 0) && (index < this->length()));
4181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ElementType* ptr = reinterpret_cast<ElementType*>(DataPtr());
4182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ptr[index];
4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
4187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid FixedTypedArray<Traits>::set(int index, ElementType value) {
4188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((index >= 0) && (index < this->length()));
4189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ElementType* ptr = reinterpret_cast<ElementType*>(DataPtr());
4190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ptr[index] = value;
4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
4195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename Traits::ElementType FixedTypedArray<Traits>::from_int(int value) {
4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<ElementType>(value);
4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <> inline
4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint8_t FixedTypedArray<Uint8ClampedArrayTraits>::from_int(int value) {
4202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value < 0) return 0;
4203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value > 0xFF) return 0xFF;
4204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<uint8_t>(value);
4205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
4209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypename Traits::ElementType FixedTypedArray<Traits>::from_double(
4210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    double value) {
4211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<ElementType>(DoubleToInt32(value));
4212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<> inline
4216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint8_t FixedTypedArray<Uint8ClampedArrayTraits>::from_double(double value) {
4217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Handle NaNs and less than zero values which clamp to zero.
4218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (!(value > 0)) return 0;
4219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value > 0xFF) return 0xFF;
4220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<uint8_t>(lrint(value));
4221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<> inline
4225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochfloat FixedTypedArray<Float32ArrayTraits>::from_double(double value) {
4226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<float>(value);
4227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<> inline
4231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdouble FixedTypedArray<Float64ArrayTraits>::from_double(double value) {
4232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return value;
4233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
4236109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<Object> FixedTypedArray<Traits>::get(FixedTypedArray<Traits>* array,
4237109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                            int index) {
4238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Traits::ToHandle(array->GetIsolate(), array->get_scalar(index));
4239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits>
4243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid FixedTypedArray<Traits>::SetValue(uint32_t index, Object* value) {
4244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ElementType cast_value = Traits::defaultValue();
4245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (value->IsSmi()) {
4246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int int_value = Smi::cast(value)->value();
4247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    cast_value = from_int(int_value);
4248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (value->IsHeapNumber()) {
4249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    double double_value = HeapNumber::cast(value)->value();
4250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    cast_value = from_double(double_value);
4251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
4252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Clamp undefined to the default value. All other types have been
4253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // converted to a number type further up in the call chain.
425413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    DCHECK(value->IsUndefined(GetIsolate()));
4255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(index, cast_value);
4257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) {
4261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return handle(Smi::FromInt(scalar), isolate);
4262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Uint8ClampedArrayTraits::ToHandle(Isolate* isolate,
4266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                 uint8_t scalar) {
4267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return handle(Smi::FromInt(scalar), isolate);
4268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Int8ArrayTraits::ToHandle(Isolate* isolate, int8_t scalar) {
4272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return handle(Smi::FromInt(scalar), isolate);
4273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Uint16ArrayTraits::ToHandle(Isolate* isolate, uint16_t scalar) {
4277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return handle(Smi::FromInt(scalar), isolate);
4278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Int16ArrayTraits::ToHandle(Isolate* isolate, int16_t scalar) {
4282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return handle(Smi::FromInt(scalar), isolate);
4283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Uint32ArrayTraits::ToHandle(Isolate* isolate, uint32_t scalar) {
4287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return isolate->factory()->NewNumberFromUint(scalar);
4288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Int32ArrayTraits::ToHandle(Isolate* isolate, int32_t scalar) {
4292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return isolate->factory()->NewNumberFromInt(scalar);
4293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Float32ArrayTraits::ToHandle(Isolate* isolate, float scalar) {
4297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return isolate->factory()->NewNumber(scalar);
4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Float64ArrayTraits::ToHandle(Isolate* isolate, double scalar) {
4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return isolate->factory()->NewNumber(scalar);
4303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
43069ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickint Map::visitor_id() {
43079ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick  return READ_BYTE_FIELD(this, kVisitorIdOffset);
43089ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick}
43099ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
43109ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
43119ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickvoid Map::set_visitor_id(int id) {
4312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= id && id < 256);
43139ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick  WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id));
43149ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick}
43159ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick
43163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
4317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::instance_size() {
4318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return NOBARRIER_READ_BYTE_FIELD(
4319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this, kInstanceSizeOffset) << kPointerSizeLog2;
4320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Map::inobject_properties_or_constructor_function_index() {
4324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_BYTE_FIELD(this,
4325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         kInObjectPropertiesOrConstructorFunctionIndexOffset);
4326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_inobject_properties_or_constructor_function_index(int value) {
4330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(0 <= value && value < 256);
4331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_BYTE_FIELD(this, kInObjectPropertiesOrConstructorFunctionIndexOffset,
4332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   static_cast<byte>(value));
4333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Map::GetInObjectProperties() {
4337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsJSObjectMap());
4338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return inobject_properties_or_constructor_function_index();
4339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::SetInObjectProperties(int value) {
4343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsJSObjectMap());
4344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_inobject_properties_or_constructor_function_index(value);
4345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Map::GetConstructorFunctionIndex() {
4349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsPrimitiveMap());
4350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return inobject_properties_or_constructor_function_index();
4351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::SetConstructorFunctionIndex(int value) {
4355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsPrimitiveMap());
4356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_inobject_properties_or_constructor_function_index(value);
4357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint Map::GetInObjectPropertyOffset(int index) {
4361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Adjust for the number of properties stored in the object.
4362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  index -= GetInObjectProperties();
4363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index <= 0);
4364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return instance_size() + (index * kPointerSize);
4365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Map> Map::AddMissingTransitionsForTesting(
4369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<Map> split_map, Handle<DescriptorArray> descriptors,
4370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<LayoutDescriptor> full_layout_descriptor) {
4371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AddMissingTransitions(split_map, descriptors, full_layout_descriptor);
4372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
4373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::SizeFromMap(Map* map) {
4376791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  int instance_size = map->instance_size();
4377791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  if (instance_size != kVariableSizeSentinel) return instance_size;
4378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Only inline the most frequent cases.
4379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  InstanceType instance_type = map->instance_type();
4380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instance_type == FIXED_ARRAY_TYPE ||
4381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      instance_type == TRANSITION_ARRAY_TYPE) {
4382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return FixedArray::SizeFor(
4383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        reinterpret_cast<FixedArray*>(this)->synchronized_length());
4384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instance_type == ONE_BYTE_STRING_TYPE ||
4386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instance_type == ONE_BYTE_INTERNALIZED_STRING_TYPE) {
4387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Strings may get concurrently truncated, hence we have to access its
4388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // length synchronized.
4389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return SeqOneByteString::SizeFor(
4390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        reinterpret_cast<SeqOneByteString*>(this)->synchronized_length());
4391791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  }
4392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (instance_type == BYTE_ARRAY_TYPE) {
4393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    return reinterpret_cast<ByteArray*>(this)->ByteArraySize();
4394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (instance_type == BYTECODE_ARRAY_TYPE) {
4396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return reinterpret_cast<BytecodeArray*>(this)->BytecodeArraySize();
4397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
43983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (instance_type == FREE_SPACE_TYPE) {
4399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<FreeSpace*>(this)->nobarrier_size();
44003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
4401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instance_type == STRING_TYPE ||
4402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instance_type == INTERNALIZED_STRING_TYPE) {
4403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // Strings may get concurrently truncated, hence we have to access its
4404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    // length synchronized.
4405791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block    return SeqTwoByteString::SizeFor(
4406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        reinterpret_cast<SeqTwoByteString*>(this)->synchronized_length());
4407791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  }
44083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
44093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return FixedDoubleArray::SizeFor(
44103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch        reinterpret_cast<FixedDoubleArray*>(this)->length());
44113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
4412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
4413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) {
4414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<FixedTypedArrayBase*>(
4415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        this)->TypedArraySize(instance_type);
4416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(instance_type == CODE_TYPE);
4418791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return reinterpret_cast<Code*>(this)->CodeSize();
4419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_size(int value) {
4423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(0, value & (kPointerSize - 1));
4424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  value >>= kPointerSizeLog2;
4425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(0 <= value && value < 256);
4426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NOBARRIER_WRITE_BYTE_FIELD(
4427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      this, kInstanceSizeOffset, static_cast<byte>(value));
4428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::clear_unused() { WRITE_BYTE_FIELD(this, kUnusedOffset, 0); }
4432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInstanceType Map::instance_type() {
4435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
4436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_type(InstanceType value) {
4440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
4441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::unused_property_fields() {
4445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset);
4446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_unused_property_fields(int value) {
4450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255));
4451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbyte Map::bit_field() const { return READ_BYTE_FIELD(this, kBitFieldOffset); }
4455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field(byte value) {
4458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kBitFieldOffset, value);
4459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbyte Map::bit_field2() const { return READ_BYTE_FIELD(this, kBitField2Offset); }
4463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field2(byte value) {
4466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_BYTE_FIELD(this, kBitField2Offset, value);
4467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::set_non_instance_prototype(bool value) {
4471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value) {
4472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_bit_field(bit_field() | (1 << kHasNonInstancePrototype));
4473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
4474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype));
4475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::has_non_instance_prototype() {
4480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ((1 << kHasNonInstancePrototype) & bit_field()) != 0;
4481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4484109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Map::set_is_constructor(bool value) {
4485109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (value) {
4486109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    set_bit_field(bit_field() | (1 << kIsConstructor));
4487109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  } else {
4488109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    set_bit_field(bit_field() & ~(1 << kIsConstructor));
4489109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
4490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::is_constructor() const {
4494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ((1 << kIsConstructor) & bit_field()) != 0;
4495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4497109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Map::set_has_hidden_prototype(bool value) {
4498109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  set_bit_field3(HasHiddenPrototype::update(bit_field3(), value));
4499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4501109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Map::has_hidden_prototype() const {
4502109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return HasHiddenPrototype::decode(bit_field3());
4503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_has_indexed_interceptor() {
4507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field(bit_field() | (1 << kHasIndexedInterceptor));
4508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_indexed_interceptor() {
4512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ((1 << kHasIndexedInterceptor) & bit_field()) != 0;
4513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_is_undetectable() {
4517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field(bit_field() | (1 << kIsUndetectable));
4518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::is_undetectable() {
4522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ((1 << kIsUndetectable) & bit_field()) != 0;
4523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_has_named_interceptor() {
4527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field(bit_field() | (1 << kHasNamedInterceptor));
4528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_named_interceptor() {
4532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ((1 << kHasNamedInterceptor) & bit_field()) != 0;
4533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::set_is_access_check_needed(bool access_check_needed) {
4537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (access_check_needed) {
4538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded));
4539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
4540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded));
4541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::is_access_check_needed() {
4546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0;
4547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::set_is_extensible(bool value) {
4551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value) {
4552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_bit_field2(bit_field2() | (1 << kIsExtensible));
4553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } else {
4554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_bit_field2(bit_field2() & ~(1 << kIsExtensible));
4555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::is_extensible() {
4559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ((1 << kIsExtensible) & bit_field2()) != 0;
4560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::set_is_prototype_map(bool value) {
4564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_bit_field2(IsPrototypeMapBits::update(bit_field2(), value));
4565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::is_prototype_map() const {
4568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsPrototypeMapBits::decode(bit_field2());
4569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
457113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool Map::should_be_fast_prototype_map() const {
457213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (!prototype_info()->IsPrototypeInfo()) return false;
457313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return PrototypeInfo::cast(prototype_info())->should_be_fast_map();
457413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
4575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_elements_kind(ElementsKind elements_kind) {
4577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(static_cast<int>(elements_kind) < kElementsKindCount);
4578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(kElementsKindCount <= (1 << Map::ElementsKindBits::kSize));
4579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field2(Map::ElementsKindBits::update(bit_field2(), elements_kind));
4580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(this->elements_kind() == elements_kind);
4581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochElementsKind Map::elements_kind() {
4585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Map::ElementsKindBits::decode(bit_field2());
4586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_fast_smi_elements() {
4590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsFastSmiElementsKind(elements_kind());
4591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_fast_object_elements() {
4594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsFastObjectElementsKind(elements_kind());
4595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_fast_smi_or_object_elements() {
4598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsFastSmiOrObjectElementsKind(elements_kind());
4599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_fast_double_elements() {
4602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsFastDoubleElementsKind(elements_kind());
4603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_fast_elements() { return IsFastElementsKind(elements_kind()); }
4606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_sloppy_arguments_elements() {
4608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsSloppyArgumentsElements(elements_kind());
4609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
461113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool Map::has_fast_sloppy_arguments_elements() {
461213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return elements_kind() == FAST_SLOPPY_ARGUMENTS_ELEMENTS;
461313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
461413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
4615109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool Map::has_fast_string_wrapper_elements() {
4616109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return elements_kind() == FAST_STRING_WRAPPER_ELEMENTS;
4617109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
4618109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
4619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_fixed_typed_array_elements() {
4620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsFixedTypedArrayElementsKind(elements_kind());
4621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::has_dictionary_elements() {
4624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsDictionaryElementsKind(elements_kind());
4625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::set_dictionary_map(bool value) {
4629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  uint32_t new_bit_field3 = DictionaryMap::update(bit_field3(), value);
4630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  new_bit_field3 = IsUnstable::update(new_bit_field3, value);
4631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_bit_field3(new_bit_field3);
4632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::is_dictionary_map() {
4636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DictionaryMap::decode(bit_field3());
4637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCode::Flags Code::flags() {
4641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
4642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::set_owns_descriptors(bool owns_descriptors) {
4646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_bit_field3(OwnsDescriptors::update(bit_field3(), owns_descriptors));
4647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::owns_descriptors() {
4651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OwnsDescriptors::decode(bit_field3());
4652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_is_callable() { set_bit_field(bit_field() | (1 << kIsCallable)); }
4656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::is_callable() const {
4659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ((1 << kIsCallable) & bit_field()) != 0;
4660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::deprecate() {
4664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_bit_field3(Deprecated::update(bit_field3(), true));
4665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::is_deprecated() {
4669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Deprecated::decode(bit_field3());
4670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::set_migration_target(bool value) {
4674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_bit_field3(IsMigrationTarget::update(bit_field3(), value));
4675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::is_migration_target() {
4679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsMigrationTarget::decode(bit_field3());
4680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4682f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Map::set_immutable_proto(bool value) {
4683f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_bit_field3(ImmutablePrototype::update(bit_field3(), value));
4684f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
4685f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4686f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool Map::is_immutable_proto() {
4687f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return ImmutablePrototype::decode(bit_field3());
4688f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
4689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_new_target_is_base(bool value) {
4691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field3(NewTargetIsBase::update(bit_field3(), value));
4692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::new_target_is_base() { return NewTargetIsBase::decode(bit_field3()); }
4696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_construction_counter(int value) {
4699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field3(ConstructionCounter::update(bit_field3(), value));
4700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Map::construction_counter() {
4704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ConstructionCounter::decode(bit_field3());
4705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::mark_unstable() {
4709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_bit_field3(IsUnstable::update(bit_field3(), true));
4710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::is_stable() {
4714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return !IsUnstable::decode(bit_field3());
4715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::has_code_cache() {
4719bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // Code caches are always fixed arrays. The empty fixed array is used as a
4720bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // sentinel for an absent code cache.
472113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return code_cache()->length() != 0;
4722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Map::CanBeDeprecated() {
4726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int descriptor = LastAdded();
4727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i <= descriptor; i++) {
4728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PropertyDetails details = instance_descriptors()->GetDetails(i);
4729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (details.representation().IsNone()) return true;
4730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (details.representation().IsSmi()) return true;
4731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (details.representation().IsDouble()) return true;
4732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (details.representation().IsHeapObject()) return true;
473362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (details.kind() == kData && details.location() == kDescriptor) {
473462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return true;
473562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
4736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
4737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return false;
4738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::NotifyLeafMapLayoutChange() {
4742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (is_stable()) {
4743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    mark_unstable();
4744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    dependent_code()->DeoptimizeDependentCodeGroup(
4745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        GetIsolate(),
4746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        DependentCode::kPrototypeCheckGroup);
4747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
4748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::CanTransition() {
4752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Only JSObject and subtypes have map transitions and back pointers.
4753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  STATIC_ASSERT(LAST_TYPE == LAST_JS_OBJECT_TYPE);
4754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instance_type() >= FIRST_JS_OBJECT_TYPE;
4755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsBooleanMap() { return this == GetHeap()->boolean_map(); }
4759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsPrimitiveMap() {
4760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE);
4761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instance_type() <= LAST_PRIMITIVE_TYPE;
4762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSReceiverMap() {
4764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
4765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instance_type() >= FIRST_JS_RECEIVER_TYPE;
4766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSObjectMap() {
4768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE);
4769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instance_type() >= FIRST_JS_OBJECT_TYPE;
4770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSArrayMap() { return instance_type() == JS_ARRAY_TYPE; }
4772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSFunctionMap() { return instance_type() == JS_FUNCTION_TYPE; }
4773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsStringMap() { return instance_type() < FIRST_NONSTRING_TYPE; }
4774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSProxyMap() { return instance_type() == JS_PROXY_TYPE; }
4775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSGlobalProxyMap() {
4776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instance_type() == JS_GLOBAL_PROXY_TYPE;
4777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSGlobalObjectMap() {
4779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instance_type() == JS_GLOBAL_OBJECT_TYPE;
4780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSTypedArrayMap() { return instance_type() == JS_TYPED_ARRAY_TYPE; }
4782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsJSDataViewMap() { return instance_type() == JS_DATA_VIEW_TYPE; }
4783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
478462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Map::IsSpecialReceiverMap() {
478562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool result = IsSpecialReceiverInstanceType(instance_type());
478662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_IMPLIES(!result,
478762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                 !has_named_interceptor() && !is_access_check_needed());
478862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return result;
478962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
4790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::CanOmitMapChecks() {
4792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return is_stable() && FLAG_omit_map_checks_for_leaf_maps;
4793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDependentCode* DependentCode::next_link() {
4797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return DependentCode::cast(get(kNextLinkIndex));
47986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
47996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
48006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
4801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DependentCode::set_next_link(DependentCode* next) {
4802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(kNextLinkIndex, next);
48036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
48046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
48056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
4806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint DependentCode::flags() { return Smi::cast(get(kFlagsIndex))->value(); }
4807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DependentCode::set_flags(int flags) {
4810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set(kFlagsIndex, Smi::FromInt(flags));
4811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint DependentCode::count() { return CountField::decode(flags()); }
4815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DependentCode::set_count(int value) {
4817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_flags(CountField::update(flags(), value));
4818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
4821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDependentCode::DependencyGroup DependentCode::group() {
4822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return static_cast<DependencyGroup>(GroupField::decode(flags()));
48238defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
48248defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid DependentCode::set_group(DependentCode::DependencyGroup group) {
4827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_flags(GroupField::update(flags(), static_cast<int>(group)));
48288defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
48298defd9ff6930b4e24729971a61cf7469daf119beSteve Block
48308defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DependentCode::set_object_at(int i, Object* object) {
4832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set(kCodesStartIndex + i, object);
48330d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
48340d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
4835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* DependentCode::object_at(int i) {
4837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return get(kCodesStartIndex + i);
48380d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
48390d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
48400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
4841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DependentCode::clear_at(int i) {
4842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_undefined(kCodesStartIndex + i);
48430d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
48440d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
48450d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
4846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid DependentCode::copy(int from, int to) {
4847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set(kCodesStartIndex + to, get(kCodesStartIndex + from));
48480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
48490d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
48508defd9ff6930b4e24729971a61cf7469daf119beSteve Block
4851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Code::set_flags(Code::Flags flags) {
4852589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
4853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_INT_FIELD(this, kFlagsOffset, flags);
4854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::kind() {
4858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return ExtractKindFromFlags(flags());
4859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Code::IsCodeStubOrIC() {
486213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (kind()) {
486313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case STUB:
486413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    case HANDLER:
486513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define CASE_KIND(kind) case kind:
486613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      IC_KIND_LIST(CASE_KIND)
486713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef CASE_KIND
486813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return true;
486913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    default:
487013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return false;
487113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
4872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExtraICState Code::extra_ic_state() {
487562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(is_binary_op_stub() || is_compare_ic_stub() ||
487662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         is_to_boolean_ic_stub() || is_debug_stub());
4877b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch  return ExtractExtraICStateFromFlags(flags());
4878b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
4879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
4880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
4881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// For initialization.
4882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_raw_kind_specific_flags1(int value) {
4883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_INT_FIELD(this, kKindSpecificFlags1Offset, value);
4884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_raw_kind_specific_flags2(int value) {
4888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_INT_FIELD(this, kKindSpecificFlags2Offset, value);
4889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
4890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool Code::is_crankshafted() {
4893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsCrankshaftedField::decode(
4894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags2Offset));
4895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool Code::is_hydrogen_stub() {
4899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return is_crankshafted() && kind() != OPTIMIZED_FUNCTION;
4900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
490213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochinline bool Code::is_interpreter_trampoline_builtin() {
490313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Builtins* builtins = GetIsolate()->builtins();
490413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return this == *builtins->InterpreterEntryTrampoline() ||
4905c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         this == *builtins->InterpreterEnterBytecodeAdvance() ||
4906c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch         this == *builtins->InterpreterEnterBytecodeDispatch();
490713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
4908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
490913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochinline bool Code::has_unwinding_info() const {
491013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return HasUnwindingInfoField::decode(READ_UINT32_FIELD(this, kFlagsOffset));
4911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
4912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
491313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochinline void Code::set_has_unwinding_info(bool state) {
491413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  uint32_t previous = READ_UINT32_FIELD(this, kFlagsOffset);
491513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  uint32_t updated_value = HasUnwindingInfoField::update(previous, state);
491613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  WRITE_UINT32_FIELD(this, kFlagsOffset, updated_value);
4917109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
4918109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
4919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void Code::set_is_crankshafted(bool value) {
4920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int updated = IsCrankshaftedField::update(previous, value);
4922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
4924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
4926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool Code::is_turbofanned() {
4927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsTurbofannedField::decode(
4928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
49293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
49303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
49313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void Code::set_is_turbofanned(bool value) {
4933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int updated = IsTurbofannedField::update(previous, value);
4935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
49363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
49373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
49383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline bool Code::can_have_weak_objects() {
4940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(kind() == OPTIMIZED_FUNCTION);
4941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CanHaveWeakObjectsField::decode(
4942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
4944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochinline void Code::set_can_have_weak_objects(bool value) {
4947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(kind() == OPTIMIZED_FUNCTION);
4948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int updated = CanHaveWeakObjectsField::update(previous, value);
4950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
4952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4953f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochinline bool Code::is_construct_stub() {
4954f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(kind() == BUILTIN);
4955f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return IsConstructStubField::decode(
4956f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4957f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
4958f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
4959f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochinline void Code::set_is_construct_stub(bool value) {
4960f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(kind() == BUILTIN);
4961f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4962f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  int updated = IsConstructStubField::update(previous, value);
4963f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4964f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
4965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
496662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochinline bool Code::is_promise_rejection() {
496762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(kind() == BUILTIN);
496862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsPromiseRejectionField::decode(
496962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
497062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
497162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
497262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochinline void Code::set_is_promise_rejection(bool value) {
497362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(kind() == BUILTIN);
497462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
497562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int updated = IsPromiseRejectionField::update(previous, value);
497662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
497762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
497862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
497962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochinline bool Code::is_exception_caught() {
498062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(kind() == BUILTIN);
498162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsExceptionCaughtField::decode(
498262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
498362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
498462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
498562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochinline void Code::set_is_exception_caught(bool value) {
498662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(kind() == BUILTIN);
498762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
498862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int updated = IsExceptionCaughtField::update(previous, value);
498962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
499062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
499162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
4992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Code::has_deoptimization_support() {
4993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
4994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned flags = READ_UINT32_FIELD(this, kFullCodeFlags);
4995589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return FullCodeFlagsHasDeoptimizationSupportField::decode(flags);
4996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
4997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_has_deoptimization_support(bool value) {
5000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned flags = READ_UINT32_FIELD(this, kFullCodeFlags);
5002589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value);
5003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_UINT32_FIELD(this, kFullCodeFlags, flags);
5004589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
5005589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
5006589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
5007589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochbool Code::has_debug_break_slots() {
5008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned flags = READ_UINT32_FIELD(this, kFullCodeFlags);
5010589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return FullCodeFlagsHasDebugBreakSlotsField::decode(flags);
5011589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
5012589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
5013589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
5014589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid Code::set_has_debug_break_slots(bool value) {
5015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned flags = READ_UINT32_FIELD(this, kFullCodeFlags);
5017589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  flags = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value);
5018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_UINT32_FIELD(this, kFullCodeFlags, flags);
50193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
50203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
50213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool Code::has_reloc_info_for_serialization() {
5023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_EQ(FUNCTION, kind());
5024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned flags = READ_UINT32_FIELD(this, kFullCodeFlags);
5025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return FullCodeFlagsHasRelocInfoForSerialization::decode(flags);
5026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Code::set_has_reloc_info_for_serialization(bool value) {
5030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_EQ(FUNCTION, kind());
5031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned flags = READ_UINT32_FIELD(this, kFullCodeFlags);
5032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  flags = FullCodeFlagsHasRelocInfoForSerialization::update(flags, value);
5033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_UINT32_FIELD(this, kFullCodeFlags, flags);
5034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint Code::allow_osr_at_loop_nesting_level() {
5038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int fields = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
5040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return AllowOSRAtLoopNestingLevelField::decode(fields);
50413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
50423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
50433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_allow_osr_at_loop_nesting_level(int level) {
5045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5046f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(level >= 0 && level <= AbstractCode::kMaxLoopNestingMarker);
5047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
5048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int updated = AllowOSRAtLoopNestingLevelField::update(previous, level);
5049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
50503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
50513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
50523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint Code::profiler_ticks() {
5054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ProfilerTicksField::decode(
5056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
5057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_profiler_ticks(int ticks) {
5061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kind() == FUNCTION) {
5062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    unsigned previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
5063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    unsigned updated = ProfilerTicksField::update(previous, ticks);
5064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
5065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
50683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Code::builtin_index() { return READ_INT_FIELD(this, kBuiltinIndexOffset); }
50698f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
5070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_builtin_index(int index) {
50713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  WRITE_INT_FIELD(this, kBuiltinIndexOffset, index);
50728f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch}
50738f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
50748f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch
5075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochunsigned Code::stack_slots() {
5076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_crankshafted());
5077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return StackSlotsField::decode(
5078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
5079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_stack_slots(unsigned slots) {
5083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(slots <= (1 << kStackSlotsBitCount));
5084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_crankshafted());
5085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
5086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int updated = StackSlotsField::update(previous, slots);
5087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
5088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
50911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockunsigned Code::safepoint_table_offset() {
5092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_crankshafted());
5093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return SafepointTableOffsetField::decode(
5094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags2Offset));
5095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5097b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
50981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Code::set_safepoint_table_offset(unsigned offset) {
5099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(offset <= (1 << kSafepointTableOffsetBitCount));
5100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_crankshafted());
5101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsAligned(offset, static_cast<unsigned>(kIntSize)));
5102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
5103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int updated = SafepointTableOffsetField::update(previous, offset);
5104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
5105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochunsigned Code::back_edge_table_offset() {
5109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return BackEdgeTableOffsetField::decode(
5111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags2Offset)) << kPointerSizeLog2;
5112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_back_edge_table_offset(unsigned offset) {
5116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsAligned(offset, static_cast<unsigned>(kPointerSize)));
5118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  offset = offset >> kPointerSizeLog2;
5119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
5120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int updated = BackEdgeTableOffsetField::update(previous, offset);
5121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
5122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Code::back_edges_patched_for_osr() {
5126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(FUNCTION, kind());
5127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return allow_osr_at_loop_nesting_level() > 0;
5128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochuint16_t Code::to_boolean_state() { return extra_ic_state(); }
5132257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5133257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Code::marked_for_deoptimization() {
5135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(kind() == OPTIMIZED_FUNCTION);
5136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return MarkedForDeoptimizationField::decode(
5137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
5138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_marked_for_deoptimization(bool flag) {
5142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(kind() == OPTIMIZED_FUNCTION);
5143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!flag || AllowDeoptimization::IsAllowed(GetIsolate()));
5144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
5145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int updated = MarkedForDeoptimizationField::update(previous, flag);
5146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
5147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Code::is_inline_cache_stub() {
5151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Kind kind = this->kind();
5152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  switch (kind) {
5153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CASE(name) case name: return true;
5154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    IC_KIND_LIST(CASE)
5155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef CASE
5156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    default: return false;
5157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
515869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
515969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
516013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool Code::is_debug_stub() {
516113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (kind() != BUILTIN) return false;
516213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  switch (builtin_index()) {
5163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define CASE_DEBUG_BUILTIN(name) case Builtins::k##name:
5164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    BUILTIN_LIST_DBG(CASE_DEBUG_BUILTIN)
516513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef CASE_DEBUG_BUILTIN
516613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return true;
516713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    default:
516813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return false;
516913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
517013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return false;
517113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
5172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Code::is_handler() { return kind() == HANDLER; }
517362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Code::is_stub() { return kind() == STUB; }
5174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Code::is_binary_op_stub() { return kind() == BINARY_OP_IC; }
5175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Code::is_compare_ic_stub() { return kind() == COMPARE_IC; }
5176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Code::is_to_boolean_ic_stub() { return kind() == TO_BOOLEAN_IC; }
5177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Code::is_optimized_code() { return kind() == OPTIMIZED_FUNCTION; }
51783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Code::is_wasm_code() { return kind() == WASM_FUNCTION; }
51793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochAddress Code::constant_pool() {
5181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address constant_pool = NULL;
5182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (FLAG_enable_embedded_constant_pool) {
5183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int offset = constant_pool_offset();
5184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (offset < instruction_size()) {
5185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      constant_pool = FIELD_ADDR(this, kHeaderSize + offset);
5186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
5188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return constant_pool;
5189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
519113e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochCode::Flags Code::ComputeFlags(Kind kind, ExtraICState extra_ic_state,
5192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               CacheHolderFlag holder) {
5193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Compute the bit mask.
519413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  unsigned int bits = KindField::encode(kind) |
51953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                      ExtraICStateField::encode(extra_ic_state) |
51963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                      CacheHolderField::encode(holder);
5197589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return static_cast<Flags>(bits);
5198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
5199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5200bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochCode::Flags Code::ComputeHandlerFlags(Kind handler_kind,
5201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                      CacheHolderFlag holder) {
520213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return ComputeFlags(Code::HANDLER, handler_kind, holder);
5203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
5204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::ExtractKindFromFlags(Flags flags) {
5207589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return KindField::decode(flags);
5208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
5209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
5212589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return ExtraICStateField::decode(flags);
5213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
5214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
5217589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  return CacheHolderField::decode(flags);
52188defd9ff6930b4e24729971a61cf7469daf119beSteve Block}
52198defd9ff6930b4e24729971a61cf7469daf119beSteve Block
5220bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochCode::Flags Code::RemoveHolderFromFlags(Flags flags) {
5221bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  int bits = flags & ~CacheHolderField::kMask;
5222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<Flags>(bits);
5223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* Code::GetCodeFromTargetAddress(Address address) {
5227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
5228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // GetCodeFromTargetAddress might be called when marking objects during mark
5229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // sweep. reinterpret_cast is therefore used instead of the more appropriate
5230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Code::cast. Code::cast does not work when the object's map is
5231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // marked.
5232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Code* result = reinterpret_cast<Code*>(code);
5233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return result;
5234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
5235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5237791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve BlockObject* Code::GetObjectFromEntryAddress(Address location_of_address) {
5238791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  return HeapObject::
5239791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block      FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize);
5240791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block}
5241791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block
5242791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block
5243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Code::CanContainWeakObjects() {
5244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return is_optimized_code() && can_have_weak_objects();
5245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Code::IsWeakObject(Object* object) {
5249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return (CanContainWeakObjects() && IsWeakObjectInOptimizedCode(object));
5250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Code::IsWeakObjectInOptimizedCode(Object* object) {
5254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (object->IsMap()) {
525562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return Map::cast(object)->CanTransition();
5256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (object->IsCell()) {
5258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    object = Cell::cast(object)->value();
5259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (object->IsPropertyCell()) {
5260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    object = PropertyCell::cast(object)->value();
5261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
526262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (object->IsJSReceiver() || object->IsContext()) {
526362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return true;
5264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
5265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return false;
5266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint AbstractCode::instruction_size() {
5270109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (IsCode()) {
5271109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return GetCode()->instruction_size();
5272109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  } else {
5273109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return GetBytecodeArray()->length();
5274109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
5275109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
5276109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
5277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochByteArray* AbstractCode::source_position_table() {
5278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (IsCode()) {
5279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return GetCode()->source_position_table();
5280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  } else {
5281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    return GetBytecodeArray()->source_position_table();
5282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
5283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid AbstractCode::set_source_position_table(ByteArray* source_position_table) {
5286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (IsCode()) {
5287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    GetCode()->set_source_position_table(source_position_table);
5288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  } else {
5289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    GetBytecodeArray()->set_source_position_table(source_position_table);
5290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
5291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
529313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochint AbstractCode::SizeIncludingMetadata() {
529413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (IsCode()) {
529513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return GetCode()->SizeIncludingMetadata();
529613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } else {
529713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return GetBytecodeArray()->SizeIncludingMetadata();
529813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
529913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
53003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint AbstractCode::ExecutableSize() {
53013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (IsCode()) {
53023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return GetCode()->ExecutableSize();
53033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
53043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return GetBytecodeArray()->BytecodeArraySize();
53053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
53063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
53073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
53083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress AbstractCode::instruction_start() {
53093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (IsCode()) {
53103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return GetCode()->instruction_start();
53113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
53123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return GetBytecodeArray()->GetFirstBytecodeAddress();
53133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
53143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
53153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
53163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAddress AbstractCode::instruction_end() {
53173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (IsCode()) {
53183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return GetCode()->instruction_end();
53193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
53203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return GetBytecodeArray()->GetFirstBytecodeAddress() +
53213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch           GetBytecodeArray()->length();
53223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
53233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
53243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
53253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool AbstractCode::contains(byte* inner_pointer) {
53263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return (address() <= inner_pointer) && (inner_pointer <= address() + Size());
53273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
53283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
53293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAbstractCode::Kind AbstractCode::kind() {
53303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (IsCode()) {
53313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    STATIC_ASSERT(AbstractCode::FUNCTION ==
53323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                  static_cast<AbstractCode::Kind>(Code::FUNCTION));
53333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return static_cast<AbstractCode::Kind>(GetCode()->kind());
53343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
53353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return INTERPRETED_FUNCTION;
53363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
53373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
53383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
5339109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochCode* AbstractCode::GetCode() { return Code::cast(this); }
5340109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
5341109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochBytecodeArray* AbstractCode::GetBytecodeArray() {
5342109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return BytecodeArray::cast(this);
5343109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
5344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Map::prototype() const {
5346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return READ_FIELD(this, kPrototypeOffset);
5347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
5348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_prototype(Object* value, WriteBarrierMode mode) {
535113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(value->IsNull(GetIsolate()) || value->IsJSReceiver());
5352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kPrototypeOffset, value);
53533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode);
53541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
53551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
53561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLayoutDescriptor* Map::layout_descriptor_gc_safe() {
5358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Object* layout_desc = READ_FIELD(this, kLayoutDescriptorOffset);
5359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return LayoutDescriptor::cast_gc_safe(layout_desc);
5360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool Map::HasFastPointerLayout() const {
5364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Object* layout_desc = READ_FIELD(this, kLayoutDescriptorOffset);
5365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return LayoutDescriptor::IsFastPointerLayout(layout_desc);
5366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Map::UpdateDescriptors(DescriptorArray* descriptors,
5370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                            LayoutDescriptor* layout_desc) {
5371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  set_instance_descriptors(descriptors);
5372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_unbox_double_fields) {
5373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (layout_descriptor()->IsSlowLayout()) {
5374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      set_layout_descriptor(layout_desc);
5375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
5376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP
5377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // TODO(ishell): remove these checks from VERIFY_HEAP mode.
5378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (FLAG_verify_heap) {
5379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK(layout_descriptor()->IsConsistentWithMap(this));
5380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK(visitor_id() == Heap::GetStaticVisitorIdForMap(this));
5381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#else
5383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    SLOW_DCHECK(layout_descriptor()->IsConsistentWithMap(this));
5384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(visitor_id() == Heap::GetStaticVisitorIdForMap(this));
5385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
5386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Map::InitializeDescriptors(DescriptorArray* descriptors,
5391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                LayoutDescriptor* layout_desc) {
5392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int len = descriptors->number_of_descriptors();
5393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_instance_descriptors(descriptors);
5394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetNumberOfOwnDescriptors(len);
5395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (FLAG_unbox_double_fields) {
5397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    set_layout_descriptor(layout_desc);
5398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP
5399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // TODO(ishell): remove these checks from VERIFY_HEAP mode.
5400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (FLAG_verify_heap) {
5401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CHECK(layout_descriptor()->IsConsistentWithMap(this));
5402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
5403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#else
5404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    SLOW_DCHECK(layout_descriptor()->IsConsistentWithMap(this));
5405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
5406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    set_visitor_id(Heap::GetStaticVisitorIdForMap(this));
5407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5408257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
5409257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5410257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(Map, instance_descriptors, DescriptorArray, kDescriptorsOffset)
5412f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochACCESSORS(Map, layout_descriptor, LayoutDescriptor, kLayoutDescriptorOffset)
5413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::set_bit_field3(uint32_t bits) {
5415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (kInt32Size != kPointerSize) {
5416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    WRITE_UINT32_FIELD(this, kBitField3Offset + kInt32Size, 0);
5417257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
5418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_UINT32_FIELD(this, kBitField3Offset, bits);
5419257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
5420257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5421257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochuint32_t Map::bit_field3() const {
5423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return READ_UINT32_FIELD(this, kBitField3Offset);
5424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierLayoutDescriptor* Map::GetLayoutDescriptor() {
5428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return FLAG_unbox_double_fields ? layout_descriptor()
5429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                  : LayoutDescriptor::FastPointerLayout();
5430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Map::AppendDescriptor(Descriptor* desc) {
5434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DescriptorArray* descriptors = instance_descriptors();
5435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int number_of_own_descriptors = NumberOfOwnDescriptors();
5436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(descriptors->number_of_descriptors() == number_of_own_descriptors);
5437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  descriptors->Append(desc);
5438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SetNumberOfOwnDescriptors(number_of_own_descriptors + 1);
5439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// This function does not support appending double field descriptors and
5441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// it should never try to (otherwise, layout descriptor must be updated too).
5442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef DEBUG
5443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PropertyDetails details = desc->GetDetails();
544462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CHECK(details.location() != kField || !details.representation().IsDouble());
5445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
5446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Map::GetBackPointer() {
5450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* object = constructor_or_backpointer();
5451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (object->IsMap()) {
5452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return object;
5453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
5454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return GetIsolate()->heap()->undefined_value();
5455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
5456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMap* Map::ElementsTransitionMap() {
5459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return TransitionArray::SearchSpecial(
5460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      this, GetHeap()->elements_transition_symbol());
5461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
5462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(Map, raw_transitions, Object, kTransitionsOrPrototypeInfoOffset)
5465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* Map::prototype_info() const {
5468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(is_prototype_map());
5469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_FIELD(this, Map::kTransitionsOrPrototypeInfoOffset);
5470257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
5471257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5472257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::set_prototype_info(Object* value, WriteBarrierMode mode) {
5474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(is_prototype_map());
5475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_FIELD(this, Map::kTransitionsOrPrototypeInfoOffset, value);
5476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONDITIONAL_WRITE_BARRIER(
5477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      GetHeap(), this, Map::kTransitionsOrPrototypeInfoOffset, value, mode);
5478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
5482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(instance_type() >= FIRST_JS_RECEIVER_TYPE);
548313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(value->IsMap());
548413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(GetBackPointer()->IsUndefined(GetIsolate()));
5485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!value->IsMap() ||
5486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         Map::cast(value)->GetConstructor() == constructor_or_backpointer());
5487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_constructor_or_backpointer(value, mode);
5488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
549013e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochACCESSORS(Map, code_cache, FixedArray, kCodeCacheOffset)
5491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(Map, dependent_code, DependentCode, kDependentCodeOffset)
5492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(Map, weak_cell_cache, Object, kWeakCellCacheOffset)
5493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(Map, constructor_or_backpointer, Object,
5494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kConstructorOrBackPointerOffset)
5495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* Map::GetConstructor() const {
5498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* maybe_constructor = constructor_or_backpointer();
5499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Follow any back pointers.
5500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (maybe_constructor->IsMap()) {
5501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    maybe_constructor =
5502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Map::cast(maybe_constructor)->constructor_or_backpointer();
5503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
5504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return maybe_constructor;
5505257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
5506257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5507257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
5508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::SetConstructor(Object* constructor, WriteBarrierMode mode) {
5509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Never overwrite a back pointer with a constructor.
5510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!constructor_or_backpointer()->IsMap());
5511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_constructor_or_backpointer(constructor, mode);
5512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Map> Map::CopyInitialMap(Handle<Map> map) {
5516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return CopyInitialMap(map, map->instance_size(), map->GetInObjectProperties(),
5517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        map->unused_property_fields());
55183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
55193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
55203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSBoundFunction, bound_target_function, JSReceiver,
5522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kBoundTargetFunctionOffset)
5523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSBoundFunction, bound_this, Object, kBoundThisOffset)
5524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSBoundFunction, bound_arguments, FixedArray, kBoundArgumentsOffset)
5525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
552762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSFunction, feedback_vector_cell, Cell, kFeedbackVectorOffset)
5528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset)
5529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSGlobalObject, native_context, Context, kNativeContextOffset)
5531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSGlobalObject, global_proxy, JSObject, kGlobalProxyOffset)
5532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSGlobalProxy, native_context, Object, kNativeContextOffset)
5534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSGlobalProxy, hash, Object, kHashOffset)
5535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, name, Object, kNameOffset)
5537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(AccessorInfo, flag, kFlagOffset)
5538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(AccessorInfo, expected_receiver_type, Object,
5539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          kExpectedReceiverTypeOffset)
5540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5541109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochACCESSORS(AccessorInfo, getter, Object, kGetterOffset)
5542109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochACCESSORS(AccessorInfo, setter, Object, kSetterOffset)
5543bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochACCESSORS(AccessorInfo, js_getter, Object, kJsGetterOffset)
5544109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochACCESSORS(AccessorInfo, data, Object, kDataOffset)
5545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5546c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PromiseResolveThenableJobInfo, thenable, JSReceiver, kThenableOffset)
5547c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PromiseResolveThenableJobInfo, then, JSReceiver, kThenOffset)
5548c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PromiseResolveThenableJobInfo, resolve, JSFunction, kResolveOffset)
5549c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PromiseResolveThenableJobInfo, reject, JSFunction, kRejectOffset)
5550c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PromiseResolveThenableJobInfo, context, Context, kContextOffset);
5551c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
5552c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PromiseReactionJobInfo, value, Object, kValueOffset);
5553c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PromiseReactionJobInfo, tasks, Object, kTasksOffset);
555462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(PromiseReactionJobInfo, deferred_promise, Object,
555562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          kDeferredPromiseOffset);
555662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(PromiseReactionJobInfo, deferred_on_resolve, Object,
555762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          kDeferredOnResolveOffset);
555862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(PromiseReactionJobInfo, deferred_on_reject, Object,
555962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          kDeferredOnRejectOffset);
5560c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PromiseReactionJobInfo, context, Context, kContextOffset);
5561f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
556213e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochMap* PrototypeInfo::ObjectCreateMap() {
556313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return Map::cast(WeakCell::cast(object_create_map())->value());
556413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
556513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
556613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// static
556713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid PrototypeInfo::SetObjectCreateMap(Handle<PrototypeInfo> info,
556813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                       Handle<Map> map) {
556913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Handle<WeakCell> cell = Map::WeakCellForMap(map);
557013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  info->set_object_create_map(*cell);
557113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
557213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
557313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool PrototypeInfo::HasObjectCreateMap() {
557413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Object* cache = object_create_map();
557513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return cache->IsWeakCell() && !WeakCell::cast(cache)->cleared();
557613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
557713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
557813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool FunctionTemplateInfo::instantiated() {
557913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return shared_function_info()->IsSharedFunctionInfo();
558013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
558113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
5582f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochFunctionTemplateInfo* FunctionTemplateInfo::GetParent(Isolate* isolate) {
5583f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Object* parent = parent_template();
5584f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return parent->IsUndefined(isolate) ? nullptr
5585f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                      : FunctionTemplateInfo::cast(parent);
5586f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5587f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5588f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochObjectTemplateInfo* ObjectTemplateInfo::GetParent(Isolate* isolate) {
5589f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Object* maybe_ctor = constructor();
5590f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (maybe_ctor->IsUndefined(isolate)) return nullptr;
5591f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  FunctionTemplateInfo* constructor = FunctionTemplateInfo::cast(maybe_ctor);
5592f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  while (true) {
5593f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    constructor = constructor->GetParent(isolate);
5594f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (constructor == nullptr) return nullptr;
5595f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    Object* maybe_obj = constructor->instance_template();
5596f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    if (!maybe_obj->IsUndefined(isolate)) {
5597f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      return ObjectTemplateInfo::cast(maybe_obj);
5598f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    }
5599f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
5600f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return nullptr;
5601f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5602f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5603c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(PrototypeInfo, weak_cell, Object, kWeakCellOffset)
5604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(PrototypeInfo, prototype_users, Object, kPrototypeUsersOffset)
560513e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochACCESSORS(PrototypeInfo, object_create_map, Object, kObjectCreateMap)
5606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(PrototypeInfo, registry_slot, kRegistrySlotOffset)
5607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(PrototypeInfo, validity_cell, Object, kValidityCellOffset)
560813e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochSMI_ACCESSORS(PrototypeInfo, bit_field, kBitFieldOffset)
560913e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochBOOL_ACCESSORS(PrototypeInfo, bit_field, should_be_fast_map, kShouldBeFastBit)
5610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
561162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(Tuple2, value1, Object, kValue1Offset)
561262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(Tuple2, value2, Object, kValue2Offset)
5613c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(Tuple3, value3, Object, kValue3Offset)
5614c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
5615f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(ContextExtension, scope_info, ScopeInfo, kScopeInfoOffset)
5616f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(ContextExtension, extension, Object, kExtensionOffset)
5617f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
561862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSMI_ACCESSORS(ConstantElementsPair, elements_kind, kElementsKindOffset)
561962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(ConstantElementsPair, constant_values, FixedArrayBase,
562062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          kConstantValuesOffset)
5621c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
562262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSModuleNamespace, module, Module, kModuleOffset)
5623c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
5624f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(Module, code, Object, kCodeOffset)
5625f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(Module, exports, ObjectHashTable, kExportsOffset)
5626c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(Module, regular_exports, FixedArray, kRegularExportsOffset)
5627c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(Module, regular_imports, FixedArray, kRegularImportsOffset)
5628c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(Module, module_namespace, HeapObject, kModuleNamespaceOffset)
5629f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(Module, requested_modules, FixedArray, kRequestedModulesOffset)
5630c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochSMI_ACCESSORS(Module, hash, kHashOffset)
5631c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
5632c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool Module::evaluated() const { return code()->IsModuleInfo(); }
5633f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
5634c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid Module::set_evaluated() {
5635c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(instantiated());
5636c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK(!evaluated());
5637c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return set_code(
5638c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      JSFunction::cast(code())->shared()->scope_info()->ModuleDescriptorInfo());
5639f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
5640f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
5641c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool Module::instantiated() const { return !code()->IsSharedFunctionInfo(); }
5642c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
5643f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochModuleInfo* Module::info() const {
5644c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (evaluated()) return ModuleInfo::cast(code());
5645c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  ScopeInfo* scope_info = instantiated()
5646c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              ? JSFunction::cast(code())->shared()->scope_info()
5647c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                              : SharedFunctionInfo::cast(code())->scope_info();
5648c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return scope_info->ModuleDescriptorInfo();
5649f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
5650f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
56513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(AccessorPair, getter, Object, kGetterOffset)
56523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(AccessorPair, setter, Object, kSetterOffset)
5653c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
5654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(AccessCheckInfo, callback, Object, kCallbackOffset)
565513e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochACCESSORS(AccessCheckInfo, named_interceptor, Object, kNamedInterceptorOffset)
565613e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochACCESSORS(AccessCheckInfo, indexed_interceptor, Object,
565713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch          kIndexedInterceptorOffset)
5658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
5659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
5661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
5662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
5663f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(InterceptorInfo, descriptor, Object, kDescriptorOffset)
5664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
5665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
5666f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(InterceptorInfo, definer, Object, kDefinerOffset)
5667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, data, Object, kDataOffset)
5668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierSMI_ACCESSORS(InterceptorInfo, flags, kFlagsOffset)
5669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierBOOL_ACCESSORS(InterceptorInfo, flags, can_intercept_symbols,
5670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier               kCanInterceptSymbolsBit)
5671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierBOOL_ACCESSORS(InterceptorInfo, flags, all_can_read, kAllCanReadBit)
5672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochBOOL_ACCESSORS(InterceptorInfo, flags, non_masking, kNonMasking)
5673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
5675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
5676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(CallHandlerInfo, fast_handler, Object, kFastHandlerOffset)
5677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, tag, Object, kTagOffset)
5679109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochACCESSORS(TemplateInfo, serial_number, Object, kSerialNumberOffset)
5680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(TemplateInfo, number_of_properties, kNumberOfProperties)
5681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
5682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(TemplateInfo, property_accessors, Object, kPropertyAccessorsOffset)
5683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
5685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, prototype_template, Object,
5686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kPrototypeTemplateOffset)
568762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(FunctionTemplateInfo, prototype_provider_template, Object,
568862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          kPrototypeProviderTemplateOffset)
568962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset)
5691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, named_property_handler, Object,
5692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kNamedPropertyHandlerOffset)
5693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object,
5694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kIndexedPropertyHandlerOffset)
5695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_template, Object,
5696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceTemplateOffset)
5697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
5698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
5699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_call_handler, Object,
5700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceCallHandlerOffset)
5701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, access_check_info, Object,
5702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kAccessCheckInfoOffset)
570313e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochACCESSORS(FunctionTemplateInfo, shared_function_info, Object,
570413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch          kSharedFunctionInfoOffset)
5705c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(FunctionTemplateInfo, cached_property_name, Object,
5706c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          kCachedPropertyNameOffset)
570713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
5708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(FunctionTemplateInfo, flag, kFlagOffset)
5709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
5711f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochACCESSORS(ObjectTemplateInfo, data, Object, kDataOffset)
5712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5713f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochint ObjectTemplateInfo::internal_field_count() const {
5714f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Object* value = data();
5715f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(value->IsSmi());
5716f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return InternalFieldCount::decode(Smi::cast(value)->value());
5717f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5718f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5719f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid ObjectTemplateInfo::set_internal_field_count(int count) {
5720f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return set_data(Smi::FromInt(
5721f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      InternalFieldCount::update(Smi::cast(data())->value(), count)));
5722f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5723f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5724f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool ObjectTemplateInfo::immutable_proto() const {
5725f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Object* value = data();
5726f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(value->IsSmi());
5727f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return IsImmutablePrototype::decode(Smi::cast(value)->value());
5728f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5729f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5730f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid ObjectTemplateInfo::set_immutable_proto(bool immutable) {
5731f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return set_data(Smi::FromInt(
5732f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      IsImmutablePrototype::update(Smi::cast(data())->value(), immutable)));
5733f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5734f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5735f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochint TemplateList::length() const {
5736f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return Smi::cast(FixedArray::cast(this)->get(kLengthIndex))->value();
5737f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5738f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5739f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochObject* TemplateList::get(int index) const {
5740f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return FixedArray::cast(this)->get(kFirstElementIndex + index);
5741f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5742f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5743f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid TemplateList::set(int index, Object* value) {
5744f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  FixedArray::cast(this)->set(kFirstElementIndex + index, value);
5745f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(AllocationSite, transition_info, Object, kTransitionInfoOffset)
5748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(AllocationSite, nested_site, Object, kNestedSiteOffset)
5749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(AllocationSite, pretenure_data, kPretenureDataOffset)
5750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(AllocationSite, pretenure_create_count,
5751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              kPretenureCreateCountOffset)
5752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(AllocationSite, dependent_code, DependentCode,
5753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          kDependentCodeOffset)
5754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(AllocationSite, weak_next, Object, kWeakNextOffset)
5755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(AllocationMemento, allocation_site, Object, kAllocationSiteOffset)
5756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, source, Object, kSourceOffset)
5758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, name, Object, kNameOffset)
5759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(Script, id, kIdOffset)
5760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(Script, line_offset, kLineOffsetOffset)
5761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(Script, column_offset, kColumnOffsetOffset)
5762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, context_data, Object, kContextOffset)
5763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierACCESSORS(Script, wrapper, HeapObject, kWrapperOffset)
5764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(Script, type, kTypeOffset)
5765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, line_ends, Object, kLineEndsOffset)
5766f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochACCESSORS_CHECKED(Script, eval_from_shared, Object, kEvalFromSharedOffset,
5767f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                  this->type() != TYPE_WASM)
5768f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochSMI_ACCESSORS_CHECKED(Script, eval_from_position, kEvalFromPositionOffset,
5769f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                      this->type() != TYPE_WASM)
577062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(Script, shared_function_infos, FixedArray, kSharedFunctionInfosOffset)
5771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(Script, flags, kFlagsOffset)
5772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(Script, source_url, Object, kSourceUrlOffset)
5773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(Script, source_mapping_url, Object, kSourceMappingUrlOffset)
5774c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS_CHECKED(Script, wasm_compiled_module, Object, kEvalFromSharedOffset,
5775f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                  this->type() == TYPE_WASM)
5776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScript::CompilationType Script::compilation_type() {
5778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return BooleanBit::get(flags(), kCompilationTypeBit) ?
5779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      COMPILATION_TYPE_EVAL : COMPILATION_TYPE_HOST;
5780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Script::set_compilation_type(CompilationType type) {
5782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_flags(BooleanBit::set(flags(), kCompilationTypeBit,
5783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      type == COMPILATION_TYPE_EVAL));
5784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScript::CompilationState Script::compilation_state() {
5786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return BooleanBit::get(flags(), kCompilationStateBit) ?
5787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      COMPILATION_STATE_COMPILED : COMPILATION_STATE_INITIAL;
5788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Script::set_compilation_state(CompilationState state) {
5790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_flags(BooleanBit::set(flags(), kCompilationStateBit,
5791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      state == COMPILATION_STATE_COMPILED));
5792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
5793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochScriptOriginOptions Script::origin_options() {
5794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return ScriptOriginOptions((flags() & kOriginOptionsMask) >>
5795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                             kOriginOptionsShift);
5796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Script::set_origin_options(ScriptOriginOptions origin_options) {
5798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!(origin_options.Flags() & ~((1 << kOriginOptionsSize) - 1)));
5799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_flags((flags() & ~kOriginOptionsMask) |
5800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            (origin_options.Flags() << kOriginOptionsShift));
5801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
5802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex)
580562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSMI_ACCESSORS(DebugInfo, debugger_hints, kDebuggerHintsIndex)
5806f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochACCESSORS(DebugInfo, debug_bytecode_array, Object, kDebugBytecodeArrayIndex)
5807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex)
5808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5809f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool DebugInfo::HasDebugBytecodeArray() {
5810f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return debug_bytecode_array()->IsBytecodeArray();
5811f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5812f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5813f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool DebugInfo::HasDebugCode() {
5814f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Code* code = shared()->code();
5815f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool has = code->kind() == Code::FUNCTION;
5816f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(!has || code->has_debug_break_slots());
5817f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return has;
5818f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5819f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5820f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochBytecodeArray* DebugInfo::OriginalBytecodeArray() {
5821f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(HasDebugBytecodeArray());
5822109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return shared()->bytecode_array();
5823109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
5824109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
5825f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochBytecodeArray* DebugInfo::DebugBytecodeArray() {
5826f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(HasDebugBytecodeArray());
5827f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return BytecodeArray::cast(debug_bytecode_array());
5828f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5829f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5830f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochCode* DebugInfo::DebugCode() {
5831f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(HasDebugCode());
5832f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return shared()->code();
5833f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
5834f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
5835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(BreakPointInfo, source_position, kSourcePositionIndex)
5836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex)
5837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, name, Object, kNameOffset)
5839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(SharedFunctionInfo, optimized_code_map, FixedArray,
5840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          kOptimizedCodeMapOffset)
58413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset)
584262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(SharedFunctionInfo, feedback_metadata, FeedbackMetadata,
584313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch          kFeedbackMetadataOffset)
584462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSMI_ACCESSORS(SharedFunctionInfo, function_literal_id, kFunctionLiteralIdOffset)
5845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
5846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierSMI_ACCESSORS(SharedFunctionInfo, unique_id, kUniqueIdOffset)
5847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
5848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, instance_class_name, Object,
5849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kInstanceClassNameOffset)
58506ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset)
5851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset)
5852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
58533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochACCESSORS(SharedFunctionInfo, function_identifier, Object,
58543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          kFunctionIdentifierOffset)
58553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSMI_ACCESSORS(FunctionTemplateInfo, length, kLengthOffset)
5857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
5858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kHiddenPrototypeBit)
5859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
5860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
5861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kNeedsAccessCheckBit)
586269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochBOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
586369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch               kReadOnlyPrototypeBit)
5864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBOOL_ACCESSORS(FunctionTemplateInfo, flag, remove_prototype,
5865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               kRemovePrototypeBit)
5866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochBOOL_ACCESSORS(FunctionTemplateInfo, flag, do_not_cache,
5867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               kDoNotCacheBit)
5868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochBOOL_ACCESSORS(FunctionTemplateInfo, flag, accept_any_receiver,
5869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               kAcceptAnyReceiver)
5870109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_named_expression,
5871109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch               kIsNamedExpressionBit)
5872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
5873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block               kIsTopLevelBit)
5874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_32_BIT
58767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
5877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(SharedFunctionInfo, internal_formal_parameter_count,
5878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kFormalParameterCountOffset)
58797f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
5880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kExpectedNofPropertiesOffset)
58817f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
5882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kStartPositionAndTypeOffset)
58837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
58847f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, function_token_position,
5885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kFunctionTokenPositionOffset)
58867f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
5887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              kCompilerHintsOffset)
5888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSMI_ACCESSORS(SharedFunctionInfo, opt_count_and_bailout_reason,
5889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch              kOptCountAndBailoutReasonOffset)
5890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset)
58913ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
5892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSMI_ACCESSORS(SharedFunctionInfo, profiler_ticks, kProfilerTicksOffset)
5893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
58947f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#else
58957f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
5896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_LITTLE_ENDIAN
5897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define PSEUDO_SMI_LO_ALIGN 0
5898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define PSEUDO_SMI_HI_ALIGN kIntSize
5899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else
5900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define PSEUDO_SMI_LO_ALIGN kIntSize
5901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define PSEUDO_SMI_HI_ALIGN 0
5902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
5903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset)                          \
5905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  STATIC_ASSERT(holder::offset % kPointerSize == PSEUDO_SMI_LO_ALIGN);         \
5906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int holder::name() const {                                                   \
5907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int value = READ_INT_FIELD(this, offset);                                  \
5908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(kHeapObjectTag == 1);                                               \
5909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK((value & kHeapObjectTag) == 0);                                     \
5910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return value >> 1;                                                         \
5911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }                                                                            \
5912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void holder::set_##name(int value) {                                         \
5913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(kHeapObjectTag == 1);                                               \
5914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK((value & 0xC0000000) == 0xC0000000 || (value & 0xC0000000) == 0x0); \
5915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    WRITE_INT_FIELD(this, offset, (value << 1) & ~kHeapObjectTag);             \
5916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
5917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset)                  \
5919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  STATIC_ASSERT(holder::offset % kPointerSize == PSEUDO_SMI_HI_ALIGN); \
59207f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  INT_ACCESSORS(holder, name, offset)
59217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
59227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
59237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
5924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, internal_formal_parameter_count,
59253e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kFormalParameterCountOffset)
59267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
59273e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
59283e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        expected_nof_properties,
59293e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kExpectedNofPropertiesOffset)
59307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
59313e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, end_position, kEndPositionOffset)
59323e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
59333e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        start_position_and_type,
59343e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kStartPositionAndTypeOffset)
59353e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu
59363e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
59373e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        function_token_position,
59383e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kFunctionTokenPositionOffset)
59393e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
59403e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        compiler_hints,
59413e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu                        kCompilerHintsOffset)
59423e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu
59433e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
5944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        opt_count_and_bailout_reason,
5945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        kOptCountAndBailoutReasonOffset)
5946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, counters, kCountersOffset)
59470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
5948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
5949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ast_node_count,
5950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        kAstNodeCountOffset)
5951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
5952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        profiler_ticks,
5953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        kProfilerTicksOffset)
59540d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
5955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
59560d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
59573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAbstractCode* SharedFunctionInfo::abstract_code() {
59583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (HasBytecodeArray()) {
59593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return AbstractCode::cast(bytecode_array());
59603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
59613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return AbstractCode::cast(code());
59623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
59633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
5964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
596562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, allows_lazy_compilation,
596662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kAllowLazyCompilation)
596762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, uses_arguments,
596862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kUsesArguments)
596962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, has_duplicate_parameters,
597062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kHasDuplicateParameters)
597162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, asm_function, kIsAsmFunction)
597262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_declaration,
597362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kIsDeclaration)
597462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, marked_for_tier_up,
597562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kMarkedForTierUp)
597662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
597762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, needs_home_object,
597862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kNeedsHomeObject)
597962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative)
598062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, force_inline, kForceInline)
598162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, must_use_ignition_turbo,
598262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kMustUseIgnitionTurbo)
598362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_flush, kDontFlush)
598462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_asm_wasm_broken,
598562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kIsAsmWasmBroken)
598662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
598762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_GETTER(SharedFunctionInfo, compiler_hints, optimization_disabled,
598862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            kOptimizationDisabled)
598962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
5990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid SharedFunctionInfo::set_optimization_disabled(bool disable) {
5991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  set_compiler_hints(BooleanBit::set(compiler_hints(),
5992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     kOptimizationDisabled,
5993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                                     disable));
5994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
5995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLanguageMode SharedFunctionInfo::language_mode() {
5997f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  STATIC_ASSERT(LANGUAGE_END == 2);
5998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return construct_language_mode(
59993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      BooleanBit::get(compiler_hints(), kStrictModeFunction));
60003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
60013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid SharedFunctionInfo::set_language_mode(LanguageMode language_mode) {
6003f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  STATIC_ASSERT(LANGUAGE_END == 2);
6004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // We only allow language mode transitions that set the same language mode
6005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // again or go up in the chain:
6006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(is_sloppy(this->language_mode()) || is_strict(language_mode));
60073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int hints = compiler_hints();
6008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  hints = BooleanBit::set(hints, kStrictModeFunction, is_strict(language_mode));
60093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  set_compiler_hints(hints);
60103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
60113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6012f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochFunctionKind SharedFunctionInfo::kind() const {
6013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return FunctionKindBits::decode(compiler_hints());
6014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SharedFunctionInfo::set_kind(FunctionKind kind) {
6017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsValidFunctionKind(kind));
6018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int hints = compiler_hints();
6019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  hints = FunctionKindBits::update(hints, kind);
6020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_compiler_hints(hints);
60213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
60223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
602362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, debugger_hints,
602462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               name_should_print_as_anonymous, kNameShouldPrintAsAnonymous)
602562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, debugger_hints, is_anonymous_expression,
6026109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch               kIsAnonymousExpression)
602762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, debugger_hints, deserialized, kDeserialized)
602862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, debugger_hints, has_no_side_effect,
602962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kHasNoSideEffect)
603062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, debugger_hints, computed_has_no_side_effect,
603162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kComputedHasNoSideEffect)
603262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, debugger_hints, debug_is_blackboxed,
603362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kDebugIsBlackboxed)
603462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, debugger_hints, computed_debug_is_blackboxed,
603562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               kComputedDebugIsBlackboxed)
60363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
60373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Script::HasValidSource() {
60383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  Object* src = this->source();
60393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (!src->IsString()) return true;
60403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  String* src_str = String::cast(src);
60413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (!StringShape(src_str).IsExternal()) return true;
6042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (src_str->IsOneByteRepresentation()) {
6043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return ExternalOneByteString::cast(src)->resource() != NULL;
60443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  } else if (src_str->IsTwoByteRepresentation()) {
60453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    return ExternalTwoByteString::cast(src)->resource() != NULL;
60463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
60473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return true;
60483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
60493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
60503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
6051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::DontAdaptArguments() {
60523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(code()->kind() == Code::BUILTIN || code()->kind() == Code::STUB);
6053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_internal_formal_parameter_count(kDontAdaptArgumentsSentinel);
6054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint SharedFunctionInfo::start_position() const {
6058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return start_position_and_type() >> kStartPositionShift;
6059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_start_position(int start_position) {
6063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_start_position_and_type((start_position << kStartPositionShift)
6064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    | (start_position_and_type() & ~kStartPositionMask));
6065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCode* SharedFunctionInfo::code() const {
6069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Code::cast(READ_FIELD(this, kCodeOffset));
6070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
6074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(value->kind() != Code::OPTIMIZED_FUNCTION);
607562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // If the SharedFunctionInfo has bytecode we should never mark it for lazy
607662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // compile, since the bytecode is never flushed.
607762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(value != GetIsolate()->builtins()->builtin(Builtins::kCompileLazy) ||
607862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         !HasBytecodeArray());
6079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kCodeOffset, value);
60803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
6081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SharedFunctionInfo::ReplaceCode(Code* value) {
6085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If the GC metadata field is already used then the function was
6086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // enqueued as a code flushing candidate and we remove it now.
6087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (code()->gc_metadata() != NULL) {
6088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CodeFlusher* flusher = GetHeap()->mark_compact_collector()->code_flusher();
6089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    flusher->EvictCandidate(this);
6090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(code()->gc_metadata() == NULL && value->gc_metadata() == NULL);
6093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef DEBUG
6094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Code::VerifyRecompiledCode(code(), value);
6095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // DEBUG
6096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_code(value);
6098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6100c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool SharedFunctionInfo::IsInterpreted() const {
6101c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return code()->is_interpreter_trampoline_builtin();
6102c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
6103c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
6104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool SharedFunctionInfo::HasBaselineCode() const {
6105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return code()->kind() == Code::FUNCTION;
6106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
6107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochScopeInfo* SharedFunctionInfo::scope_info() const {
61093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset));
61103bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch}
61113bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
61123bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
61133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid SharedFunctionInfo::set_scope_info(ScopeInfo* value,
61143bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch                                        WriteBarrierMode mode) {
61153bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch  WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value));
61163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(),
61173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            this,
61183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            kScopeInfoOffset,
61193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            reinterpret_cast<Object*>(value),
61203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            mode);
61213bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch}
61223bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch
6123f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(SharedFunctionInfo, outer_scope_info, HeapObject,
6124f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          kOuterScopeInfoOffset)
6125f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
6126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool SharedFunctionInfo::is_compiled() const {
6127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Builtins* builtins = GetIsolate()->builtins();
6128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(code() != builtins->builtin(Builtins::kCompileOptimizedConcurrent));
6129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(code() != builtins->builtin(Builtins::kCompileOptimized));
6130bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK(code() != builtins->builtin(Builtins::kCompileBaseline));
6131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return code() != builtins->builtin(Builtins::kCompileLazy);
6132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool SharedFunctionInfo::has_simple_parameters() {
6136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return scope_info()->HasSimpleParameters();
6137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
613962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool SharedFunctionInfo::HasDebugInfo() const {
614062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool has_debug_info = !debug_info()->IsSmi();
614162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(debug_info()->IsStruct(), has_debug_info);
6142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!has_debug_info || HasDebugCode());
6143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return has_debug_info;
6144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
614662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDebugInfo* SharedFunctionInfo::GetDebugInfo() const {
6147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(HasDebugInfo());
6148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return DebugInfo::cast(debug_info());
6149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
615162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool SharedFunctionInfo::HasDebugCode() const {
6152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (HasBaselineCode()) return code()->has_debug_break_slots();
6153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return HasBytecodeArray();
6154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
615662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochint SharedFunctionInfo::debugger_hints() const {
615762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (HasDebugInfo()) return GetDebugInfo()->debugger_hints();
615862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return Smi::cast(debug_info())->value();
615962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
616062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
616162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid SharedFunctionInfo::set_debugger_hints(int value) {
616262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (HasDebugInfo()) {
616362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    GetDebugInfo()->set_debugger_hints(value);
616462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else {
616562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    set_debug_info(Smi::FromInt(value));
616662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
616762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
6168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
61696ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool SharedFunctionInfo::IsApiFunction() {
61706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return function_data()->IsFunctionTemplateInfo();
61716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
61726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
61736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
61746ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockFunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
6175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsApiFunction());
61766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  return FunctionTemplateInfo::cast(function_data());
61776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
61786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
61793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid SharedFunctionInfo::set_api_func_data(FunctionTemplateInfo* data) {
618013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(function_data()->IsUndefined(GetIsolate()));
61813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  set_function_data(data);
61823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
61836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
618462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool SharedFunctionInfo::HasBytecodeArray() const {
61853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return function_data()->IsBytecodeArray();
61863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
61873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
618862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBytecodeArray* SharedFunctionInfo::bytecode_array() const {
61893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(HasBytecodeArray());
61903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return BytecodeArray::cast(function_data());
61913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
61923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
61933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid SharedFunctionInfo::set_bytecode_array(BytecodeArray* bytecode) {
619413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(function_data()->IsUndefined(GetIsolate()));
61953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  set_function_data(bytecode);
61963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
61973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
61983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid SharedFunctionInfo::ClearBytecodeArray() {
619913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(function_data()->IsUndefined(GetIsolate()) || HasBytecodeArray());
62003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  set_function_data(GetHeap()->undefined_value());
620125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen}
620225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
620362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool SharedFunctionInfo::HasAsmWasmData() const {
6204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return function_data()->IsFixedArray();
6205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
6206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
620762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochFixedArray* SharedFunctionInfo::asm_wasm_data() const {
6208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(HasAsmWasmData());
6209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return FixedArray::cast(function_data());
6210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
6211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
6212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid SharedFunctionInfo::set_asm_wasm_data(FixedArray* data) {
6213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(function_data()->IsUndefined(GetIsolate()) || HasAsmWasmData());
6214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_function_data(data);
6215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
6216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
6217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid SharedFunctionInfo::ClearAsmWasmData() {
6218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  DCHECK(function_data()->IsUndefined(GetIsolate()) || HasAsmWasmData());
6219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  set_function_data(GetHeap()->undefined_value());
6220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
6221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
62223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool SharedFunctionInfo::HasBuiltinFunctionId() {
62233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return function_identifier()->IsSmi();
62243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
622525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen
6226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochBuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
6227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(HasBuiltinFunctionId());
62283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return static_cast<BuiltinFunctionId>(
62293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Smi::cast(function_identifier())->value());
6230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
62323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid SharedFunctionInfo::set_builtin_function_id(BuiltinFunctionId id) {
62333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  set_function_identifier(Smi::FromInt(id));
6234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool SharedFunctionInfo::HasInferredName() {
62373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return function_identifier()->IsString();
62383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
6239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochString* SharedFunctionInfo::inferred_name() {
62413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (HasInferredName()) {
62423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return String::cast(function_identifier());
62433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
624413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate = GetIsolate();
624513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(function_identifier()->IsUndefined(isolate) || HasBuiltinFunctionId());
624613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return isolate->heap()->empty_string();
6247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
62493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid SharedFunctionInfo::set_inferred_name(String* inferred_name) {
625013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(function_identifier()->IsUndefined(GetIsolate()) || HasInferredName());
62513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  set_function_identifier(inferred_name);
62523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
6253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint SharedFunctionInfo::ic_age() {
6255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ICAgeBits::decode(counters());
6256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SharedFunctionInfo::set_ic_age(int ic_age) {
6260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_counters(ICAgeBits::update(counters(), ic_age));
6261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint SharedFunctionInfo::deopt_count() {
6265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DeoptCountBits::decode(counters());
6266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SharedFunctionInfo::set_deopt_count(int deopt_count) {
6270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_counters(DeoptCountBits::update(counters(), deopt_count));
6271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SharedFunctionInfo::increment_deopt_count() {
6275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = counters();
6276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int deopt_count = DeoptCountBits::decode(value);
6277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  deopt_count = (deopt_count + 1) & DeoptCountBits::kMax;
6278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_counters(DeoptCountBits::update(value, deopt_count));
6279756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
6280756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
6281756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
6282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint SharedFunctionInfo::opt_reenable_tries() {
6283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OptReenableTriesBits::decode(counters());
6284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SharedFunctionInfo::set_opt_reenable_tries(int tries) {
6288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_counters(OptReenableTriesBits::update(counters(), tries));
6289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint SharedFunctionInfo::opt_count() {
6293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OptCountBits::decode(opt_count_and_bailout_reason());
6294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SharedFunctionInfo::set_opt_count(int opt_count) {
6298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_opt_count_and_bailout_reason(
6299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      OptCountBits::update(opt_count_and_bailout_reason(), opt_count));
6300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierBailoutReason SharedFunctionInfo::disable_optimization_reason() {
6304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return static_cast<BailoutReason>(
6305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DisabledOptimizationReasonBits::decode(opt_count_and_bailout_reason()));
6306756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
6307756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
6308756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
6309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool SharedFunctionInfo::has_deoptimization_support() {
6310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Code* code = this->code();
6311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return code->kind() == Code::FUNCTION && code->has_deoptimization_support();
6312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
6313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid SharedFunctionInfo::TryReenableOptimization() {
6316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int tries = opt_reenable_tries();
6317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_opt_reenable_tries((tries + 1) & OptReenableTriesBits::kMax);
6318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We reenable optimization whenever the number of tries is a large
6319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // enough power of 2.
6320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (tries >= 16 && (((tries - 1) & tries) == 0)) {
6321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_optimization_disabled(false);
6322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_opt_count(0);
6323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    set_deopt_count(0);
6324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid SharedFunctionInfo::set_disable_optimization_reason(BailoutReason reason) {
6329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_opt_count_and_bailout_reason(DisabledOptimizationReasonBits::update(
6330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      opt_count_and_bailout_reason(), reason));
6331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
633362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool SharedFunctionInfo::IsUserJavaScript() {
6334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* script_obj = script();
633562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (script_obj->IsUndefined(GetIsolate())) return false;
6336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Script* script = Script::cast(script_obj);
633762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return static_cast<Script::Type>(script->type()) == Script::TYPE_NORMAL;
6338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6340c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool SharedFunctionInfo::IsSubjectToDebugging() {
634162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return IsUserJavaScript() && !HasAsmWasmData();
6342c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
6343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool SharedFunctionInfo::OptimizedCodeMapIsCleared() const {
6345c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return optimized_code_map() == GetHeap()->empty_fixed_array();
6346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
634862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochFeedbackVector* JSFunction::feedback_vector() const {
634962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(feedback_vector_cell()->value()->IsFeedbackVector());
635062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return FeedbackVector::cast(feedback_vector_cell()->value());
635162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
6352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSFunction::IsOptimized() {
6354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return code()->kind() == Code::OPTIMIZED_FUNCTION;
63558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
63568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6357c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool JSFunction::IsInterpreted() {
6358c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return code()->is_interpreter_trampoline_builtin();
6359c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
6360c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
6361bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool JSFunction::IsMarkedForBaseline() {
6362bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return code() ==
6363bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         GetIsolate()->builtins()->builtin(Builtins::kCompileBaseline);
6364bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
63658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSFunction::IsMarkedForOptimization() {
6367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return code() == GetIsolate()->builtins()->builtin(
6368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Builtins::kCompileOptimized);
6369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
6370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSFunction::IsMarkedForConcurrentOptimization() {
6373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return code() == GetIsolate()->builtins()->builtin(
6374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Builtins::kCompileOptimizedConcurrent);
6375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSFunction::IsInOptimizationQueue() {
6379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return code() == GetIsolate()->builtins()->builtin(
6380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      Builtins::kInOptimizationQueue);
6381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSFunction::CompleteInobjectSlackTrackingIfActive() {
6385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (has_initial_map() && initial_map()->IsInobjectSlackTrackingInProgress()) {
6386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    initial_map()->CompleteInobjectSlackTracking();
6387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
6388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Map::IsInobjectSlackTrackingInProgress() {
6392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return construction_counter() != Map::kNoSlackTracking;
6393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Map::InobjectSlackTrackingStep() {
6397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!IsInobjectSlackTrackingInProgress()) return;
6398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int counter = construction_counter();
6399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_construction_counter(counter - 1);
6400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (counter == kSlackTrackingCounterEnd) {
6401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    CompleteInobjectSlackTracking();
6402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
6403756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
6404756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
64053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochAbstractCode* JSFunction::abstract_code() {
6406c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (IsInterpreted()) {
64073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return AbstractCode::cast(shared()->bytecode_array());
64083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {
6409c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    return AbstractCode::cast(code());
64103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
64113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
6412756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
6413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCode* JSFunction::code() {
6414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Code::cast(
6415791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block      Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset)));
6416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_code(Code* value) {
6420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!GetHeap()->InNewSpace(value));
6421791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  Address entry = value->entry();
6422791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block  WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
64233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GetHeap()->incremental_marking()->RecordWriteOfCodeEntry(
64243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      this,
64253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HeapObject::RawField(this, kCodeEntryOffset),
64263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      value);
6427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSFunction::set_code_no_write_barrier(Code* value) {
6431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!GetHeap()->InNewSpace(value));
6432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address entry = value->entry();
6433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
6434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid JSFunction::ReplaceCode(Code* code) {
6438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool was_optimized = IsOptimized();
6439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
6440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (was_optimized && is_optimized) {
6442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    shared()->EvictFromOptimizedCodeMap(this->code(),
6443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        "Replacing with another optimized code");
6444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  set_code(code);
6447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Add/remove the function from the list of optimized functions for this
6449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // context based on the state change.
6450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!was_optimized && is_optimized) {
6451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    context()->native_context()->AddOptimizedFunction(this);
6452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (was_optimized && !is_optimized) {
6454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // TODO(titzer): linear in the number of optimized functions; fix!
6455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    context()->native_context()->RemoveOptimizedFunction(this);
6456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
6458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
645962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool JSFunction::has_feedback_vector() const {
646062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return !feedback_vector_cell()->value()->IsUndefined(GetIsolate());
646162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
646262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
646362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochJSFunction::FeedbackVectorState JSFunction::GetFeedbackVectorState(
646462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Isolate* isolate) const {
646562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Cell* cell = feedback_vector_cell();
646662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (cell == isolate->heap()->undefined_cell()) {
646762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return TOP_LEVEL_SCRIPT_NEEDS_VECTOR;
646862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else if (cell->value() == isolate->heap()->undefined_value() ||
646962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch             !has_feedback_vector()) {
647062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return NEEDS_VECTOR;
647162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
647262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return HAS_VECTOR;
647362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
6474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
6475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockContext* JSFunction::context() {
6476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Context::cast(READ_FIELD(this, kContextOffset));
6477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
647962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool JSFunction::has_context() const {
648062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return READ_FIELD(this, kContextOffset)->IsContext();
648162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
6482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochJSObject* JSFunction::global_proxy() {
6484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return context()->global_proxy();
6485756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
6486756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
6487756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
6488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochContext* JSFunction::native_context() { return context()->native_context(); }
6489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_context(Object* value) {
649213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(value->IsUndefined(GetIsolate()) || value->IsContext());
6493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  WRITE_FIELD(this, kContextOffset, value);
64943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
6495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, prototype_or_initial_map, Object,
6498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block          kPrototypeOrInitialMapOffset)
6499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* JSFunction::initial_map() {
6502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Map::cast(prototype_or_initial_map());
6503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_initial_map() {
6507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return prototype_or_initial_map()->IsMap();
6508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_instance_prototype() {
651213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return has_initial_map() ||
651313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch         !prototype_or_initial_map()->IsTheHole(GetIsolate());
6514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_prototype() {
6518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_non_instance_prototype() || has_instance_prototype();
6519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::instance_prototype() {
6523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(has_instance_prototype());
6524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (has_initial_map()) return initial_map()->prototype();
6525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // When there is no initial map and the prototype is a JSObject, the
6526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // initial map field is used for the prototype field.
6527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return prototype_or_initial_map();
6528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::prototype() {
6532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(has_prototype());
6533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // If the function's prototype property has been set to a non-JSObject
6534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // value, that value is stored in the constructor field of the map.
6535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (map()->has_non_instance_prototype()) {
6536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Object* prototype = map()->GetConstructor();
6537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // The map must have a prototype in that field, not a back pointer.
6538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(!prototype->IsMap());
6539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return prototype;
6540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
6541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return instance_prototype();
6542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::is_compiled() {
6546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Builtins* builtins = GetIsolate()->builtins();
6547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return code() != builtins->builtin(Builtins::kCompileLazy) &&
6548bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch         code() != builtins->builtin(Builtins::kCompileBaseline) &&
6549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         code() != builtins->builtin(Builtins::kCompileOptimized) &&
6550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch         code() != builtins->builtin(Builtins::kCompileOptimizedConcurrent);
65513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
65523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSProxy, target, JSReceiver, kTargetOffset)
6554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochACCESSORS(JSProxy, handler, Object, kHandlerOffset)
65553ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSProxy, hash, Object, kHashOffset)
6556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSProxy::IsRevoked() const { return !handler()->IsJSReceiver(); }
6558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
6559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSCollection, table, Object, kTableOffset)
6560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ORDERED_HASH_TABLE_ITERATOR_ACCESSORS(name, type, offset)    \
6563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template<class Derived, class TableType>                           \
6564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  type* OrderedHashTableIterator<Derived, TableType>::name() const { \
6565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return type::cast(READ_FIELD(this, offset));                     \
6566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }                                                                  \
6567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template<class Derived, class TableType>                           \
6568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void OrderedHashTableIterator<Derived, TableType>::set_##name(     \
6569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      type* value, WriteBarrierMode mode) {                          \
6570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    WRITE_FIELD(this, offset, value);                                \
6571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); \
6572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochORDERED_HASH_TABLE_ITERATOR_ACCESSORS(table, Object, kTableOffset)
6575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochORDERED_HASH_TABLE_ITERATOR_ACCESSORS(index, Object, kIndexOffset)
6576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochORDERED_HASH_TABLE_ITERATOR_ACCESSORS(kind, Object, kKindOffset)
6577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef ORDERED_HASH_TABLE_ITERATOR_ACCESSORS
6579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSWeakCollection, table, Object, kTableOffset)
6582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSWeakCollection, next, Object, kNextOffset)
658369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
658469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
65853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochAddress Foreign::foreign_address() {
65863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return AddressFrom<Address>(READ_INTPTR_FIELD(this, kForeignAddressOffset));
658769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
658869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
658969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
65903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Foreign::set_foreign_address(Address value) {
65913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WRITE_INTPTR_FIELD(this, kForeignAddressOffset, OffsetFrom(value));
6592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSGeneratorObject, function, JSFunction, kFunctionOffset)
6596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSGeneratorObject, context, Context, kContextOffset)
6597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochACCESSORS(JSGeneratorObject, receiver, Object, kReceiverOffset)
659813e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochACCESSORS(JSGeneratorObject, input_or_debug_pos, Object, kInputOrDebugPosOffset)
6599bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochSMI_ACCESSORS(JSGeneratorObject, resume_mode, kResumeModeOffset)
6600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSMI_ACCESSORS(JSGeneratorObject, continuation, kContinuationOffset)
660162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSGeneratorObject, register_file, FixedArray, kRegisterFileOffset)
6602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
660313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool JSGeneratorObject::is_suspended() const {
6604bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK_LT(kGeneratorExecuting, 0);
6605bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  DCHECK_LT(kGeneratorClosed, 0);
6606bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return continuation() >= 0;
6607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
660913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool JSGeneratorObject::is_closed() const {
6610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return continuation() == kGeneratorClosed;
6611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
661313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool JSGeneratorObject::is_executing() const {
6614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return continuation() == kGeneratorExecuting;
6615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSValue, value, Object, kValueOffset)
6618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHeapNumber* HeapNumber::cast(Object* object) {
6621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(object->IsHeapNumber() || object->IsMutableHeapNumber());
6622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<HeapNumber*>(object);
6623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst HeapNumber* HeapNumber::cast(const Object* object) {
6627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SLOW_DCHECK(object->IsHeapNumber() || object->IsMutableHeapNumber());
6628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return reinterpret_cast<const HeapNumber*>(object);
6629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
66323ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, value, Object, kValueOffset)
66333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset)
66343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, year, Object, kYearOffset)
66353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, month, Object, kMonthOffset)
66363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, day, Object, kDayOffset)
66373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, weekday, Object, kWeekdayOffset)
66383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, hour, Object, kHourOffset)
66393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, min, Object, kMinOffset)
66403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, sec, Object, kSecOffset)
66413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
66423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
6643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSMI_ACCESSORS(JSMessageObject, type, kTypeOffset)
6644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSMessageObject, argument, Object, kArgumentsOffset)
66451e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, script, Object, kScriptOffset)
66461e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
66471e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockSMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
66481e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockSMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
664962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSMI_ACCESSORS(JSMessageObject, error_level, kErrorLevelOffset)
66501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockINT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
6652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINT_ACCESSORS(Code, prologue_offset, kPrologueOffset)
6653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochINT_ACCESSORS(Code, constant_pool_offset, kConstantPoolOffset)
665462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define CODE_ACCESSORS(name, type, offset)           \
665562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ACCESSORS_CHECKED2(Code, name, type, offset, true, \
665662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                     !GetHeap()->InNewSpace(value))
665762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCODE_ACCESSORS(relocation_info, ByteArray, kRelocationInfoOffset)
665862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCODE_ACCESSORS(handler_table, FixedArray, kHandlerTableOffset)
665962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCODE_ACCESSORS(deoptimization_data, FixedArray, kDeoptimizationDataOffset)
666062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCODE_ACCESSORS(source_position_table, ByteArray, kSourcePositionTableOffset)
666162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCODE_ACCESSORS(raw_type_feedback_info, Object, kTypeFeedbackInfoOffset)
666262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCODE_ACCESSORS(next_code_link, Object, kNextCodeLinkOffset)
666362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef CODE_ACCESSORS
6664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::WipeOutHeader() {
6666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kRelocationInfoOffset, NULL);
6667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kHandlerTableOffset, NULL);
6668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kDeoptimizationDataOffset, NULL);
6669f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  WRITE_FIELD(this, kSourcePositionTableOffset, NULL);
6670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Do not wipe out major/minor keys on a code stub or IC
6671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) {
6672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL);
6673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
6674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_FIELD(this, kNextCodeLinkOffset, NULL);
6675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_FIELD(this, kGCMetadataOffset, NULL);
6676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Code::type_feedback_info() {
6680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(kind() == FUNCTION);
6681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return raw_type_feedback_info();
6682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_type_feedback_info(Object* value, WriteBarrierMode mode) {
6686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(kind() == FUNCTION);
6687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_raw_type_feedback_info(value, mode);
6688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kTypeFeedbackInfoOffset,
6689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                            value, mode);
6690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t Code::stub_key() {
6694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsCodeStubOrIC());
6695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Smi* smi_key = Smi::cast(raw_type_feedback_info());
6696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return static_cast<uint32_t>(smi_key->value());
6697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Code::set_stub_key(uint32_t key) {
6701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsCodeStubOrIC());
6702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  set_raw_type_feedback_info(Smi::FromInt(key));
6703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
67063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset)
67073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochINT_ACCESSORS(Code, ic_age, kICAgeOffset)
6708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::instruction_start()  {
6711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FIELD_ADDR(this, kHeaderSize);
6712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbyte* Code::instruction_end()  {
6716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instruction_start() + instruction_size();
6717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
671913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochint Code::GetUnwindingInfoSizeOffset() const {
672013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(has_unwinding_info());
672113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return RoundUp(kHeaderSize + instruction_size(), kInt64Size);
672213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
672313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
672413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochint Code::unwinding_info_size() const {
672513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(has_unwinding_info());
672613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return static_cast<int>(
672713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      READ_UINT64_FIELD(this, GetUnwindingInfoSizeOffset()));
672813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
672913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
673013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Code::set_unwinding_info_size(int value) {
673113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(has_unwinding_info());
673213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  WRITE_UINT64_FIELD(this, GetUnwindingInfoSizeOffset(), value);
673313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
673413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
673513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbyte* Code::unwinding_info_start() {
673613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(has_unwinding_info());
673713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return FIELD_ADDR(this, GetUnwindingInfoSizeOffset()) + kInt64Size;
673813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
673913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
674013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbyte* Code::unwinding_info_end() {
674113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(has_unwinding_info());
674213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return unwinding_info_start() + unwinding_info_size();
674313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
6744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Code::body_size() {
674613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  int unpadded_body_size =
674713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      has_unwinding_info()
674813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch          ? static_cast<int>(unwinding_info_end() - instruction_start())
674913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch          : instruction_size();
675013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return RoundUp(unpadded_body_size, kObjectAlignment);
6751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
675313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochint Code::SizeIncludingMetadata() {
675413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  int size = CodeSize();
675513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  size += relocation_info()->Size();
675613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  size += deoptimization_data()->Size();
675713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  size += handler_table()->Size();
6758f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (kind() == FUNCTION) size += source_position_table()->Size();
675913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return size;
676013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
6761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochByteArray* Code::unchecked_relocation_info() {
6763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
6764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbyte* Code::relocation_start() {
6768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return unchecked_relocation_info()->GetDataStartAddress();
6769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Code::relocation_size() {
6773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return unchecked_relocation_info()->length();
6774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbyte* Code::entry() {
6778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instruction_start();
6779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Code::contains(byte* inner_pointer) {
6783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return (address() <= inner_pointer) && (inner_pointer <= address() + Size());
6784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Code::ExecutableSize() {
6788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Check that the assumptions about the layout of the code object holds.
6789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(static_cast<int>(instruction_start() - address()),
6790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            Code::kHeaderSize);
6791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return instruction_size() + Code::kHeaderSize;
6792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochint Code::CodeSize() { return SizeFor(body_size()); }
6796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSArray, length, Object, kLengthOffset)
6799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid* JSArrayBuffer::backing_store() const {
6802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  intptr_t ptr = READ_INTPTR_FIELD(this, kBackingStoreOffset);
6803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return reinterpret_cast<void*>(ptr);
6804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSArrayBuffer::set_backing_store(void* value, WriteBarrierMode mode) {
6808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  intptr_t ptr = reinterpret_cast<intptr_t>(value);
6809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_INTPTR_FIELD(this, kBackingStoreOffset, ptr);
6810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSArrayBuffer, byte_length, Object, kByteLengthOffset)
6814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSArrayBuffer::set_bit_field(uint32_t bits) {
6817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (kInt32Size != kPointerSize) {
6818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_LITTLE_ENDIAN
6819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WRITE_UINT32_FIELD(this, kBitFieldSlot + kInt32Size, 0);
6820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#else
6821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WRITE_UINT32_FIELD(this, kBitFieldSlot, 0);
6822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
6823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
6824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_UINT32_FIELD(this, kBitFieldOffset, bits);
6825ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
6826ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
6827ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
6828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochuint32_t JSArrayBuffer::bit_field() const {
6829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return READ_UINT32_FIELD(this, kBitFieldOffset);
6830ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
6831ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
6832ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
6833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSArrayBuffer::is_external() { return IsExternal::decode(bit_field()); }
6834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSArrayBuffer::set_is_external(bool value) {
683762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK(!value || !has_guard_region());
6838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field(IsExternal::update(bit_field(), value));
6839ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke}
6840ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
6841ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke
6842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSArrayBuffer::is_neuterable() {
6843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsNeuterable::decode(bit_field());
6844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSArrayBuffer::set_is_neuterable(bool value) {
6848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field(IsNeuterable::update(bit_field(), value));
6849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSArrayBuffer::was_neutered() { return WasNeutered::decode(bit_field()); }
6853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
6855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSArrayBuffer::set_was_neutered(bool value) {
6856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field(WasNeutered::update(bit_field(), value));
6857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSArrayBuffer::is_shared() { return IsShared::decode(bit_field()); }
6861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSArrayBuffer::set_is_shared(bool value) {
6864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_bit_field(IsShared::update(bit_field(), value));
6865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
686762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool JSArrayBuffer::has_guard_region() {
686862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return HasGuardRegion::decode(bit_field());
686962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
687062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
687162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid JSArrayBuffer::set_has_guard_region(bool value) {
687262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  set_bit_field(HasGuardRegion::update(bit_field(), value));
687362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
6874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* JSArrayBufferView::byte_offset() const {
6876c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (WasNeutered()) return Smi::kZero;
6877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Object::cast(READ_FIELD(this, kByteOffsetOffset));
6878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSArrayBufferView::set_byte_offset(Object* value, WriteBarrierMode mode) {
6882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_FIELD(this, kByteOffsetOffset, value);
6883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kByteOffsetOffset, value, mode);
6884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* JSArrayBufferView::byte_length() const {
6888c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (WasNeutered()) return Smi::kZero;
6889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Object::cast(READ_FIELD(this, kByteLengthOffset));
6890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSArrayBufferView::set_byte_length(Object* value, WriteBarrierMode mode) {
6894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_FIELD(this, kByteLengthOffset, value);
6895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kByteLengthOffset, value, mode);
6896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSArrayBufferView, buffer, Object, kBufferOffset)
6900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP
6901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSArrayBufferView, raw_byte_offset, Object, kByteOffsetOffset)
6902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSArrayBufferView, raw_byte_length, Object, kByteLengthOffset)
6903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
6904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSArrayBufferView::WasNeutered() const {
6907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return JSArrayBuffer::cast(buffer())->was_neutered();
6908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
6909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* JSTypedArray::length() const {
6912c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (WasNeutered()) return Smi::kZero;
6913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Object::cast(READ_FIELD(this, kLengthOffset));
6914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
6915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
6916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
6917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochuint32_t JSTypedArray::length_value() const {
6918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (WasNeutered()) return 0;
6919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  uint32_t index = 0;
6920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(Object::cast(READ_FIELD(this, kLengthOffset))->ToArrayLength(&index));
6921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return index;
6922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
6923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
6924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
6925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSTypedArray::set_length(Object* value, WriteBarrierMode mode) {
6926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WRITE_FIELD(this, kLengthOffset, value);
6927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kLengthOffset, value, mode);
6928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
6929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
693062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// static
693162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<JSTypedArray> JSTypedArray::Validate(Isolate* isolate,
693262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                 Handle<Object> receiver,
693362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                 const char* method_name) {
693462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (V8_UNLIKELY(!receiver->IsJSTypedArray())) {
693562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    const MessageTemplate::Template message = MessageTemplate::kNotTypedArray;
693662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    THROW_NEW_ERROR(isolate, NewTypeError(message), JSTypedArray);
693762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
693862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
693962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // TODO(caitp): throw if array.[[ViewedArrayBuffer]] is neutered (per v8:4648)
694062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return Handle<JSTypedArray>::cast(receiver);
694162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
6942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP
6944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSTypedArray, raw_length, Object, kLengthOffset)
6945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
6946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
694762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromiseCapability, promise, Object, kPromiseOffset)
694862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromiseCapability, resolve, Object, kResolveOffset)
694962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromiseCapability, reject, Object, kRejectOffset)
695062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
695162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSMI_ACCESSORS(JSPromise, status, kStatusOffset)
695262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromise, result, Object, kResultOffset)
695362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromise, deferred_promise, Object, kDeferredPromiseOffset)
695462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromise, deferred_on_resolve, Object, kDeferredOnResolveOffset)
695562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromise, deferred_on_reject, Object, kDeferredOnRejectOffset)
695662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromise, fulfill_reactions, Object, kFulfillReactionsOffset)
695762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSPromise, reject_reactions, Object, kRejectReactionsOffset)
695862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSMI_ACCESSORS(JSPromise, flags, kFlagsOffset)
695962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(JSPromise, flags, has_handler, kHasHandlerBit)
696062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochBOOL_ACCESSORS(JSPromise, flags, handled_hint, kHandledHintBit)
6961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSRegExp, data, Object, kDataOffset)
6963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSRegExp, flags, Object, kFlagsOffset)
6964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochACCESSORS(JSRegExp, source, Object, kSourceOffset)
6965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Type JSRegExp::TypeTag() {
6968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
696913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (data->IsUndefined(GetIsolate())) return JSRegExp::NOT_COMPILED;
6970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
6971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return static_cast<JSRegExp::Type>(smi->value());
6972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSRegExp::CaptureCount() {
6976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  switch (TypeTag()) {
6977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case ATOM:
6978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return 0;
6979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    case IRREGEXP:
6980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value();
6981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    default:
6982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      UNREACHABLE();
6983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      return -1;
6984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
6985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Flags JSRegExp::GetFlags() {
6989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(this->data()->IsFixedArray());
6990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
6991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex));
6992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Flags(smi->value());
6993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
6994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
6996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* JSRegExp::Pattern() {
6997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(this->data()->IsFixedArray());
6998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  Object* data = this->data();
6999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  String* pattern = String::cast(FixedArray::cast(data)->get(kSourceIndex));
7000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return pattern;
7001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSRegExp::DataAt(int index) {
7005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(TypeTag() != NOT_COMPILED);
7006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return FixedArray::cast(data())->get(index);
7007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSRegExp::SetDataAt(int index, Object* value) {
7011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(TypeTag() != NOT_COMPILED);
7012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(index >= kDataIndex);  // Only implementation data can be set this way.
7013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  FixedArray::cast(data())->set(index, value);
7014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7016c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid JSRegExp::SetLastIndex(int index) {
7017c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  static const int offset =
7018c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      kSize + JSRegExp::kLastIndexFieldIndex * kPointerSize;
7019c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Smi* value = Smi::FromInt(index);
7020c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  WRITE_FIELD(this, offset, value);
7021c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
7022c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
7023c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochObject* JSRegExp::LastIndex() {
7024c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  static const int offset =
7025c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      kSize + JSRegExp::kLastIndexFieldIndex * kPointerSize;
7026c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return READ_FIELD(this, offset);
7027c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
7028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7029589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochElementsKind JSObject::GetElementsKind() {
70303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  ElementsKind kind = map()->elements_kind();
7031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if VERIFY_HEAP && DEBUG
70323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  FixedArrayBase* fixed_array =
70333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset));
7034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If a GC was caused while constructing this object, the elements
7036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // pointer may point to a one pointer filler map.
7037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (ElementsAreSafeToExamine()) {
7038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Map* map = fixed_array->map();
703913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (IsFastSmiOrObjectElementsKind(kind)) {
704013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      DCHECK(map == GetHeap()->fixed_array_map() ||
704113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch             map == GetHeap()->fixed_cow_array_map());
704213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    } else if (IsFastDoubleElementsKind(kind)) {
704313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      DCHECK(fixed_array->IsFixedDoubleArray() ||
704413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch             fixed_array == GetHeap()->empty_fixed_array());
704513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    } else if (kind == DICTIONARY_ELEMENTS) {
704613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      DCHECK(fixed_array->IsFixedArray());
704713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      DCHECK(fixed_array->IsDictionary());
704813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    } else {
704913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      DCHECK(kind > DICTIONARY_ELEMENTS);
705013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    }
7051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(!IsSloppyArgumentsElements(kind) ||
70523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch           (elements()->IsFixedArray() && elements()->length() >= 2));
7053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
70543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
70553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return kind;
7056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSObject::HasFastObjectElements() {
7060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsFastObjectElementsKind(GetElementsKind());
7061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSObject::HasFastSmiElements() {
7065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsFastSmiElementsKind(GetElementsKind());
70663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
70673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
70683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSObject::HasFastSmiOrObjectElements() {
7070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsFastSmiOrObjectElementsKind(GetElementsKind());
70713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
70723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
70733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
70743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool JSObject::HasFastDoubleElements() {
7075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsFastDoubleElementsKind(GetElementsKind());
7076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSObject::HasFastHoleyElements() {
7080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsFastHoleyElementsKind(GetElementsKind());
7081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSObject::HasFastElements() {
7085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsFastElementsKind(GetElementsKind());
70863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
70873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
70883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
7089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasDictionaryElements() {
7090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return GetElementsKind() == DICTIONARY_ELEMENTS;
7091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSObject::HasFastArgumentsElements() {
7095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return GetElementsKind() == FAST_SLOPPY_ARGUMENTS_ELEMENTS;
70963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
70973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
70983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSObject::HasSlowArgumentsElements() {
7100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return GetElementsKind() == SLOW_SLOPPY_ARGUMENTS_ELEMENTS;
71013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
71023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
71033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
7104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSObject::HasSloppyArgumentsElements() {
7105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsSloppyArgumentsElements(GetElementsKind());
71063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
71073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
7108109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool JSObject::HasStringWrapperElements() {
7109109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return IsStringWrapperElementsKind(GetElementsKind());
7110109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
7111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7112109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool JSObject::HasFastStringWrapperElements() {
7113109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return GetElementsKind() == FAST_STRING_WRAPPER_ELEMENTS;
7114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7116109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool JSObject::HasSlowStringWrapperElements() {
7117109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return GetElementsKind() == SLOW_STRING_WRAPPER_ELEMENTS;
7118109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
7119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7120109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochbool JSObject::HasFixedTypedArrayElements() {
7121109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK_NOT_NULL(elements());
7122109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return map()->has_fixed_typed_array_elements();
7123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7125109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size)      \
7126109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool JSObject::HasFixed##Type##Elements() {                          \
7127109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    HeapObject* array = elements();                                    \
7128109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    DCHECK(array != NULL);                                             \
7129109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    if (!array->IsHeapObject()) return false;                          \
7130109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \
7131109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
7132109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
7133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK)
7134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIXED_TYPED_ELEMENTS_CHECK
71363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
71373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
7138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasNamedInterceptor() {
7139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_named_interceptor();
7140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasIndexedInterceptor() {
7144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return map()->has_indexed_interceptor();
7145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochGlobalDictionary* JSObject::global_dictionary() {
7149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!HasFastProperties());
7150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(IsJSGlobalObject());
7151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return GlobalDictionary::cast(properties());
7152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7155c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochSeededNumberDictionary* JSObject::element_dictionary() {
7156109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  DCHECK(HasDictionaryElements() || HasSlowStringWrapperElements());
7157c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return SeededNumberDictionary::cast(elements());
7158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Name::IsHashFieldComputed(uint32_t field) {
71627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return (field & kHashNotComputedMask) == 0;
71637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch}
71647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
71657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch
7166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Name::HasHashCode() {
71677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  return IsHashFieldComputed(hash_field());
7168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t Name::Hash() {
7172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Fast case: has hash code already been computed?
7173d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  uint32_t field = hash_field();
71747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsHashFieldComputed(field)) return field >> kHashShift;
7175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Slow case: compute hash code and set it. Has to be a string.
7176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return String::cast(this)->ComputeAndSetHash();
7177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Name::IsPrivate() {
7181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return this->IsSymbol() && Symbol::cast(this)->is_private();
7182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7185c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochStringHasher::StringHasher(int length, uint32_t seed)
7186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  : length_(length),
7187c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch    raw_running_hash_(seed),
7188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    array_index_(0),
7189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize),
7190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    is_first_char_(true) {
7191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(FLAG_randomize_hashes || raw_running_hash_ == 0);
7192c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
7193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringHasher::has_trivial_hash() {
7196d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return length_ > String::kMaxHashCalcLength;
7197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t StringHasher::AddCharacterCore(uint32_t running_hash, uint16_t c) {
7201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  running_hash += c;
7202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  running_hash += (running_hash << 10);
7203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  running_hash ^= (running_hash >> 6);
7204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return running_hash;
7205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t StringHasher::GetHashCore(uint32_t running_hash) {
7209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  running_hash += (running_hash << 3);
7210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  running_hash ^= (running_hash >> 11);
7211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  running_hash += (running_hash << 15);
7212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if ((running_hash & String::kHashBitMask) == 0) {
7213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return kZeroHash;
72143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return running_hash;
7216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernieruint32_t StringHasher::ComputeRunningHash(uint32_t running_hash,
7220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                          const uc16* chars, int length) {
7221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_NOT_NULL(chars);
7222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(length >= 0);
7223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (int i = 0; i < length; ++i) {
7224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    running_hash = AddCharacterCore(running_hash, *chars++);
7225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
7226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return running_hash;
7227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
7228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
7229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
7230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernieruint32_t StringHasher::ComputeRunningHashOneByte(uint32_t running_hash,
7231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                                 const char* chars,
7232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                                 int length) {
7233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK_NOT_NULL(chars);
7234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(length >= 0);
7235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (int i = 0; i < length; ++i) {
7236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    uint16_t c = static_cast<uint16_t>(*chars++);
7237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    running_hash = AddCharacterCore(running_hash, c);
7238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
7239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return running_hash;
7240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
7241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
7242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
7243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StringHasher::AddCharacter(uint16_t c) {
7244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Use the Jenkins one-at-a-time hash function to update the hash
7245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // for the given character.
7246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  raw_running_hash_ = AddCharacterCore(raw_running_hash_, c);
7247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool StringHasher::UpdateIndex(uint16_t c) {
7251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(is_array_index_);
7252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (c < '0' || c > '9') {
7253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    is_array_index_ = false;
7254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
7255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int d = c - '0';
7257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (is_first_char_) {
7258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    is_first_char_ = false;
7259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (c == '0' && length_ > 1) {
7260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      is_array_index_ = false;
7261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return false;
7262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (array_index_ > 429496729U - ((d + 3) >> 3)) {
7265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    is_array_index_ = false;
7266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return false;
72673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
7268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array_index_ = array_index_ * 10 + d;
7269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return true;
7270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename Char>
7274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void StringHasher::AddCharacters(const Char* chars, int length) {
7275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(sizeof(Char) == 1 || sizeof(Char) == 2);
7276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int i = 0;
7277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (is_array_index_) {
7278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    for (; i < length; i++) {
7279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      AddCharacter(chars[i]);
7280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if (!UpdateIndex(chars[i])) {
7281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        i++;
7282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        break;
7283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      }
7284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
7285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
7286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (; i < length; i++) {
7287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(!is_array_index_);
7288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    AddCharacter(chars[i]);
7289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
7290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
729344f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktemplate <typename schar>
7294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t StringHasher::HashSequentialString(const schar* chars,
7295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            int length,
7296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                            uint32_t seed) {
7297c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  StringHasher hasher(length, seed);
7298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!hasher.has_trivial_hash()) hasher.AddCharacters(chars, length);
7299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return hasher.GetHashField();
7300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochIteratingStringHasher::IteratingStringHasher(int len, uint32_t seed)
7304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    : StringHasher(len, seed) {}
7305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t IteratingStringHasher::Hash(String* string, uint32_t seed) {
7308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  IteratingStringHasher hasher(string->length(), seed);
7309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Nothing to do.
7310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (hasher.has_trivial_hash()) return hasher.GetHashField();
7311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ConsString* cons_string = String::VisitFlat(&hasher, string);
7312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (cons_string == nullptr) return hasher.GetHashField();
7313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  hasher.VisitConsString(cons_string);
731444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return hasher.GetHashField();
731544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
731644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
731744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid IteratingStringHasher::VisitOneByteString(const uint8_t* chars,
7319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               int length) {
7320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddCharacters(chars, length);
7321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid IteratingStringHasher::VisitTwoByteString(const uint16_t* chars,
7325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               int length) {
7326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  AddCharacters(chars, length);
7327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Name::AsArrayIndex(uint32_t* index) {
7331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return IsString() && String::cast(this)->AsArrayIndex(index);
7332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::AsArrayIndex(uint32_t* index) {
7336d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  uint32_t field = hash_field();
73377f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) {
73387f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch    return false;
73397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch  }
7340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return SlowAsArrayIndex(index);
7341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid String::SetForwardedInternalizedString(String* canonical) {
7345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsInternalizedString());
7346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(HasHashCode());
7347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (canonical == this) return;  // No need to forward.
7348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(SlowEquals(canonical));
7349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(canonical->IsInternalizedString());
7350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(canonical->HasHashCode());
7351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  WRITE_FIELD(this, kHashFieldSlot, canonical);
7352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Setting the hash field to a tagged value sets the LSB, causing the hash
7353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // code to be interpreted as uninitialized.  We use this fact to recognize
7354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // that we have a forwarded string.
7355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!HasHashCode());
7356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochString* String::GetForwardedInternalizedString() {
7360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(IsInternalizedString());
7361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (HasHashCode()) return this;
7362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  String* canonical = String::cast(READ_FIELD(this, kHashFieldSlot));
7363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(canonical->IsInternalizedString());
7364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(SlowEquals(canonical));
7365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(canonical->HasHashCode());
7366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return canonical;
7367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
7371109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochMaybe<bool> Object::GreaterThan(Handle<Object> x, Handle<Object> y) {
7372109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Maybe<ComparisonResult> result = Compare(x, y);
7373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (result.IsJust()) {
7374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    switch (result.FromJust()) {
7375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kGreaterThan:
7376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Just(true);
7377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kLessThan:
7378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kEqual:
7379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kUndefined:
7380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Just(false);
7381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
7382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
7383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Nothing<bool>();
7384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
7388109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochMaybe<bool> Object::GreaterThanOrEqual(Handle<Object> x, Handle<Object> y) {
7389109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Maybe<ComparisonResult> result = Compare(x, y);
7390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (result.IsJust()) {
7391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    switch (result.FromJust()) {
7392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kEqual:
7393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kGreaterThan:
7394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Just(true);
7395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kLessThan:
7396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kUndefined:
7397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Just(false);
7398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
7399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
7400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Nothing<bool>();
7401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
7405109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochMaybe<bool> Object::LessThan(Handle<Object> x, Handle<Object> y) {
7406109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Maybe<ComparisonResult> result = Compare(x, y);
7407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (result.IsJust()) {
7408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    switch (result.FromJust()) {
7409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kLessThan:
7410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Just(true);
7411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kEqual:
7412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kGreaterThan:
7413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kUndefined:
7414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Just(false);
7415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
7416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
7417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Nothing<bool>();
7418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// static
7422109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochMaybe<bool> Object::LessThanOrEqual(Handle<Object> x, Handle<Object> y) {
7423109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Maybe<ComparisonResult> result = Compare(x, y);
7424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (result.IsJust()) {
7425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    switch (result.FromJust()) {
7426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kEqual:
7427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kLessThan:
7428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Just(true);
7429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kGreaterThan:
7430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kUndefined:
7431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Just(false);
7432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
7433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
7434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Nothing<bool>();
7435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybeHandle<Object> Object::GetPropertyOrElement(Handle<Object> object,
7438109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                                 Handle<Name> name) {
7439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it =
7440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LookupIterator::PropertyOrElement(name->GetIsolate(), object, name);
7441109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return GetProperty(&it);
7442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
74443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochMaybeHandle<Object> Object::SetPropertyOrElement(Handle<Object> object,
74453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                 Handle<Name> name,
74463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                 Handle<Object> value,
74473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                 LanguageMode language_mode,
74483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                 StoreFromKeyed store_mode) {
74493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it =
74503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      LookupIterator::PropertyOrElement(name->GetIsolate(), object, name);
74513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  MAYBE_RETURN_NULL(SetProperty(&it, value, language_mode, store_mode));
74523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return value;
74533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
74543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
7455109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochMaybeHandle<Object> Object::GetPropertyOrElement(Handle<Object> receiver,
7456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                 Handle<Name> name,
7457109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                                 Handle<JSReceiver> holder) {
7458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it = LookupIterator::PropertyOrElement(
7459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      name->GetIsolate(), receiver, name, holder);
7460109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return GetProperty(&it);
7461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSReceiver::initialize_properties() {
7465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
7466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!GetHeap()->InNewSpace(GetHeap()->empty_properties_dictionary()));
7467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (map()->is_dictionary_map()) {
7468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WRITE_FIELD(this, kPropertiesOffset,
7469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                GetHeap()->empty_properties_dictionary());
7470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
7471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array());
7472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
7473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSReceiver::HasFastProperties() {
7477c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_EQ(properties()->IsDictionary(), map()->is_dictionary_map());
7478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return !properties()->IsDictionary();
7479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochNameDictionary* JSReceiver::property_dictionary() {
7483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!HasFastProperties());
7484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!IsJSGlobalObject());
7485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return NameDictionary::cast(properties());
7486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybe<bool> JSReceiver::HasProperty(Handle<JSReceiver> object,
7489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    Handle<Name> name) {
74903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it = LookupIterator::PropertyOrElement(object->GetIsolate(),
74913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                        object, name, object);
7492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return HasProperty(&it);
74933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
74943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
74953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
7496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybe<bool> JSReceiver::HasOwnProperty(Handle<JSReceiver> object,
7497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                       Handle<Name> name) {
7498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (object->IsJSObject()) {  // Shortcut
7499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    LookupIterator it = LookupIterator::PropertyOrElement(
7500bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch        object->GetIsolate(), object, name, object, LookupIterator::OWN);
7501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return HasProperty(&it);
75023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
7503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Maybe<PropertyAttributes> attributes =
7505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSReceiver::GetOwnPropertyAttributes(object, name);
7506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MAYBE_RETURN(attributes, Nothing<bool>());
7507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Just(attributes.FromJust() != ABSENT);
7508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7510bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochMaybe<bool> JSReceiver::HasOwnProperty(Handle<JSReceiver> object,
7511bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                                       uint32_t index) {
7512bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (object->IsJSObject()) {  // Shortcut
7513bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LookupIterator it(object->GetIsolate(), object, index, object,
7514bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                      LookupIterator::OWN);
7515bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    return HasProperty(&it);
7516bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  }
7517bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
7518bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  Maybe<PropertyAttributes> attributes =
7519bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      JSReceiver::GetOwnPropertyAttributes(object, index);
7520bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  MAYBE_RETURN(attributes, Nothing<bool>());
7521bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return Just(attributes.FromJust() != ABSENT);
7522bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
7523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybe<PropertyAttributes> JSReceiver::GetPropertyAttributes(
7525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSReceiver> object, Handle<Name> name) {
75263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it = LookupIterator::PropertyOrElement(name->GetIsolate(),
75273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                        object, name, object);
7528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return GetPropertyAttributes(&it);
7529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes(
7533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSReceiver> object, Handle<Name> name) {
7534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it = LookupIterator::PropertyOrElement(
7535bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      name->GetIsolate(), object, name, object, LookupIterator::OWN);
7536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return GetPropertyAttributes(&it);
7537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7539bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochMaybe<PropertyAttributes> JSReceiver::GetOwnPropertyAttributes(
7540bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    Handle<JSReceiver> object, uint32_t index) {
7541bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LookupIterator it(object->GetIsolate(), object, index, object,
7542bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch                    LookupIterator::OWN);
7543bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return GetPropertyAttributes(&it);
7544bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}
7545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybe<bool> JSReceiver::HasElement(Handle<JSReceiver> object, uint32_t index) {
75473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it(object->GetIsolate(), object, index, object);
7548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return HasProperty(&it);
7549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybe<PropertyAttributes> JSReceiver::GetElementAttributes(
7553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSReceiver> object, uint32_t index) {
7554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate = object->GetIsolate();
75553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it(isolate, object, index, object);
7556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return GetPropertyAttributes(&it);
7557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybe<PropertyAttributes> JSReceiver::GetOwnElementAttributes(
7561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<JSReceiver> object, uint32_t index) {
7562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Isolate* isolate = object->GetIsolate();
7563bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LookupIterator it(isolate, object, index, object, LookupIterator::OWN);
7564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return GetPropertyAttributes(&it);
7565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool JSGlobalObject::IsDetached() {
7569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return JSGlobalProxy::cast(global_proxy())->IsDetachedFrom(this);
7570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSGlobalProxy::IsDetachedFrom(JSGlobalObject* global) const {
7574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PrototypeIterator iter(this->GetIsolate(),
7575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                               const_cast<JSGlobalProxy*>(this));
7576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return iter.GetCurrent() != global;
7577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7579c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochinline int JSGlobalProxy::SizeWithInternalFields(int internal_field_count) {
7580c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_GE(internal_field_count, 0);
7581c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return kSize + internal_field_count * kPointerSize;
7582c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
7583c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
758413e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochSmi* JSReceiver::GetOrCreateIdentityHash(Isolate* isolate,
758513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                         Handle<JSReceiver> object) {
758613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return object->IsJSProxy() ? JSProxy::GetOrCreateIdentityHash(
758713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                   isolate, Handle<JSProxy>::cast(object))
758813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                             : JSObject::GetOrCreateIdentityHash(
758913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                   isolate, Handle<JSObject>::cast(object));
7590d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block}
7591d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block
759213e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochObject* JSReceiver::GetIdentityHash(Isolate* isolate,
759313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                    Handle<JSReceiver> receiver) {
759413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return receiver->IsJSProxy()
759513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch             ? JSProxy::GetIdentityHash(Handle<JSProxy>::cast(receiver))
759613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch             : JSObject::GetIdentityHash(isolate,
759713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                         Handle<JSObject>::cast(receiver));
7598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_read() {
7602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BooleanBit::get(flag(), kAllCanReadBit);
7603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_read(bool value) {
7607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(BooleanBit::set(flag(), kAllCanReadBit, value));
7608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_write() {
7612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return BooleanBit::get(flag(), kAllCanWriteBit);
7613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_write(bool value) {
7617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value));
7618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AccessorInfo::is_special_data_property() {
7622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return BooleanBit::get(flag(), kSpecialDataProperty);
7623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AccessorInfo::set_is_special_data_property(bool value) {
7627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_flag(BooleanBit::set(flag(), kSpecialDataProperty, value));
7628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7630c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochbool AccessorInfo::replace_on_access() {
7631c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return BooleanBit::get(flag(), kReplaceOnAccess);
7632c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
7633c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
7634c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid AccessorInfo::set_replace_on_access(bool value) {
7635c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  set_flag(BooleanBit::set(flag(), kReplaceOnAccess, value));
7636c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
7637c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
76383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool AccessorInfo::is_sloppy() { return BooleanBit::get(flag(), kIsSloppy); }
76393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
76403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid AccessorInfo::set_is_sloppy(bool value) {
76413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  set_flag(BooleanBit::set(flag(), kIsSloppy, value));
76423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
7643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochPropertyAttributes AccessorInfo::property_attributes() {
7645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return AttributesField::decode(static_cast<uint32_t>(flag()));
7646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid AccessorInfo::set_property_attributes(PropertyAttributes attributes) {
7650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  set_flag(AttributesField::update(flag(), attributes));
7651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
765313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochbool FunctionTemplateInfo::IsTemplateFor(JSObject* object) {
765413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return IsTemplateFor(object->map());
765513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}
7656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool AccessorInfo::IsCompatibleReceiver(Object* receiver) {
7658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!HasExpectedReceiverType()) return true;
7659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (!receiver->IsJSObject()) return false;
7660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return FunctionTemplateInfo::cast(expected_receiver_type())
7661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      ->IsTemplateFor(JSObject::cast(receiver)->map());
7662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AccessorInfo::HasExpectedReceiverType() {
7666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return expected_receiver_type()->IsFunctionTemplateInfo();
7667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* AccessorPair::get(AccessorComponent component) {
7671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return component == ACCESSOR_GETTER ? getter() : setter();
7672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AccessorPair::set(AccessorComponent component, Object* value) {
7676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (component == ACCESSOR_GETTER) {
7677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    set_getter(value);
7678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else {
7679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    set_setter(value);
7680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
7681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid AccessorPair::SetComponents(Object* getter, Object* setter) {
768513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate = GetIsolate();
768613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (!getter->IsNull(isolate)) set_getter(getter);
768713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (!setter->IsNull(isolate)) set_setter(setter);
7688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AccessorPair::Equals(AccessorPair* pair) {
7692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return (this == pair) || pair->Equals(getter(), setter());
7693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AccessorPair::Equals(Object* getter_value, Object* setter_value) {
7697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return (getter() == getter_value) && (setter() == setter_value);
7698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AccessorPair::ContainsAccessor() {
7702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return IsJSAccessor(getter()) || IsJSAccessor(setter());
7703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool AccessorPair::IsJSAccessor(Object* obj) {
770713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return obj->IsCallable() || obj->IsUndefined(GetIsolate());
7708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
77108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename Derived, typename Shape, typename Key>
7712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Dictionary<Derived, Shape, Key>::SetEntry(int entry,
7713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               Handle<Object> key,
7714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               Handle<Object> value) {
7715c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  this->SetEntry(entry, key, value, PropertyDetails(Smi::kZero));
77168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
77178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
77188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
7719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename Derived, typename Shape, typename Key>
7720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Dictionary<Derived, Shape, Key>::SetEntry(int entry,
7721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               Handle<Object> key,
7722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               Handle<Object> value,
7723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                               PropertyDetails details) {
7724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Shape::SetEntry(static_cast<Derived*>(this), entry, key, value, details);
7725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Key>
7729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Dictionary>
7730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid BaseDictionaryShape<Key>::SetEntry(Dictionary* dict, int entry,
7731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        Handle<Object> key,
7732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        Handle<Object> value,
7733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        PropertyDetails details) {
7734f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  STATIC_ASSERT(Dictionary::kEntrySize == 2 || Dictionary::kEntrySize == 3);
7735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!key->IsName() || details.dictionary_index() > 0);
7736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int index = dict->EntryToIndex(entry);
7737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DisallowHeapAllocation no_gc;
7738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WriteBarrierMode mode = dict->GetWriteBarrierMode(no_gc);
773913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  dict->set(index + Dictionary::kEntryKeyIndex, *key, mode);
774013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  dict->set(index + Dictionary::kEntryValueIndex, *value, mode);
7741f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (Dictionary::kEntrySize == 3) {
7742f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    dict->set(index + Dictionary::kEntryDetailsIndex, details.AsSmi());
7743f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
7744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Dictionary>
7748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid GlobalDictionaryShape::SetEntry(Dictionary* dict, int entry,
7749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Handle<Object> key, Handle<Object> value,
7750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     PropertyDetails details) {
7751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  STATIC_ASSERT(Dictionary::kEntrySize == 2);
7752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!key->IsName() || details.dictionary_index() > 0);
7753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(value->IsPropertyCell());
7754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int index = dict->EntryToIndex(entry);
7755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DisallowHeapAllocation no_gc;
7756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  WriteBarrierMode mode = dict->GetWriteBarrierMode(no_gc);
775713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  dict->set(index + Dictionary::kEntryKeyIndex, *key, mode);
775813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  dict->set(index + Dictionary::kEntryValueIndex, *value, mode);
7759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyCell::cast(*value)->set_property_details(details);
7760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
776344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
7764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(other->IsNumber());
776544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return key == static_cast<uint32_t>(other->Number());
776644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
776744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
776844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7769c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) {
7770c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return ComputeIntegerHash(key, 0);
777144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
777244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
777344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7774c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key,
7775c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                                                      Object* other) {
7776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(other->IsNumber());
7777c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0);
7778c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
7779c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch
7780f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochMap* UnseededNumberDictionaryShape::GetMap(Isolate* isolate) {
7781c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return isolate->heap()->unseeded_number_dictionary_map();
7782f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
7783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7784c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) {
7785c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return ComputeIntegerHash(key, seed);
778644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
778744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7789c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key,
7790c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                                                          uint32_t seed,
7791c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch                                                          Object* other) {
7792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(other->IsNumber());
7793c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch  return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed);
7794c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}
779544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> NumberDictionaryShape::AsHandle(Isolate* isolate, uint32_t key) {
7798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return isolate->factory()->NewNumberFromUint(key);
779944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
780044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
780144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool NameDictionaryShape::IsMatch(Handle<Name> key, Object* other) {
780344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // We know that all entries in a hash table had their hash keys created.
780444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Use that knowledge to have fast failure.
7805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (key->Hash() != Name::cast(other)->Hash()) return false;
7806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return key->Equals(Name::cast(other));
780744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
780844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
780944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t NameDictionaryShape::Hash(Handle<Name> key) {
781144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return key->Hash();
781244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
781344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
781444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t NameDictionaryShape::HashForObject(Handle<Name> key, Object* other) {
7816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Name::cast(other)->Hash();
7817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> NameDictionaryShape::AsHandle(Isolate* isolate,
7821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             Handle<Name> key) {
7822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(key->IsUniqueName());
7823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return key;
7824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<FixedArray> NameDictionary::DoGenerateNewEnumerationIndices(
7828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<NameDictionary> dictionary) {
7829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return DerivedDictionary::GenerateNewEnumerationIndices(dictionary);
7830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Dictionary>
7834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochPropertyDetails GlobalDictionaryShape::DetailsAt(Dictionary* dict, int entry) {
7835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(entry >= 0);  // Not found is -1, which is not caught by get().
7836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* raw_value = dict->ValueAt(entry);
7837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(raw_value->IsPropertyCell());
7838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyCell* cell = PropertyCell::cast(raw_value);
7839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return cell->property_details();
7840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Dictionary>
7844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid GlobalDictionaryShape::DetailsAtPut(Dictionary* dict, int entry,
7845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                         PropertyDetails value) {
7846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(entry >= 0);  // Not found is -1, which is not caught by get().
7847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* raw_value = dict->ValueAt(entry);
7848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(raw_value->IsPropertyCell());
7849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyCell* cell = PropertyCell::cast(raw_value);
7850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  cell->set_property_details(value);
7851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Dictionary>
7855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool GlobalDictionaryShape::IsDeleted(Dictionary* dict, int entry) {
7856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(dict->ValueAt(entry)->IsPropertyCell());
785713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Isolate* isolate = dict->GetIsolate();
785813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return PropertyCell::cast(dict->ValueAt(entry))->value()->IsTheHole(isolate);
7859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool ObjectHashTableShape::IsMatch(Handle<Object> key, Object* other) {
7863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return key->SameValue(other);
7864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t ObjectHashTableShape::Hash(Handle<Object> key) {
7868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Smi::cast(key->GetHash())->value();
7869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t ObjectHashTableShape::HashForObject(Handle<Object> key,
7873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                             Object* other) {
7874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Smi::cast(other->GetHash())->value();
787544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
787644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
787744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> ObjectHashTableShape::AsHandle(Isolate* isolate,
7879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                              Handle<Object> key) {
788044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return key;
788144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
788244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
788344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
7884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<ObjectHashTable> ObjectHashTable::Shrink(
7885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Handle<ObjectHashTable> table, Handle<Object> key) {
7886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return DerivedHashTable::Shrink(table, key);
7887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* OrderedHashMap::ValueAt(int entry) {
7891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return get(EntryToIndex(entry) + kValueOffset);
7892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
78953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize>
7896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool WeakHashTableShape<entrysize>::IsMatch(Handle<Object> key, Object* other) {
7897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (other->IsWeakCell()) other = WeakCell::cast(other)->value();
7898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return key->IsWeakCell() ? WeakCell::cast(*key)->value() == other
7899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                           : *key == other;
790069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
790169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
790269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
79033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize>
7904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t WeakHashTableShape<entrysize>::Hash(Handle<Object> key) {
7905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  intptr_t hash =
7906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      key->IsWeakCell()
7907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          ? reinterpret_cast<intptr_t>(WeakCell::cast(*key)->value())
7908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          : reinterpret_cast<intptr_t>(*key);
7909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return (uint32_t)(hash & 0xFFFFFFFF);
791069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
791169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
791269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
79133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize>
7914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochuint32_t WeakHashTableShape<entrysize>::HashForObject(Handle<Object> key,
7915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                      Object* other) {
7916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (other->IsWeakCell()) other = WeakCell::cast(other)->value();
7917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  intptr_t hash = reinterpret_cast<intptr_t>(other);
7918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return (uint32_t)(hash & 0xFFFFFFFF);
791969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
792069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
792169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
79223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize>
7923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> WeakHashTableShape<entrysize>::AsHandle(Isolate* isolate,
7924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                                       Handle<Object> key) {
792569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return key;
792669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
792769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
792869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
7929c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(ModuleInfoEntry, export_name, Object, kExportNameOffset)
7930c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(ModuleInfoEntry, local_name, Object, kLocalNameOffset)
7931c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(ModuleInfoEntry, import_name, Object, kImportNameOffset)
7932c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochSMI_ACCESSORS(ModuleInfoEntry, module_request, kModuleRequestOffset)
7933c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochSMI_ACCESSORS(ModuleInfoEntry, cell_index, kCellIndexOffset)
7934c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochSMI_ACCESSORS(ModuleInfoEntry, beg_pos, kBegPosOffset)
7935c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochSMI_ACCESSORS(ModuleInfoEntry, end_pos, kEndPosOffset)
7936f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
793744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Map::ClearCodeCache(Heap* heap) {
7938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // No write barrier is needed since empty_fixed_array is not in new space.
7939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Please note this function is used during marking:
7940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  //  - MarkCompactCollector::MarkUnmarkedObject
79413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  //  - IncrementalMarking::Step
7942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kCodeCacheOffset, heap->empty_fixed_array());
7943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint Map::SlackForArraySize(int old_size, int size_limit) {
7947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const int max_slack = size_limit - old_size;
7948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK_LE(0, max_slack);
7949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (old_size < 4) {
7950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK_LE(1, max_slack);
7951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return 1;
7952d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  }
7953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Min(max_slack, old_size / 4);
7954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
7955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
79574515c472dc3e5ed2448a564600976759e569a0a8Leon Clarkevoid JSArray::set_length(Smi* length) {
79583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Don't need a write barrier for a Smi.
79594515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke  set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
79604515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke}
79614515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke
79624515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke
7963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSArray::SetLengthWouldNormalize(Heap* heap, uint32_t new_length) {
796462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // This constant is somewhat arbitrary. Any large enough value would work.
796562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const uint32_t kMaxFastArrayLength = 32 * 1024 * 1024;
7966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If the new array won't fit in a some non-trivial fraction of the max old
7967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // space size, then force it to go dictionary mode.
796862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t heap_based_upper_bound =
7969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      static_cast<uint32_t>((heap->MaxOldGenerationSize() / kDoubleSize) / 4);
797062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return new_length >= Min(kMaxFastArrayLength, heap_based_upper_bound);
7971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
7972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool JSArray::AllowsSetLength() {
79753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray();
7976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(result == !HasFixedTypedArrayElements());
79773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return result;
79783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
79793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
79803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid JSArray::SetContent(Handle<JSArray> array,
7982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                         Handle<FixedArrayBase> storage) {
7983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EnsureCanContainElements(array, storage, storage->length(),
7984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                           ALLOW_COPIED_DOUBLE_ELEMENTS);
7985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK((storage->map() == array->GetHeap()->fixed_double_array_map() &&
7987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          IsFastDoubleElementsKind(array->GetElementsKind())) ||
7988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch         ((storage->map() != array->GetHeap()->fixed_double_array_map()) &&
7989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          (IsFastObjectElementsKind(array->GetElementsKind()) ||
7990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           (IsFastSmiElementsKind(array->GetElementsKind()) &&
7991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch            Handle<FixedArray>::cast(storage)->ContainsOnlySmisOrHoles()))));
7992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_elements(*storage);
7993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  array->set_length(Smi::FromInt(storage->length()));
7994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
7995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
79973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool JSArray::HasArrayPrototype(Isolate* isolate) {
79983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return map()->prototype() == *isolate->initial_array_prototype();
79993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
80003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
80013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
8002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeFeedbackInfo::ic_total_count() {
8003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int current = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
8004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ICTotalCountField::decode(current);
8005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
8006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeFeedbackInfo::set_ic_total_count(int count) {
8009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
8010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = ICTotalCountField::update(value,
8011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                    ICTotalCountField::decode(count));
8012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kStorage1Offset, Smi::FromInt(value));
801344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
801444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
801544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeFeedbackInfo::ic_with_type_info_count() {
8017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int current = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
8018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return ICsWithTypeInfoCountField::decode(current);
80193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
80203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeFeedbackInfo::change_ic_with_type_info_count(int delta) {
8023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (delta == 0) return;
8024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
8025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int new_count = ICsWithTypeInfoCountField::decode(value) + delta;
8026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // We can get negative count here when the type-feedback info is
8027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // shared between two code objects. The can only happen when
8028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the debugger made a shallow copy of code object (see Heap::CopyCode).
8029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Since we do not optimize when the debugger is active, we can skip
8030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // this counter update.
8031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (new_count >= 0) {
8032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new_count &= ICsWithTypeInfoCountField::kMask;
8033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    value = ICsWithTypeInfoCountField::update(value, new_count);
8034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    WRITE_FIELD(this, kStorage2Offset, Smi::FromInt(value));
8035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
80363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
80373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeFeedbackInfo::ic_generic_count() {
8040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return Smi::cast(READ_FIELD(this, kStorage3Offset))->value();
80413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
80423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeFeedbackInfo::change_ic_generic_count(int delta) {
8045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (delta == 0) return;
8046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int new_count = ic_generic_count() + delta;
8047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (new_count >= 0) {
8048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    new_count &= ~Smi::kMinValue;
8049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    WRITE_FIELD(this, kStorage3Offset, Smi::FromInt(new_count));
8050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
80513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
80523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeFeedbackInfo::initialize_storage() {
8055c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  WRITE_FIELD(this, kStorage1Offset, Smi::kZero);
8056c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  WRITE_FIELD(this, kStorage2Offset, Smi::kZero);
8057c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  WRITE_FIELD(this, kStorage3Offset, Smi::kZero);
80583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
80593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeFeedbackInfo::change_own_type_change_checksum() {
8062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
8063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int checksum = OwnTypeChangeChecksum::decode(value);
8064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  checksum = (checksum + 1) % (1 << kTypeChangeChecksumBits);
8065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = OwnTypeChangeChecksum::update(value, checksum);
8066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Ensure packed bit field is in Smi range.
8067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value > Smi::kMaxValue) value |= Smi::kMinValue;
8068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value < Smi::kMinValue) value &= ~Smi::kMinValue;
8069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kStorage1Offset, Smi::FromInt(value));
80703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
80713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid TypeFeedbackInfo::set_inlined_type_change_checksum(int checksum) {
8074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
8075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int mask = (1 << kTypeChangeChecksumBits) - 1;
8076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  value = InlinedTypeChangeChecksum::update(value, checksum & mask);
8077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Ensure packed bit field is in Smi range.
8078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value > Smi::kMaxValue) value |= Smi::kMinValue;
8079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if (value < Smi::kMinValue) value &= ~Smi::kMinValue;
8080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  WRITE_FIELD(this, kStorage2Offset, Smi::FromInt(value));
80813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
80823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint TypeFeedbackInfo::own_type_change_checksum() {
8085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
8086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return OwnTypeChangeChecksum::decode(value);
80873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
80883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool TypeFeedbackInfo::matches_inlined_type_change_checksum(int checksum) {
8091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
8092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int mask = (1 << kTypeChangeChecksumBits) - 1;
8093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return InlinedTypeChangeChecksum::decode(value) == (checksum & mask);
8094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
80953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80973ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot)
80983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
80993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
810044f0eee88ff00398ff7f715fab053374d808c90dSteve BlockRelocatable::Relocatable(Isolate* isolate) {
810144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  isolate_ = isolate;
810244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  prev_ = isolate->relocatable_top();
810344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  isolate->set_relocatable_top(this);
810444f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
810544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
810644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
810744f0eee88ff00398ff7f715fab053374d808c90dSteve BlockRelocatable::~Relocatable() {
8108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK_EQ(isolate_->relocatable_top(), this);
810944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  isolate_->set_relocatable_top(prev_);
8110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
8111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate<class Derived, class TableType>
8114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* OrderedHashTableIterator<Derived, TableType>::CurrentKey() {
8115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  TableType* table(TableType::cast(this->table()));
8116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int index = Smi::cast(this->index())->value();
8117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* key = table->KeyAt(index);
811813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(!key->IsTheHole(table->GetIsolate()));
8119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return key;
8120756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
8121756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8122756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSSetIterator::PopulateValueArray(FixedArray* array) {
8124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array->set(0, CurrentKey());
8125756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
8126756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8127756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid JSMapIterator::PopulateValueArray(FixedArray* array) {
8129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array->set(0, CurrentKey());
8130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  array->set(1, CurrentValue());
8131756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
8132756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8133756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* JSMapIterator::CurrentValue() {
8135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OrderedHashMap* table(OrderedHashMap::cast(this->table()));
8136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int index = Smi::cast(this->index())->value();
8137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* value = table->ValueAt(index);
813813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK(!value->IsTheHole(table->GetIsolate()));
8139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return value;
8140756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
8141756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8142756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochString::SubStringRange::SubStringRange(String* string, int first, int length)
8144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    : string_(string),
8145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      first_(first),
8146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      length_(length == -1 ? string->length() : length) {}
8147756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8148756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass String::SubStringRange::iterator final {
8150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
8151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  typedef std::forward_iterator_tag iterator_category;
8152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  typedef int difference_type;
8153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  typedef uc16 value_type;
8154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  typedef uc16* pointer;
8155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  typedef uc16& reference;
8156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
8157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  iterator(const iterator& other)
8158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : content_(other.content_), offset_(other.offset_) {}
8159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
8160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  uc16 operator*() { return content_.Get(offset_); }
8161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool operator==(const iterator& other) const {
8162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return content_.UsesSameString(other.content_) && offset_ == other.offset_;
8163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
8164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool operator!=(const iterator& other) const {
8165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return !content_.UsesSameString(other.content_) || offset_ != other.offset_;
8166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
8167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  iterator& operator++() {
8168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    ++offset_;
8169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return *this;
8170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
8171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  iterator operator++(int);
8172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
8174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  friend class String;
8175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  iterator(String* from, int offset)
8176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : content_(from->GetFlatContent()), offset_(offset) {}
8177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  String::FlatContent content_;
8178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int offset_;
8179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
8180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochString::SubStringRange::iterator String::SubStringRange::begin() {
8183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return String::SubStringRange::iterator(string_, first_);
8184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
8185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochString::SubStringRange::iterator String::SubStringRange::end() {
8188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return String::SubStringRange::iterator(string_, first_ + length_);
8189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
8190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Predictably converts HeapObject* or Address to uint32 by calculating
8193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// offset of the address in respective MemoryChunk.
8194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic inline uint32_t ObjectAddressForHashing(void* object) {
8195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  uint32_t value = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(object));
8196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return value & MemoryChunk::kAlignmentMask;
8197756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick}
8198756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
81993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic inline Handle<Object> MakeEntryPair(Isolate* isolate, uint32_t index,
82003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                           Handle<Object> value) {
82013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Object> key = isolate->factory()->Uint32ToString(index);
82023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<FixedArray> entry_storage =
82033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      isolate->factory()->NewUninitializedFixedArray(2);
82043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  {
82053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    entry_storage->set(0, *key, SKIP_WRITE_BARRIER);
82063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    entry_storage->set(1, *value, SKIP_WRITE_BARRIER);
82073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
82083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return isolate->factory()->NewJSArrayWithElements(entry_storage,
82093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                    FAST_ELEMENTS, 2);
82103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
82113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
82123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochstatic inline Handle<Object> MakeEntryPair(Isolate* isolate, Handle<Name> key,
82133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                           Handle<Object> value) {
82143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<FixedArray> entry_storage =
82153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      isolate->factory()->NewUninitializedFixedArray(2);
82163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  {
82173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    entry_storage->set(0, *key, SKIP_WRITE_BARRIER);
82183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    entry_storage->set(1, *value, SKIP_WRITE_BARRIER);
82193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
82203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return isolate->factory()->NewJSArrayWithElements(entry_storage,
82213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                    FAST_ELEMENTS, 2);
82223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
8223756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick
8224f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(JSIteratorResult, value, Object, kValueOffset)
8225f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(JSIteratorResult, done, Object, kDoneOffset)
8226f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
8227c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(JSArrayIterator, object, Object, kIteratedObjectOffset)
8228c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(JSArrayIterator, index, Object, kNextIndexOffset)
8229c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochACCESSORS(JSArrayIterator, object_map, Object, kIteratedObjectMapOffset)
8230c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
823162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochACCESSORS(JSAsyncFromSyncIterator, sync_iterator, JSReceiver,
823262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          kSyncIteratorOffset)
823362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
8234f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochACCESSORS(JSStringIterator, string, String, kStringOffset)
8235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSMI_ACCESSORS(JSStringIterator, index, kNextIndexOffset)
8236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
8237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef INT_ACCESSORS
823885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch#undef ACCESSORS
823962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef ACCESSORS_CHECKED
824062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef ACCESSORS_CHECKED2
82413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef SMI_ACCESSORS
8242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef SYNCHRONIZED_SMI_ACCESSORS
8243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NOBARRIER_SMI_ACCESSORS
82443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef BOOL_GETTER
82453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef BOOL_ACCESSORS
8246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef FIELD_ADDR
8247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIELD_ADDR_CONST
8248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_FIELD
8249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NOBARRIER_READ_FIELD
8250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_FIELD
8251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NOBARRIER_WRITE_FIELD
8252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BARRIER
8253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CONDITIONAL_WRITE_BARRIER
8254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_DOUBLE_FIELD
8255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_DOUBLE_FIELD
8256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_INT_FIELD
8257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_INT_FIELD
82583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef READ_INTPTR_FIELD
82593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef WRITE_INTPTR_FIELD
8260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef READ_UINT8_FIELD
8261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef WRITE_UINT8_FIELD
8262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef READ_INT8_FIELD
8263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef WRITE_INT8_FIELD
8264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef READ_UINT16_FIELD
8265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef WRITE_UINT16_FIELD
8266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef READ_INT16_FIELD
8267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef WRITE_INT16_FIELD
82683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef READ_UINT32_FIELD
82693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef WRITE_UINT32_FIELD
8270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef READ_INT32_FIELD
8271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef WRITE_INT32_FIELD
8272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef READ_FLOAT_FIELD
8273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef WRITE_FLOAT_FIELD
8274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef READ_UINT64_FIELD
8275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef WRITE_UINT64_FIELD
8276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef READ_INT64_FIELD
8277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef WRITE_INT64_FIELD
8278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_BYTE_FIELD
8279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BYTE_FIELD
8280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NOBARRIER_READ_BYTE_FIELD
8281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NOBARRIER_WRITE_BYTE_FIELD
8282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
8284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
8285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_OBJECTS_INL_H_
8287