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