1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 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#ifndef V8_OBJECTS_H_ 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_OBJECTS_H_ 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <iosfwd> 9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <memory> 10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/assert-scope.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/bailout-reason.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h" 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/flags.h" 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/builtins/builtins.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/checks.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/elements-kind.h" 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/field-index.h" 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/flags.h" 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/list.h" 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/messages.h" 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/property-details.h" 23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/unicode-decoder.h" 24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/unicode.h" 25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h" 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#if V8_TARGET_ARCH_ARM 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm/constants-arm.h" // NOLINT 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_ARM64 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/arm64/constants-arm64.h" // NOLINT 313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#elif V8_TARGET_ARCH_MIPS 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/mips/constants-mips.h" // NOLINT 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_TARGET_ARCH_MIPS64 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/mips64/constants-mips64.h" // NOLINT 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#elif V8_TARGET_ARCH_PPC 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ppc/constants-ppc.h" // NOLINT 373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#elif V8_TARGET_ARCH_S390 383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/s390/constants-s390.h" // NOLINT 393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#endif 403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 4350ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen// Most object types in the V8 JavaScript are described in this file. 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Inheritance hierarchy: 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Object 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Smi (immediate small integer) 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - HeapObject (superclass for everything allocated in the heap) 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSReceiver (suitable for property access) 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSObject 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSArray 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSArrayBuffer 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSArrayBufferView 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSTypedArray 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSDataView 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - JSBoundFunction 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSCollection 583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// - JSSet 593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// - JSMap 60f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// - JSStringIterator 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSSetIterator 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSMapIterator 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSWeakCollection 6469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - JSWeakMap 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSWeakSet 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSRegExp 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSFunction 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSGeneratorObject 69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - JSGlobalObject 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSGlobalProxy 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSValue 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSDate 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSMessageObject 74c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - JSModuleNamespace 75c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - JSFixedArrayIterator 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSProxy 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - FixedArrayBase 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ByteArray 79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - BytecodeArray 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - FixedArray 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - DescriptorArray 82f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// - FrameArray 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - LiteralsArray 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - HashTable 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Dictionary 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - StringTable 873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// - StringSet 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - CompilationCacheTable 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - CodeCacheHashTable 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - MapCache 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - OrderedHashTable 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - OrderedHashSet 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - OrderedHashMap 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Context 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - TypeFeedbackMetadata 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - TypeFeedbackVector 97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// - TemplateList 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - TransitionArray 99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// - ScopeInfo 100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// - ModuleInfo 101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// - ScriptContextTable 102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// - WeakFixedArray 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - FixedDoubleArray 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Name 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - String 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - SeqString 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SeqOneByteString 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - SeqTwoByteString 10969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - SlicedString 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - ConsString 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - ExternalString 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ExternalOneByteString 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - ExternalTwoByteString 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - InternalizedString 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SeqInternalizedString 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SeqOneByteInternalizedString 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SeqTwoByteInternalizedString 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ConsInternalizedString 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ExternalInternalizedString 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ExternalOneByteInternalizedString 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ExternalTwoByteInternalizedString 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Symbol 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - HeapNumber 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Simd128Value 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Float32x4 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Int32x4 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Uint32x4 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Bool32x4 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Int16x8 130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Uint16x8 131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Bool16x8 132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Int8x16 133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Uint8x16 134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - Bool8x16 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Cell 136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - PropertyCell 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Code 138109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// - AbstractCode, a wrapper around Code or BytecodeArray 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Map 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Oddball 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Foreign 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SharedFunctionInfo 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Struct 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Box 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - AccessorInfo 146c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - PromiseResolveThenableJobInfo 147c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - PromiseReactionJobInfo 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - AccessorPair 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - AccessCheckInfo 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - InterceptorInfo 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - CallHandlerInfo 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - TemplateInfo 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - FunctionTemplateInfo 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ObjectTemplateInfo 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Script 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - DebugInfo 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - BreakPointInfo 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - CodeCache 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - PrototypeInfo 160f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// - Module 161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - ModuleInfoEntry 162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// - WeakCell 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Formats of Object*: 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Smi: [31 bit signed int] 0 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HeapObject: [32 bit direct pointer] (4 byte aligned) | 01 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 171c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstruct InliningPosition; 172c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum KeyedAccessStoreMode { 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STANDARD_STORE, 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STORE_TRANSITION_TO_OBJECT, 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STORE_TRANSITION_TO_DOUBLE, 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STORE_AND_GROW_NO_TRANSITION, 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STORE_AND_GROW_TRANSITION_TO_OBJECT, 179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STORE_AND_GROW_TRANSITION_TO_DOUBLE, 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS, 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STORE_NO_TRANSITION_HANDLE_COW 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 184589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum TypeofMode : int { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF }; 186589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 187589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum MutableMode { 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUTABLE, 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IMMUTABLE 191589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}; 192589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 19385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum ExternalArrayType { 195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalInt8Array = 1, 196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalUint8Array, 197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalInt16Array, 198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalUint16Array, 199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalInt32Array, 200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalUint32Array, 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalFloat32Array, 202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalFloat64Array, 203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kExternalUint8ClampedArray, 204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline bool IsTransitionStoreMode(KeyedAccessStoreMode store_mode) { 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return store_mode == STORE_TRANSITION_TO_OBJECT || 209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store_mode == STORE_TRANSITION_TO_DOUBLE || 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store_mode == STORE_AND_GROW_TRANSITION_TO_OBJECT || 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store_mode == STORE_AND_GROW_TRANSITION_TO_DOUBLE; 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline KeyedAccessStoreMode GetNonTransitioningStoreMode( 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch KeyedAccessStoreMode store_mode) { 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (store_mode >= STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return store_mode; 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (store_mode >= STORE_AND_GROW_NO_TRANSITION) { 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return STORE_AND_GROW_NO_TRANSITION; 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return STANDARD_STORE; 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 22585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 22685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline bool IsGrowStoreMode(KeyedAccessStoreMode store_mode) { 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return store_mode >= STORE_AND_GROW_NO_TRANSITION && 229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store_mode <= STORE_AND_GROW_TRANSITION_TO_DOUBLE; 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierenum IcCheckType { ELEMENT, PROPERTY }; 234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// SKIP_WRITE_BARRIER skips the write barrier. 237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// UPDATE_WEAK_WRITE_BARRIER skips the marking part of the write barrier and 238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// only performs the generational part. 239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// UPDATE_WRITE_BARRIER is doing the full barrier, marking and generational. 240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum WriteBarrierMode { 241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SKIP_WRITE_BARRIER, 242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UPDATE_WEAK_WRITE_BARRIER, 243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UPDATE_WRITE_BARRIER 244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether a value can be loaded as a constant. 248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum StoreMode { ALLOW_IN_DESCRIPTOR, FORCE_FIELD }; 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// PropertyNormalizationMode is used to specify whether to keep 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// inobject properties when normalizing properties of a JSObject. 253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum PropertyNormalizationMode { 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CLEAR_INOBJECT_PROPERTIES, 255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block KEEP_INOBJECT_PROPERTIES 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates how aggressively the prototype should be optimized. FAST_PROTOTYPE 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// will give the fastest result by tailoring the map to the prototype, but that 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// will cause polymorphism with other objects. REGULAR_PROTOTYPE is to be used 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (at least for now) when dynamically modifying the prototype chain of an 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// object using __proto__ or Object.setPrototypeOf. 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum PrototypeOptimizationMode { REGULAR_PROTOTYPE, FAST_PROTOTYPE }; 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether transitions can be added to a source map or not. 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum TransitionFlag { 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INSERT_TRANSITION, 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OMIT_TRANSITION 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether the transition is simple: the target map of the transition 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// either extends the current map with a new property, or it modifies the 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// property that was added last to the current map. 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SimpleTransitionFlag { 278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SIMPLE_PROPERTY_TRANSITION, 279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PROPERTY_TRANSITION, 280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SPECIAL_TRANSITION 2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether we are only interested in the descriptors of a particular 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// map, or in all descriptors in the descriptor array. 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum DescriptorFlag { 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALL_DESCRIPTORS, 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OWN_DESCRIPTORS 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The GC maintains a bit of information, the MarkingParity, which toggles 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// from odd to even and back every time marking is completed. Incremental 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// marking can visit an object twice during a marking phase, so algorithms that 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// that piggy-back on marking can use the parity to ensure that they only 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// perform an operation on an object once per marking phase: they record the 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// MarkingParity when they visit an object, and only re-visit the object when it 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// is marked again and the MarkingParity changes. 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum MarkingParity { 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NO_MARKING_PARITY, 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ODD_MARKING_PARITY, 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EVEN_MARKING_PARITY 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ICs store extra state in a Code object. The default extra state is 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// kNoExtraICState. 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef int ExtraICState; 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const ExtraICState kNoExtraICState = 0; 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 309791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block// Instance size sentinel for objects of variable size. 3103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kVariableSizeSentinel = 0; 311791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// We may store the unsigned bit field as signed Smi value and do not 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// use the sign bit. 314bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochconst int kStubMajorKeyBits = 8; 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1; 316791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All Maps have a field instance_type containing a InstanceType. 318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// It describes the type of the instances. 319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// As an example, a JavaScript object is a heap object and its map 321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// instance_type is JS_OBJECT_TYPE. 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The names of the string instance types are intended to systematically 324e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// mirror their encoding in the instance_type field of the map. The default 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// encoding is considered TWO_BYTE. It is not mentioned in the name. ONE_BYTE 326e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// encoding is mentioned explicitly in the name. Likewise, the default 327e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// representation is considered sequential. It is not mentioned in the 3283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// name. The other representations (e.g. CONS, EXTERNAL) are explicitly 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// mentioned. Finally, the string is either a STRING_TYPE (if it is a normal 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// string) or a INTERNALIZED_STRING_TYPE (if it is a internalized string). 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// NOTE: The following things are some that depend on the string types having 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// instance_types that are less than those of all other types: 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HeapObject::Size, HeapObject::IterateBody, the typeof operator, and 335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Object::IsString. 336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// NOTE: Everything following JS_VALUE_TYPE is considered a 338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// JSObject for GC purposes. The first four entries here have typeof 339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 'object', whereas JS_FUNCTION_TYPE has typeof 'function'. 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define INSTANCE_TYPE_LIST(V) \ 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(STRING_TYPE) \ 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ONE_BYTE_STRING_TYPE) \ 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CONS_STRING_TYPE) \ 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CONS_ONE_BYTE_STRING_TYPE) \ 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SLICED_STRING_TYPE) \ 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SLICED_ONE_BYTE_STRING_TYPE) \ 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_STRING_TYPE) \ 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_ONE_BYTE_STRING_TYPE) \ 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_STRING_TYPE) \ 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE) \ 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(INTERNALIZED_STRING_TYPE) \ 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_INTERNALIZED_STRING_TYPE) \ 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE) \ 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SYMBOL_TYPE) \ 364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(SIMD128_VALUE_TYPE) \ 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(MAP_TYPE) \ 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CODE_TYPE) \ 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ODDBALL_TYPE) \ 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CELL_TYPE) \ 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(PROPERTY_CELL_TYPE) \ 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HEAP_NUMBER_TYPE) \ 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(MUTABLE_HEAP_NUMBER_TYPE) \ 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FOREIGN_TYPE) \ 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BYTE_ARRAY_TYPE) \ 376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(BYTECODE_ARRAY_TYPE) \ 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FREE_SPACE_TYPE) \ 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_INT8_ARRAY_TYPE) \ 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_UINT8_ARRAY_TYPE) \ 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_INT16_ARRAY_TYPE) \ 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_UINT16_ARRAY_TYPE) \ 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_INT32_ARRAY_TYPE) \ 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_UINT32_ARRAY_TYPE) \ 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_FLOAT32_ARRAY_TYPE) \ 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_FLOAT64_ARRAY_TYPE) \ 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_UINT8_CLAMPED_ARRAY_TYPE) \ 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FILLER_TYPE) \ 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 391109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(ACCESSOR_INFO_TYPE) \ 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ACCESSOR_PAIR_TYPE) \ 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ACCESS_CHECK_INFO_TYPE) \ 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(INTERCEPTOR_INFO_TYPE) \ 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CALL_HANDLER_INFO_TYPE) \ 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FUNCTION_TEMPLATE_INFO_TYPE) \ 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(OBJECT_TEMPLATE_INFO_TYPE) \ 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SIGNATURE_INFO_TYPE) \ 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TYPE_SWITCH_INFO_TYPE) \ 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ALLOCATION_MEMENTO_TYPE) \ 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ALLOCATION_SITE_TYPE) \ 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SCRIPT_TYPE) \ 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TYPE_FEEDBACK_INFO_TYPE) \ 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ALIASED_ARGUMENTS_ENTRY_TYPE) \ 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BOX_TYPE) \ 406c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(PROMISE_RESOLVE_THENABLE_JOB_INFO_TYPE) \ 407c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(PROMISE_REACTION_JOB_INFO_TYPE) \ 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(PROTOTYPE_INFO_TYPE) \ 409c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(TUPLE3_TYPE) \ 410f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(CONTEXT_EXTENSION_TYPE) \ 411f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(MODULE_TYPE) \ 412c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(MODULE_INFO_ENTRY_TYPE) \ 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_ARRAY_TYPE) \ 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_DOUBLE_ARRAY_TYPE) \ 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHARED_FUNCTION_INFO_TYPE) \ 417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(WEAK_CELL_TYPE) \ 418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(TRANSITION_ARRAY_TYPE) \ 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_MESSAGE_OBJECT_TYPE) \ 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_VALUE_TYPE) \ 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_DATE_TYPE) \ 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_OBJECT_TYPE) \ 42513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JS_ARGUMENTS_TYPE) \ 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_CONTEXT_EXTENSION_OBJECT_TYPE) \ 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_GENERATOR_OBJECT_TYPE) \ 428c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_MODULE_NAMESPACE_TYPE) \ 429c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FIXED_ARRAY_ITERATOR_TYPE) \ 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_GLOBAL_OBJECT_TYPE) \ 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_GLOBAL_PROXY_TYPE) \ 432bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V(JS_API_OBJECT_TYPE) \ 4333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(JS_SPECIAL_API_OBJECT_TYPE) \ 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_ARRAY_TYPE) \ 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_ARRAY_BUFFER_TYPE) \ 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_TYPED_ARRAY_TYPE) \ 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_DATA_VIEW_TYPE) \ 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_PROXY_TYPE) \ 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_SET_TYPE) \ 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_MAP_TYPE) \ 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_SET_ITERATOR_TYPE) \ 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_MAP_ITERATOR_TYPE) \ 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_WEAK_MAP_TYPE) \ 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_WEAK_SET_TYPE) \ 445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(JS_PROMISE_TYPE) \ 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_REGEXP_TYPE) \ 44713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JS_ERROR_TYPE) \ 448f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(JS_STRING_ITERATOR_TYPE) \ 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 450c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_TYPED_ARRAY_KEY_ITERATOR_TYPE) \ 451c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_ARRAY_KEY_ITERATOR_TYPE) \ 452c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE) \ 453c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 454c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_INT8_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 455c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT8_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 456c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_INT16_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 457c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT16_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 458c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_INT32_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 459c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT32_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 460c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FLOAT32_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 461c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FLOAT64_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 462c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT8_CLAMPED_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 463c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 464c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 465c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 466c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 467c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 468c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 469c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 470c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_GENERIC_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 471c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 472c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_INT8_ARRAY_VALUE_ITERATOR_TYPE) \ 473c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT8_ARRAY_VALUE_ITERATOR_TYPE) \ 474c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_INT16_ARRAY_VALUE_ITERATOR_TYPE) \ 475c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT16_ARRAY_VALUE_ITERATOR_TYPE) \ 476c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_INT32_ARRAY_VALUE_ITERATOR_TYPE) \ 477c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT32_ARRAY_VALUE_ITERATOR_TYPE) \ 478c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FLOAT32_ARRAY_VALUE_ITERATOR_TYPE) \ 479c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FLOAT64_ARRAY_VALUE_ITERATOR_TYPE) \ 480c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT8_CLAMPED_ARRAY_VALUE_ITERATOR_TYPE) \ 481c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 482c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_SMI_ARRAY_VALUE_ITERATOR_TYPE) \ 483c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_SMI_ARRAY_VALUE_ITERATOR_TYPE) \ 484c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_ARRAY_VALUE_ITERATOR_TYPE) \ 485c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_ARRAY_VALUE_ITERATOR_TYPE) \ 486c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE) \ 487c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE) \ 488c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_GENERIC_ARRAY_VALUE_ITERATOR_TYPE) \ 489c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(JS_BOUND_FUNCTION_TYPE) \ 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_FUNCTION_TYPE) \ 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(DEBUG_INFO_TYPE) \ 493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block V(BREAK_POINT_INFO_TYPE) 494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Since string types are not consecutive, this macro is used to 496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// iterate over them. 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define STRING_TYPE_LIST(V) \ 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(STRING_TYPE, kVariableSizeSentinel, string, String) \ 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ONE_BYTE_STRING_TYPE, kVariableSizeSentinel, one_byte_string, \ 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OneByteString) \ 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CONS_STRING_TYPE, ConsString::kSize, cons_string, ConsString) \ 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CONS_ONE_BYTE_STRING_TYPE, ConsString::kSize, cons_one_byte_string, \ 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConsOneByteString) \ 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SLICED_STRING_TYPE, SlicedString::kSize, sliced_string, SlicedString) \ 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SLICED_ONE_BYTE_STRING_TYPE, SlicedString::kSize, sliced_one_byte_string, \ 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SlicedOneByteString) \ 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_STRING_TYPE, ExternalTwoByteString::kSize, external_string, \ 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalString) \ 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_ONE_BYTE_STRING_TYPE, ExternalOneByteString::kSize, \ 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_one_byte_string, ExternalOneByteString) \ 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE, ExternalTwoByteString::kSize, \ 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_string_with_one_byte_data, ExternalStringWithOneByteData) \ 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_STRING_TYPE, ExternalTwoByteString::kShortSize, \ 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_string, ShortExternalString) \ 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE, ExternalOneByteString::kShortSize, \ 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_one_byte_string, ShortExternalOneByteString) \ 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalTwoByteString::kShortSize, \ 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_string_with_one_byte_data, \ 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ShortExternalStringWithOneByteData) \ 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(INTERNALIZED_STRING_TYPE, kVariableSizeSentinel, internalized_string, \ 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InternalizedString) \ 524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ONE_BYTE_INTERNALIZED_STRING_TYPE, kVariableSizeSentinel, \ 525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch one_byte_internalized_string, OneByteInternalizedString) \ 526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_INTERNALIZED_STRING_TYPE, ExternalTwoByteString::kSize, \ 527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_internalized_string, ExternalInternalizedString) \ 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, ExternalOneByteString::kSize, \ 529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_one_byte_internalized_string, ExternalOneByteInternalizedString) \ 530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalTwoByteString::kSize, \ 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_internalized_string_with_one_byte_data, \ 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalInternalizedStringWithOneByteData) \ 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE, \ 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalTwoByteString::kShortSize, short_external_internalized_string, \ 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ShortExternalInternalizedString) \ 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, \ 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalOneByteString::kShortSize, \ 539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_one_byte_internalized_string, \ 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ShortExternalOneByteInternalizedString) \ 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalTwoByteString::kShortSize, \ 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_internalized_string_with_one_byte_data, \ 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ShortExternalInternalizedStringWithOneByteData) 545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A struct is a simple object a set of object-valued fields. Including an 547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// object type in this causes the compiler to generate most of the boilerplate 548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// code for the class including allocation and garbage collection routines, 549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// casts and predicates. All you need to define is the class, methods and 550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// object verification routines. Easy, no? 551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Note that for subtle reasons related to the ordering or numerical values of 553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST 554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// manually. 555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define STRUCT_LIST(V) \ 556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(BOX, Box, box) \ 557c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(PROMISE_RESOLVE_THENABLE_JOB_INFO, PromiseResolveThenableJobInfo, \ 558c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch promise_resolve_thenable_job_info) \ 559c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(PROMISE_REACTION_JOB_INFO, PromiseReactionJobInfo, \ 560c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch promise_reaction_job_info) \ 561109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(ACCESSOR_INFO, AccessorInfo, accessor_info) \ 562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \ 563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ 564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ 565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \ 566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \ 567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \ 568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(SCRIPT, Script, script) \ 569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ALLOCATION_SITE, AllocationSite, allocation_site) \ 570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ALLOCATION_MEMENTO, AllocationMemento, allocation_memento) \ 571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(TYPE_FEEDBACK_INFO, TypeFeedbackInfo, type_feedback_info) \ 572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \ 573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(DEBUG_INFO, DebugInfo, debug_info) \ 574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(BREAK_POINT_INFO, BreakPointInfo, break_point_info) \ 575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(PROTOTYPE_INFO, PrototypeInfo, prototype_info) \ 576c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(TUPLE3, Tuple3, tuple3) \ 577f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(MODULE, Module, module) \ 578c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(MODULE_INFO_ENTRY, ModuleInfoEntry, module_info_entry) \ 579f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(CONTEXT_EXTENSION, ContextExtension, context_extension) 580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// We use the full 8 bits of the instance_type field to encode heap object 582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// instance types. The high-order bit (bit 7) is set if the object is not a 583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// string, and cleared if it is a string. 584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kIsNotStringMask = 0x80; 585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kStringTag = 0x0; 586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kNotStringTag = 0x80; 587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Bit 6 indicates that the object is an internalized string (if set) or not. 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Bit 7 has to be clear as well. 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kIsNotInternalizedMask = 0x40; 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kNotInternalizedTag = 0x40; 592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kInternalizedTag = 0x0; 593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If bit 7 is clear then bit 2 indicates whether the string consists of 595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// two-byte characters or one-byte characters. 596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kStringEncodingMask = 0x4; 597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kTwoByteStringTag = 0x0; 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kOneByteStringTag = 0x4; 599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If bit 7 is clear, the low-order 2 bits indicate the representation 601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// of the string. 602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kStringRepresentationMask = 0x03; 603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum StringRepresentationTag { 604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kSeqStringTag = 0x0, 605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kConsStringTag = 0x1, 60669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kExternalStringTag = 0x2, 60769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kSlicedStringTag = 0x3 608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 60969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochconst uint32_t kIsIndirectStringMask = 0x1; 61069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochconst uint32_t kIsIndirectStringTag = 0x1; 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0); // NOLINT 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0); // NOLINT 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT((kConsStringTag & 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT((kSlicedStringTag & 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT 61769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 61869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Use this mask to distinguish between cons and slice only after making 61969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// sure that the string is one of the two (an indirect string). 62069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochconst uint32_t kSlicedNotConsMask = kSlicedStringTag & ~kConsStringTag; 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(IS_POWER_OF_TWO(kSlicedNotConsMask)); 622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6239dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen// If bit 7 is clear, then bit 3 indicates whether this two-byte 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// string actually contains one byte data. 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kOneByteDataHintMask = 0x08; 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kOneByteDataHintTag = 0x08; 6279dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 6283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// If bit 7 is clear and string representation indicates an external string, 6293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// then bit 4 indicates whether the data pointer is cached. 6303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint32_t kShortExternalStringMask = 0x10; 6313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint32_t kShortExternalStringTag = 0x10; 6323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A ConsString with an empty string as the right side is a candidate 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// for being shortcut by the garbage collector. We don't allocate any 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// non-flat internalized strings, so we do not shortcut them thereby 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// avoiding turning internalized strings into strings. The bit-masks 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// below contain the internalized bit as additional safety. 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// See heap.cc, mark-compact.cc and objects-visiting.cc. 640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kShortcutTypeMask = 641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIsNotStringMask | 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsNotInternalizedMask | 643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kStringRepresentationMask; 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kShortcutTypeTag = kConsStringTag | kNotInternalizedTag; 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline bool IsShortcutCandidate(int type) { 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ((type & kShortcutTypeMask) == kShortcutTypeTag); 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum InstanceType { 651e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // String types. 652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch INTERNALIZED_STRING_TYPE = kTwoByteStringTag | kSeqStringTag | 653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInternalizedTag, // FIRST_PRIMITIVE_TYPE 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ONE_BYTE_INTERNALIZED_STRING_TYPE = 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOneByteStringTag | kSeqStringTag | kInternalizedTag, 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_TYPE = 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTwoByteStringTag | kExternalStringTag | kInternalizedTag, 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE = 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOneByteStringTag | kExternalStringTag | kInternalizedTag, 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE = 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_TYPE | kOneByteDataHintTag | 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInternalizedTag, 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE = EXTERNAL_INTERNALIZED_STRING_TYPE | 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kShortExternalStringTag | 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInternalizedTag, 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE = 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kShortExternalStringTag | 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInternalizedTag, 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE = 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kShortExternalStringTag | kInternalizedTag, 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STRING_TYPE = INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ONE_BYTE_STRING_TYPE = 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag | kNotInternalizedTag, 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CONS_ONE_BYTE_STRING_TYPE = 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOneByteStringTag | kConsStringTag | kNotInternalizedTag, 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SLICED_STRING_TYPE = 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTwoByteStringTag | kSlicedStringTag | kNotInternalizedTag, 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SLICED_ONE_BYTE_STRING_TYPE = 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOneByteStringTag | kSlicedStringTag | kNotInternalizedTag, 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_STRING_TYPE = 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_ONE_BYTE_STRING_TYPE = 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNotInternalizedTag, 6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SHORT_EXTERNAL_STRING_TYPE = 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE = 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNotInternalizedTag, 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Non-string names 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SYMBOL_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE 699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Other primitives (cannot contain non-map-word pointers to heap objects). 701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HEAP_NUMBER_TYPE, 702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SIMD128_VALUE_TYPE, 703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ODDBALL_TYPE, // LAST_PRIMITIVE_TYPE 704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 705e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Objects allocated in their own spaces (never in new space). 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MAP_TYPE, 707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CODE_TYPE, 708e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 709e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // "Data", objects that cannot contain non-map-word pointers to heap 710e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // objects. 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUTABLE_HEAP_NUMBER_TYPE, 712257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch FOREIGN_TYPE, 713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block BYTE_ARRAY_TYPE, 714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BYTECODE_ARRAY_TYPE, 7153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FREE_SPACE_TYPE, 716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FIXED_INT8_ARRAY_TYPE, // FIRST_FIXED_TYPED_ARRAY_TYPE 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_UINT8_ARRAY_TYPE, 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_INT16_ARRAY_TYPE, 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_UINT16_ARRAY_TYPE, 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_INT32_ARRAY_TYPE, 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_UINT32_ARRAY_TYPE, 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_FLOAT32_ARRAY_TYPE, 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_FLOAT64_ARRAY_TYPE, 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_UINT8_CLAMPED_ARRAY_TYPE, // LAST_FIXED_TYPED_ARRAY_TYPE 7253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch FIXED_DOUBLE_ARRAY_TYPE, 726e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke FILLER_TYPE, // LAST_DATA_TYPE 727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 728e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Structs. 729109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ACCESSOR_INFO_TYPE, 7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ACCESSOR_PAIR_TYPE, 731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ACCESS_CHECK_INFO_TYPE, 732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block INTERCEPTOR_INFO_TYPE, 733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CALL_HANDLER_INFO_TYPE, 734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FUNCTION_TEMPLATE_INFO_TYPE, 735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OBJECT_TEMPLATE_INFO_TYPE, 736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block SIGNATURE_INFO_TYPE, 737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block TYPE_SWITCH_INFO_TYPE, 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOCATION_SITE_TYPE, 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOCATION_MEMENTO_TYPE, 740e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke SCRIPT_TYPE, 7413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TYPE_FEEDBACK_INFO_TYPE, 7423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ALIASED_ARGUMENTS_ENTRY_TYPE, 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BOX_TYPE, 744c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PROMISE_RESOLVE_THENABLE_JOB_INFO_TYPE, 745c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PROMISE_REACTION_JOB_INFO_TYPE, 746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DEBUG_INFO_TYPE, 747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block BREAK_POINT_INFO_TYPE, 748e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke FIXED_ARRAY_TYPE, 749e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke SHARED_FUNCTION_INFO_TYPE, 750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CELL_TYPE, 751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier WEAK_CELL_TYPE, 752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TRANSITION_ARRAY_TYPE, 753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PROPERTY_CELL_TYPE, 754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PROTOTYPE_INFO_TYPE, 755c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch TUPLE3_TYPE, 756f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch CONTEXT_EXTENSION_TYPE, 757f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MODULE_TYPE, 758c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MODULE_INFO_ENTRY_TYPE, 759e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // All the following types are subtypes of JSReceiver, which corresponds to 7613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // objects in the JS sense. The first and the last type in this range are 7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the two forms of function. This organization enables using the same 763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // compares for checking the JS_RECEIVER and the NONCALLABLE_JS_OBJECT range. 7643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_PROXY_TYPE, // FIRST_JS_RECEIVER_TYPE 7653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_GLOBAL_OBJECT_TYPE, // FIRST_JS_OBJECT_TYPE 7663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_GLOBAL_PROXY_TYPE, 767bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Like JS_API_OBJECT_TYPE, but requires access checks and/or has 768bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // interceptors. 7693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_SPECIAL_API_OBJECT_TYPE, // LAST_SPECIAL_RECEIVER_TYPE 7703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_VALUE_TYPE, // LAST_CUSTOM_ELEMENTS_RECEIVER 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_MESSAGE_OBJECT_TYPE, 7723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_DATE_TYPE, 773bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Like JS_OBJECT_TYPE, but created from API function. 774bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch JS_API_OBJECT_TYPE, 775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_OBJECT_TYPE, 77613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch JS_ARGUMENTS_TYPE, 777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_CONTEXT_EXTENSION_OBJECT_TYPE, 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_GENERATOR_OBJECT_TYPE, 779c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_MODULE_NAMESPACE_TYPE, 780c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FIXED_ARRAY_ITERATOR_TYPE, 781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_ARRAY_TYPE, 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_ARRAY_BUFFER_TYPE, 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_TYPED_ARRAY_TYPE, 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_DATA_VIEW_TYPE, 7853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_SET_TYPE, 7863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_MAP_TYPE, 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_SET_ITERATOR_TYPE, 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_MAP_ITERATOR_TYPE, 78969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch JS_WEAK_MAP_TYPE, 790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_WEAK_SET_TYPE, 791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JS_PROMISE_TYPE, 7923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_REGEXP_TYPE, 79313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch JS_ERROR_TYPE, 794f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch JS_STRING_ITERATOR_TYPE, 795c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 796c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_TYPED_ARRAY_KEY_ITERATOR_TYPE, 797c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_ARRAY_KEY_ITERATOR_TYPE, 798c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE, 799c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 800c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT8_ARRAY_KEY_VALUE_ITERATOR_TYPE, 801c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT8_ARRAY_KEY_VALUE_ITERATOR_TYPE, 802c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT16_ARRAY_KEY_VALUE_ITERATOR_TYPE, 803c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT16_ARRAY_KEY_VALUE_ITERATOR_TYPE, 804c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT32_ARRAY_KEY_VALUE_ITERATOR_TYPE, 805c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT32_ARRAY_KEY_VALUE_ITERATOR_TYPE, 806c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FLOAT32_ARRAY_KEY_VALUE_ITERATOR_TYPE, 807c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FLOAT64_ARRAY_KEY_VALUE_ITERATOR_TYPE, 808c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT8_CLAMPED_ARRAY_KEY_VALUE_ITERATOR_TYPE, 809c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 810c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE, 811c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE, 812c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_ARRAY_KEY_VALUE_ITERATOR_TYPE, 813c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_ARRAY_KEY_VALUE_ITERATOR_TYPE, 814c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE, 815c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE, 816c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_GENERIC_ARRAY_KEY_VALUE_ITERATOR_TYPE, 817c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 818c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT8_ARRAY_VALUE_ITERATOR_TYPE, 819c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT8_ARRAY_VALUE_ITERATOR_TYPE, 820c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT16_ARRAY_VALUE_ITERATOR_TYPE, 821c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT16_ARRAY_VALUE_ITERATOR_TYPE, 822c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT32_ARRAY_VALUE_ITERATOR_TYPE, 823c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT32_ARRAY_VALUE_ITERATOR_TYPE, 824c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FLOAT32_ARRAY_VALUE_ITERATOR_TYPE, 825c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FLOAT64_ARRAY_VALUE_ITERATOR_TYPE, 826c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT8_CLAMPED_ARRAY_VALUE_ITERATOR_TYPE, 827c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 828c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_SMI_ARRAY_VALUE_ITERATOR_TYPE, 829c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_SMI_ARRAY_VALUE_ITERATOR_TYPE, 830c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_ARRAY_VALUE_ITERATOR_TYPE, 831c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_ARRAY_VALUE_ITERATOR_TYPE, 832c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE, 833c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE, 834c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_GENERIC_ARRAY_VALUE_ITERATOR_TYPE, 835c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JS_BOUND_FUNCTION_TYPE, 8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE 838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Pseudo-types 840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FIRST_TYPE = 0x0, 8413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAST_TYPE = JS_FUNCTION_TYPE, 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIRST_NAME_TYPE = FIRST_TYPE, 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_NAME_TYPE = SYMBOL_TYPE, 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE, 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_UNIQUE_NAME_TYPE = SYMBOL_TYPE, 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIRST_NONSTRING_TYPE = SYMBOL_TYPE, 847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FIRST_PRIMITIVE_TYPE = FIRST_NAME_TYPE, 848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LAST_PRIMITIVE_TYPE = ODDBALL_TYPE, 849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FIRST_FUNCTION_TYPE = JS_BOUND_FUNCTION_TYPE, 850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LAST_FUNCTION_TYPE = JS_FUNCTION_TYPE, 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Boundaries for testing for a fixed typed array. 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIRST_FIXED_TYPED_ARRAY_TYPE = FIXED_INT8_ARRAY_TYPE, 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_FIXED_TYPED_ARRAY_TYPE = FIXED_UINT8_CLAMPED_ARRAY_TYPE, 854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Boundary for promotion to old space. 855e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke LAST_DATA_TYPE = FILLER_TYPE, 8563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy). 8573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Note that there is no range for JSObject or JSProxy, since their subtypes 8583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // are not continuous in this enum! The enum ranges instead reflect the 8593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // external class names, where proxies are treated as either ordinary objects, 8603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // or functions. 861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FIRST_JS_RECEIVER_TYPE = JS_PROXY_TYPE, 8623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LAST_JS_RECEIVER_TYPE = LAST_TYPE, 8633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Boundaries for testing the types represented as JSObject 8643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch FIRST_JS_OBJECT_TYPE = JS_GLOBAL_OBJECT_TYPE, 8653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAST_JS_OBJECT_TYPE = LAST_TYPE, 8663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Boundary for testing JSReceivers that need special property lookup handling 8673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LAST_SPECIAL_RECEIVER_TYPE = JS_SPECIAL_API_OBJECT_TYPE, 8683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Boundary case for testing JSReceivers that may have elements while having 8693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // an empty fixed array as elements backing store. This is true for string 8703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // wrappers. 8713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LAST_CUSTOM_ELEMENTS_RECEIVER = JS_VALUE_TYPE, 872c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 873c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FIRST_ARRAY_KEY_ITERATOR_TYPE = JS_TYPED_ARRAY_KEY_ITERATOR_TYPE, 874c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LAST_ARRAY_KEY_ITERATOR_TYPE = JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE, 875c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 876c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FIRST_ARRAY_KEY_VALUE_ITERATOR_TYPE = JS_UINT8_ARRAY_KEY_VALUE_ITERATOR_TYPE, 877c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LAST_ARRAY_KEY_VALUE_ITERATOR_TYPE = JS_GENERIC_ARRAY_KEY_VALUE_ITERATOR_TYPE, 878c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 879c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FIRST_ARRAY_VALUE_ITERATOR_TYPE = JS_UINT8_ARRAY_VALUE_ITERATOR_TYPE, 880c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LAST_ARRAY_VALUE_ITERATOR_TYPE = JS_GENERIC_ARRAY_VALUE_ITERATOR_TYPE, 881c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 882c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FIRST_ARRAY_ITERATOR_TYPE = FIRST_ARRAY_KEY_ITERATOR_TYPE, 883c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LAST_ARRAY_ITERATOR_TYPE = LAST_ARRAY_VALUE_ITERATOR_TYPE, 884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(JS_OBJECT_TYPE == Internals::kJSObjectType); 887bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochSTATIC_ASSERT(JS_API_OBJECT_TYPE == Internals::kJSApiObjectType); 888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(FIRST_NONSTRING_TYPE == Internals::kFirstNonstringType); 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(ODDBALL_TYPE == Internals::kOddballType); 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(FOREIGN_TYPE == Internals::kForeignType); 891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 892c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, 893c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch InstanceType instance_type); 894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 895f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(V) \ 896f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(BYTECODE_ARRAY_CONSTANT_POOL_SUB_TYPE) \ 897f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(BYTECODE_ARRAY_HANDLER_TABLE_SUB_TYPE) \ 898f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(CODE_STUBS_TABLE_SUB_TYPE) \ 899f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(COMPILATION_CACHE_TABLE_SUB_TYPE) \ 900f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(CONTEXT_SUB_TYPE) \ 901f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(COPY_ON_WRITE_SUB_TYPE) \ 902f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DEOPTIMIZATION_DATA_SUB_TYPE) \ 903f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DESCRIPTOR_ARRAY_SUB_TYPE) \ 904f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(EMBEDDED_OBJECT_SUB_TYPE) \ 905f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(ENUM_CACHE_SUB_TYPE) \ 906f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(ENUM_INDICES_CACHE_SUB_TYPE) \ 907f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DEPENDENT_CODE_SUB_TYPE) \ 908f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DICTIONARY_ELEMENTS_SUB_TYPE) \ 909f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DICTIONARY_PROPERTIES_SUB_TYPE) \ 910f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(EMPTY_PROPERTIES_DICTIONARY_SUB_TYPE) \ 911f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(FAST_ELEMENTS_SUB_TYPE) \ 912f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(FAST_PROPERTIES_SUB_TYPE) \ 913f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(FAST_TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE) \ 914f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(HANDLER_TABLE_SUB_TYPE) \ 915f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(JS_COLLECTION_SUB_TYPE) \ 916f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(JS_WEAK_COLLECTION_SUB_TYPE) \ 917f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(LITERALS_ARRAY_SUB_TYPE) \ 918f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(MAP_CODE_CACHE_SUB_TYPE) \ 919f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(NOSCRIPT_SHARED_FUNCTION_INFOS_SUB_TYPE) \ 920f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(NUMBER_STRING_CACHE_SUB_TYPE) \ 921f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(OBJECT_TO_CODE_SUB_TYPE) \ 922f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(OPTIMIZED_CODE_LITERALS_SUB_TYPE) \ 923f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(OPTIMIZED_CODE_MAP_SUB_TYPE) \ 924f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(PROTOTYPE_USERS_SUB_TYPE) \ 925f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(REGEXP_MULTIPLE_CACHE_SUB_TYPE) \ 926f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(RETAINED_MAPS_SUB_TYPE) \ 927f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SCOPE_INFO_SUB_TYPE) \ 928f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SCRIPT_LIST_SUB_TYPE) \ 929f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SERIALIZED_TEMPLATES_SUB_TYPE) \ 930f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SHARED_FUNCTION_INFOS_SUB_TYPE) \ 931f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SINGLE_CHARACTER_STRING_CACHE_SUB_TYPE) \ 932f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SLOW_TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE) \ 933f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(STRING_SPLIT_CACHE_SUB_TYPE) \ 934f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(STRING_TABLE_SUB_TYPE) \ 935f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(TEMPLATE_INFO_SUB_TYPE) \ 936f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(TYPE_FEEDBACK_VECTOR_SUB_TYPE) \ 937f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(TYPE_FEEDBACK_METADATA_SUB_TYPE) \ 938f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE) 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FixedArraySubInstanceType { 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE(name) name, 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE) 943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE 944f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch LAST_FIXED_ARRAY_SUB_TYPE = WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9469dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 9479dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(bmeurer): Remove this in favor of the ComparisonResult below. 949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum CompareResult { 950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LESS = -1, 951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EQUAL = 0, 952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block GREATER = 1, 953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NOT_EQUAL = GREATER 955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Result of an abstract relational comparison of x and y, implemented according 959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// to ES6 section 7.2.11 Abstract Relational Comparison. 960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class ComparisonResult { 961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kLessThan, // x < y 962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kEqual, // x = y 963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGreaterThan, // x > y 964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUndefined // at least one of x or y was undefined or NaN 965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECL_BOOLEAN_ACCESSORS(name) \ 969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool name() const; \ 970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_##name(bool value); 971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECL_INT_ACCESSORS(name) \ 973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int name() const; \ 974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_##name(int value); 975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define DECL_ACCESSORS(name, type) \ 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline type* name() const; \ 979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_##name(type* value, \ 980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode = UPDATE_WRITE_BARRIER); \ 981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_CAST(type) \ 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(static type* cast(Object* object)); \ 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(static const type* cast(const Object* object)); 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 987f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass AbstractCode; 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AccessorPair; 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSite; 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSiteCreationContext; 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSiteUsageContext; 992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Cell; 993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass ConsString; 99469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass ElementsAccessor; 99569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass FixedArrayBase; 996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FunctionLiteral; 997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSGlobalObject; 998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass KeyAccumulator; 999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LayoutDescriptor; 1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LiteralsArray; 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LookupIterator; 1002109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass FieldType; 1003c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass Module; 1004f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ModuleDescriptor; 1005f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ModuleInfoEntry; 1006f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ModuleInfo; 1007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ObjectHashTable; 1008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass ObjectVisitor; 1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PropertyCell; 1010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PropertyDescriptor; 1011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass SafepointEntry; 1012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass SharedFunctionInfo; 101369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass StringStream; 1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass TypeFeedbackInfo; 101513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass TypeFeedbackMetadata; 1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass TypeFeedbackVector; 1017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass WeakCell; 1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass TransitionArray; 1019f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass TemplateList; 1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A template-ized version of the IsXXX functions. 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class C> inline bool Is(Object* obj); 10235913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 1024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_VERIFIER(Name) void Name##Verify(); 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_VERIFIER(Name) 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1029053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block 1030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef OBJECT_PRINT 1031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_PRINTER(Name) void Name##Print(std::ostream& os); // NOLINT 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_PRINTER(Name) 10345913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck#endif 1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define OBJECT_TYPE_LIST(V) \ 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Smi) \ 1038109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(LayoutDescriptor) \ 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HeapObject) \ 1040109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(Primitive) \ 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Number) 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 104313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define HEAP_OBJECT_TYPE_LIST(V) \ 104413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(HeapNumber) \ 104513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(MutableHeapNumber) \ 104613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Simd128Value) \ 104713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Float32x4) \ 104813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Int32x4) \ 104913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Uint32x4) \ 105013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Bool32x4) \ 105113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Int16x8) \ 105213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Uint16x8) \ 105313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Bool16x8) \ 105413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Int8x16) \ 105513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Uint8x16) \ 105613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Bool8x16) \ 105713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Name) \ 105813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(UniqueName) \ 105913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(String) \ 106013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SeqString) \ 106113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ExternalString) \ 106213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ConsString) \ 106313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SlicedString) \ 106413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ExternalTwoByteString) \ 106513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ExternalOneByteString) \ 106613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SeqTwoByteString) \ 106713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SeqOneByteString) \ 106813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(InternalizedString) \ 106913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Symbol) \ 107013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch \ 107113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedTypedArrayBase) \ 107213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedUint8Array) \ 107313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedInt8Array) \ 107413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedUint16Array) \ 107513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedInt16Array) \ 107613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedUint32Array) \ 107713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedInt32Array) \ 107813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedFloat32Array) \ 107913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedFloat64Array) \ 108013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedUint8ClampedArray) \ 108113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ByteArray) \ 108213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(BytecodeArray) \ 108313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FreeSpace) \ 108413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSReceiver) \ 108513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSObject) \ 108613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSContextExtensionObject) \ 108713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSGeneratorObject) \ 1088c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JSModuleNamespace) \ 1089c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JSFixedArrayIterator) \ 109013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Map) \ 109113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DescriptorArray) \ 1092f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(FrameArray) \ 109313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(TransitionArray) \ 109413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(LiteralsArray) \ 109513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(TypeFeedbackMetadata) \ 109613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(TypeFeedbackVector) \ 109713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DeoptimizationInputData) \ 109813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DeoptimizationOutputData) \ 109913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DependentCode) \ 110013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(HandlerTable) \ 110113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedArray) \ 110213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedDoubleArray) \ 110313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(WeakFixedArray) \ 110413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ArrayList) \ 1105c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(RegExpMatchInfo) \ 110613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Context) \ 110713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ScriptContextTable) \ 110813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(NativeContext) \ 110913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ScopeInfo) \ 1110f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(ModuleInfo) \ 111113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSBoundFunction) \ 111213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSFunction) \ 111313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Code) \ 111413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(AbstractCode) \ 111513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Oddball) \ 111613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SharedFunctionInfo) \ 111713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSValue) \ 111813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSDate) \ 111913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSMessageObject) \ 112013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(StringWrapper) \ 112113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Foreign) \ 112213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Boolean) \ 112313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSArray) \ 112413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSArrayBuffer) \ 112513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSArrayBufferView) \ 1126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(JSCollection) \ 112713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSTypedArray) \ 1128c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JSArrayIterator) \ 112913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSDataView) \ 113013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSProxy) \ 113113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSError) \ 113213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSPromise) \ 1133f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(JSStringIterator) \ 113413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSSet) \ 113513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSMap) \ 113613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSSetIterator) \ 113713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSMapIterator) \ 113813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSWeakCollection) \ 113913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSWeakMap) \ 114013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSWeakSet) \ 114113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSRegExp) \ 114213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(HashTable) \ 114313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Dictionary) \ 1144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(UnseededNumberDictionary) \ 114513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(StringTable) \ 114613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(StringSet) \ 114713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(NormalizedMapCache) \ 114813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(CompilationCacheTable) \ 114913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(CodeCacheHashTable) \ 115013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(MapCache) \ 115113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSGlobalObject) \ 115213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSGlobalProxy) \ 115313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Undetectable) \ 115413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(AccessCheckNeeded) \ 115513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Callable) \ 115613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Function) \ 115713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Constructor) \ 115813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(TemplateInfo) \ 115913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Filler) \ 116013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedArrayBase) \ 116113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(External) \ 116213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Struct) \ 116313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Cell) \ 1164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(TemplateList) \ 116513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(PropertyCell) \ 116613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(WeakCell) \ 116713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ObjectHashTable) \ 1168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(ObjectHashSet) \ 116913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(WeakHashTable) \ 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(OrderedHashTable) 11713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 117213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define ODDBALL_LIST(V) \ 117313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Undefined, undefined_value) \ 117413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Null, null_value) \ 117513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(TheHole, the_hole_value) \ 117613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Exception, exception) \ 117713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Uninitialized, uninitialized_value) \ 117813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(True, true_value) \ 117913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(False, false_value) \ 118013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ArgumentsMarker, arguments_marker) \ 118113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(OptimizedOut, optimized_out) \ 118213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(StaleRegister, stale_register) 1183109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The element types selection for CreateListFromArrayLike. 1185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class ElementTypes { kAll, kStringAndSymbol }; 1186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Object is the abstract superclass for all classes in the 1188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// object hierarchy. 1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Object does not use any virtual functions to avoid the 1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// allocation of the C++ vtable. 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Since both Smi and HeapObject are subclasses of Object no 1192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// data members can be present in Object. 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Object { 1194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Type testing. 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsObject() const { return true; } 11973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 119813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DECL(Type) INLINE(bool Is##Type() const); 1199b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 1200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 120113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef IS_TYPE_FUNCTION_DECL 120213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DECL(Type, Value) \ 120313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch INLINE(bool Is##Type(Isolate* isolate) const); 1204109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ODDBALL_LIST(IS_TYPE_FUNCTION_DECL) 1205b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef IS_TYPE_FUNCTION_DECL 1206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A non-keyed store is of the form a.x = foo or a["x"] = foo whereas 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a keyed store is of the form a[expression] = foo. 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum StoreFromKeyed { 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MAY_BE_STORE_FROM_KEYED, 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CERTAINLY_NOT_STORE_FROM_KEYED 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 12133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum ShouldThrow { THROW_ON_ERROR, DONT_THROW }; 1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define RETURN_FAILURE(isolate, should_throw, call) \ 1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if ((should_throw) == DONT_THROW) { \ 1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Just(false); \ 1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { \ 1221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate->Throw(*isolate->factory()->call); \ 1222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Nothing<bool>(); \ 1223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } \ 1224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } while (false) 1225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAYBE_RETURN(call, value) \ 1227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 1228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if ((call).IsNothing()) return value; \ 1229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } while (false) 1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAYBE_RETURN_NULL(call) MAYBE_RETURN(call, MaybeHandle<Object>()) 1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_STRUCT_PREDICATE(NAME, Name, name) \ 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool Is##Name() const); 1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STRUCT_LIST(DECLARE_STRUCT_PREDICATE) 1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DECLARE_STRUCT_PREDICATE 1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6, section 7.2.2 IsArray. NOT to be confused with %_IsArray. 1239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> IsArray(Handle<Object> object); 1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsNameDictionary() const); 1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch INLINE(bool IsGlobalDictionary() const); 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsSeededNumberDictionary() const); 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsOrderedHashSet() const); 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsOrderedHashMap() const); 124669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Extract the number. 1248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline double Number() const; 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsNaN() const); 1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsMinusZero() const); 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ToInt32(int32_t* value); 12523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool ToUint32(uint32_t* value); 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Representation OptimalRepresentation(); 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ElementsKind OptimalElementsKind(); 1257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool FitsRepresentation(Representation representation); 1259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Checks whether two valid primitive encodings of a property name resolve to 1261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the same logical property. E.g., the smi 1, the string "1" and the double 1262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 1 all refer to the same property, so this helper will return true. 1263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool KeyEquals(Object* other); 1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool FilterKey(PropertyFilter filter); 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1267109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<FieldType> OptimalType(Isolate* isolate, 1268109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Representation representation); 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static Handle<Object> NewStorageFor(Isolate* isolate, 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> object, 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation); 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static Handle<Object> WrapForRead(Isolate* isolate, 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> object, 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation); 1277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Returns true if the object is of the correct type to be used as a 12793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // implementation of a JSObject's elements. 12803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline bool HasValidElements(); 12813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasSpecificClassOf(String* name); 1283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool BooleanValue(); // ECMA-262 9.2. 1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.2.11 Abstract Relational Comparison 1287109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static Maybe<ComparisonResult> Compare(Handle<Object> x, 1288109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> y); 1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.2.12 Abstract Equality Comparison 1291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> Equals(Handle<Object> x, Handle<Object> y); 1292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.2.13 Strict Equality Comparison 1294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool StrictEquals(Object* that); 1295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert to a JSObject if needed. 1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // native_context is used when creating wrapper object. 1298109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<JSReceiver> ToObject( 1299109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, Handle<Object> object); 1300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<JSReceiver> ToObject( 1301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object, Handle<Context> context); 1302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 13033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // ES6 section 9.2.1.2, OrdinaryCallBindThis for sloppy callee. 13043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static MaybeHandle<JSReceiver> ConvertReceiver( 13053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate, Handle<Object> object); 13063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.14 ToPropertyKey 13083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Name> ToName(Isolate* isolate, 13093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> input); 1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.1 ToPrimitive 1312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> ToPrimitive( 1313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> input, ToPrimitiveHint hint = ToPrimitiveHint::kDefault); 1314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.3 ToNumber 1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToNumber(Handle<Object> input); 1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.4 ToInteger 1319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToInteger(Isolate* isolate, 1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> input); 1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.5 ToInt32 1323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToInt32(Isolate* isolate, 1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> input); 1325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.6 ToUint32 1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToUint32(Isolate* isolate, 1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> input); 1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.12 ToString 1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<String> ToString(Isolate* isolate, 1332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> input); 1333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<String> NoSideEffectsToString(Isolate* isolate, 1335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> input); 1336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1337bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // ES6 section 7.1.14 ToPropertyKey 1338bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToPropertyKey( 1339bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate, Handle<Object> value); 1340bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.15 ToLength 1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToLength(Isolate* isolate, 1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> input); 1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ES6 section 7.1.17 ToIndex 1346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToIndex( 1347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate, Handle<Object> input, 1348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MessageTemplate::Template error_index); 1349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.3.9 GetMethod 1351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetMethod( 1352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> receiver, Handle<Name> name); 1353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.3.17 CreateListFromArrayLike 1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<FixedArray> CreateListFromArrayLike( 1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object, ElementTypes element_types); 1357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 135813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Get length property and apply ToLength. 135913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetLengthFromArrayLike( 136013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* isolate, Handle<Object> object); 1361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.5.6 The typeof Operator 1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> TypeOf(Isolate* isolate, Handle<Object> object); 1364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.6 Multiplicative Operators 1366109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Multiply(Isolate* isolate, 1367109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1368109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1369109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Divide(Isolate* isolate, 1370109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1371109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1372109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Modulus(Isolate* isolate, 1373109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1374109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.7 Additive Operators 1377109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Add(Isolate* isolate, 1378109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1379109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1380109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Subtract(Isolate* isolate, 1381109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1382109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.8 Bitwise Shift Operators 1385109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ShiftLeft(Isolate* isolate, 1386109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1387109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1388109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ShiftRight(Isolate* isolate, 1389109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1390109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ShiftRightLogical( 1392109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, Handle<Object> lhs, Handle<Object> rhs); 1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.9 Relational Operators 1395109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> GreaterThan(Handle<Object> x, 1396109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> y); 1397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> GreaterThanOrEqual( 1398109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> x, Handle<Object> y); 1399109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> LessThan(Handle<Object> x, 1400109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> y); 1401109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> LessThanOrEqual(Handle<Object> x, 1402109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> y); 1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.11 Binary Bitwise Operators 1405109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> BitwiseAnd(Isolate* isolate, 1406109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1407109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1408109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> BitwiseOr(Isolate* isolate, 1409109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1410109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1411109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> BitwiseXor(Isolate* isolate, 1412109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1413109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1414109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1415bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // ES6 section 7.3.19 OrdinaryHasInstance (C, O). 1416bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> OrdinaryHasInstance( 1417bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate, Handle<Object> callable, Handle<Object> object); 1418bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1419bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // ES6 section 12.10.4 Runtime Semantics: InstanceofOperator(O, C) 1420bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> InstanceOf( 1421bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate, Handle<Object> object, Handle<Object> callable); 1422bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1423f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE MUST_USE_RESULT static MaybeHandle<Object> GetProperty( 1424f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch LookupIterator* it); 1425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 [[Set]] (when passed DONT_THROW) 1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Invariants for this and related functions (unless stated otherwise): 1428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 1) When the result is Nothing, an exception is pending. 1429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 2) When passed THROW_ON_ERROR, the result is never Just(false). 1430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // In some cases, an exception is thrown regardless of the ShouldThrow 1431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // argument. These cases are either in accordance with the spec or not 1432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // covered by it (eg., concerning API callbacks). 1433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetProperty(LookupIterator* it, 1434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 1435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode, 1436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StoreFromKeyed store_mode); 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> SetProperty( 1438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> object, Handle<Name> name, Handle<Object> value, 1439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode, 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED); 14413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> SetPropertyOrElement( 14423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> object, Handle<Name> name, Handle<Object> value, 14433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LanguageMode language_mode, 14443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED); 1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetSuperProperty( 1447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, LanguageMode language_mode, 1448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StoreFromKeyed store_mode); 1449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> CannotCreateProperty( 1451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> receiver, Handle<Object> name, 1452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, ShouldThrow should_throw); 1453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> WriteToReadOnlyProperty( 1454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, ShouldThrow should_throw); 1455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> WriteToReadOnlyProperty( 1456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> receiver, Handle<Object> name, 1457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, ShouldThrow should_throw); 1458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> RedefineIncompatibleProperty( 1459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> name, Handle<Object> value, 1460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 1461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetDataProperty(LookupIterator* it, 1462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value); 1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> AddDataProperty( 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, 1465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw, StoreFromKeyed store_mode); 1466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement( 1467109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> object, Handle<Name> name); 1468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement( 1469109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> receiver, Handle<Name> name, Handle<JSReceiver> holder); 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( 1471109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> object, Handle<Name> name); 1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithAccessor( 1474109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch LookupIterator* it); 1475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyWithAccessor( 1476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, ShouldThrow should_throw); 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithDefinedGetter( 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> receiver, 1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> getter); 1481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyWithDefinedSetter( 1482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> receiver, Handle<JSReceiver> setter, Handle<Object> value, 1483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetElement( 1486109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, Handle<Object> object, uint32_t index); 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> SetElement( 1489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object, uint32_t index, 1490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, LanguageMode language_mode); 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the permanent hash code associated with this object. May return 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // undefined if not yet created. 1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* GetHash(); 1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns the permanent hash code associated with this object depending on 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the actual object type. May create and store a hash code if needed and none 1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // exists. 149913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Smi* GetOrCreateHash(Isolate* isolate, Handle<Object> object); 15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Checks whether this object has the same value as the given one. This 15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // function is implemented according to ES5, section 9.12 and can be used 15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // to implement the Harmony "egal" function. 1504c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE bool SameValue(Object* other); 15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Checks whether this object has the same value as the given one. 1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // +0 and -0 are treated equal. Everything else is the same as SameValue. 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This function is implemented according to ES6, section 7.2.4 and is used 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // by ES6 Map and Set. 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool SameValueZero(Object* other); 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 9.4.2.3 ArraySpeciesCreate (part of it) 1513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ArraySpeciesConstructor( 1514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> original_array); 1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tries to convert an object to an array length. Returns true and sets the 1517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // output parameter if it succeeds. 1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool ToArrayLength(uint32_t* index); 1519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tries to convert an object to an array index. Returns true and sets the 1521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // output parameter if it succeeds. Equivalent to ToArrayLength, but does not 1522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // allow kMaxUInt32. 15237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch inline bool ToArrayIndex(uint32_t* index); 15247f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Object) 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Verify a pointer is a valid object pointer. 1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void VerifyPointer(Object* p); 1529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VerifyApiCallResultType(); 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 19.1.3.6 Object.prototype.toString 1534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<String> ObjectProtoToString( 1535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object); 1536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Prints this object without details. 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ShortPrint(FILE* out = stdout); 1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Prints this object without details to a message accumulator. 1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void ShortPrint(StringStream* accumulator); 1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void ShortPrint(std::ostream& os); // NOLINT 1544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Object) 1546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 1548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeaderSize = 0; // Object does not take up any space. 1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef OBJECT_PRINT 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For our gdb macros, we should perhaps change these in the future. 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Print(); 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Prints this object with details. 1555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print(std::ostream& os); // NOLINT 1556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 1557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print() { ShortPrint(); } 1558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print(std::ostream& os) { ShortPrint(os); } // NOLINT 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class LookupIterator; 1563109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch friend class StringStream; 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return the map of the root of object's prototype chain. 1566c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Map* GetPrototypeChainRootMap(Isolate* isolate); 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Helper for SetProperty and SetSuperProperty. 1569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Return value is only meaningful if [found] is set to true on return. 1570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyInternal( 1571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, LanguageMode language_mode, 1572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StoreFromKeyed store_mode, bool* found); 1573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 15743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static MaybeHandle<Name> ConvertToName(Isolate* isolate, 15753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> input); 15763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Object); 1578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// In objects.h to be usable without objects-inl.h inclusion. 1582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Object::IsSmi() const { return HAS_SMI_TAG(this); } 1583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Object::IsHeapObject() const { return Internals::HasHeapObjectTag(this); } 1584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct Brief { 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit Brief(const Object* const v) : value(v) {} 1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Object* value; 1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1591c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, const Brief& v); 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Smi represents integer Numbers that can be stored in 31 bits. 1594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Smis are immediate which means they are NOT allocated in the heap. 1595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The this pointer has the following format: [31 bit signed int] 0 15963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// For long smis it has the following format: 15973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// [32 bit signed int] [31 bits zero padding] 0 15983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Smi stands for small integer. 1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Smi: public Object { 1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the integer value. 1602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int value() const { return Internals::SmiValue(this); } 1603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert a value to a Smi object. 1605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Smi* FromInt(int value) { 1606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(Smi::IsValid(value)); 1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<Smi*>(Internals::IntToSmi(value)); 1608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Smi* FromIntptr(intptr_t value) { 1611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(Smi::IsValid(value)); 1612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int smi_shift_bits = kSmiTagSize + kSmiShiftSize; 1613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag); 1614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns whether value can be represented in a Smi. 1617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline bool IsValid(intptr_t value) { 1618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool result = Internals::IsValidSmi(value); 1619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(result, value >= kMinValue && value <= kMaxValue); 1620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return result; 1621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Smi) 1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 1626c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE void SmiPrint(std::ostream& os) const; // NOLINT 1627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Smi) 1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1629c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE static Smi* const kZero; 16303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMinValue = 16313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (static_cast<unsigned int>(-1)) << (kSmiValueSize - 1); 16323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block static const int kMaxValue = -(kMinValue + 1); 1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Smi); 1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Heap objects typically have a map pointer in their first word. However, 16403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// during GC other data (e.g. mark bits, forwarding addresses) is sometimes 1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// encoded in the first word. The class MapWord is an abstraction of the 1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// value in a heap object's first word. 1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass MapWord BASE_EMBEDDED { 1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Normal state: the map word contains a map pointer. 1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create a map word from a map pointer. 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline MapWord FromMap(const Map* map); 1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // View this map word as a map pointer. 1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Map* ToMap(); 1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Scavenge collection: the map word of live objects in the from space 1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // contains a forwarding address (a heap object pointer in the to space). 1656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // True if this map word is a forwarding address for a scavenge 1658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // collection. Only valid during a scavenge collection (specifically, 16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // when all map words are heap object pointers, i.e. not during a full GC). 1660bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline bool IsForwardingAddress() const; 1661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create a map word from a forwarding address. 1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline MapWord FromForwardingAddress(HeapObject* object); 1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // View this map word as a forwarding address. 1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline HeapObject* ToForwardingAddress(); 1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static inline MapWord FromRawValue(uintptr_t value) { 16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MapWord(value); 16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 167185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline uintptr_t ToRawValue() { 16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value_; 16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // HeapObject calls the private constructor and directly reads the value. 1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class HeapObject; 1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit MapWord(uintptr_t value) : value_(value) {} 1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uintptr_t value_; 1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HeapObject is the superclass for all classes describing heap allocated 1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// objects. 1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass HeapObject: public Object { 1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [map]: Contains a map which contains the object's reflective 1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // information. 1692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Map* map() const; 1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_map(Map* value); 16943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The no-write-barrier version. This is OK if the object is white and in 16953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // new space, or if the value is an immortal immutable object, like the maps 16963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // of primitive (non-JS) objects like strings, heap numbers etc. 16973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_map_no_write_barrier(Map* value); 1698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get the map using acquire load. 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Map* synchronized_map(); 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline MapWord synchronized_map_word() const; 1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the map using release store 1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_map(Map* value); 1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_map_no_write_barrier(Map* value); 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_map_word(MapWord map_word); 1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // During garbage collection, the map word of a heap object does not 1709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // necessarily contain a map pointer. 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline MapWord map_word() const; 1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_map_word(MapWord map_word); 1712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 171344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The Heap the object was allocated in. Used also to access Isolate. 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Heap* GetHeap() const; 17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Convenience method to get current isolate. 1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Isolate* GetIsolate() const; 171844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 171913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DECL(Type) INLINE(bool Is##Type() const); 1720109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 172113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef IS_TYPE_FUNCTION_DECL 172213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 172313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DECL(Type, Value) \ 172413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch INLINE(bool Is##Type(Isolate* isolate) const); 1725109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ODDBALL_LIST(IS_TYPE_FUNCTION_DECL) 1726109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef IS_TYPE_FUNCTION_DECL 172713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 1728109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define DECLARE_STRUCT_PREDICATE(NAME, Name, name) \ 1729109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch INLINE(bool Is##Name() const); 1730109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch STRUCT_LIST(DECLARE_STRUCT_PREDICATE) 1731109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef DECLARE_STRUCT_PREDICATE 1732109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Converts an address to a HeapObject pointer. 1734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline HeapObject* FromAddress(Address address) { 1735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_TAG_ALIGNED(address); 1736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); 1737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the address of this HeapObject. 1740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Address address() { 1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<Address>(this) - kHeapObjectTag; 1742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterates over pointers contained in the object (including the Map). 1745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If it's not performance critical iteration use the non-templatized 1746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // version. 1747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Iterate(ObjectVisitor* v); 1748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 1750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void IterateFast(ObjectVisitor* v); 1751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Iterates over all pointers contained in the object except the 1753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // first map pointer. The object type is given in the first 1754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // parameter. This function does not access the map pointer in the 1755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // object, and so is safe to call while the map pointer is modified. 1756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If it's not performance critical iteration use the non-templatized 1757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // version. 1758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IterateBody(ObjectVisitor* v); 1759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void IterateBody(InstanceType type, int object_size, ObjectVisitor* v); 1760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 1762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void IterateBodyFast(ObjectVisitor* v); 1763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 1765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void IterateBodyFast(InstanceType type, int object_size, 1766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v); 1767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if the object contains a tagged value at given offset. 1769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // It is used for invalid slots filtering. If the offset points outside 1770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // of the object or to the map word, the result is UNDEFINED (!!!). 1771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsValidSlot(int offset); 1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the heap object's size in bytes 1774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int Size(); 1775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Given a heap object's map pointer, returns the heap size in bytes 1777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Useful when the map pointer field is used for other purposes. 1778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // GC internal. 1779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int SizeFromMap(Map* map); 1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the field at offset in obj, as a read/write Object* reference. 1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Does no checking, and is safe to use during GC, while maps are invalid. 17837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Does not invoke write barrier, so should only be assigned to 1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // during marking GC. 1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Object** RawField(HeapObject* obj, int offset); 1786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Adds the |code| object related to |name| to the code cache of this map. If 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // this map is a dictionary map that is shared, the map copied and installed 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // onto the object. 1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void UpdateMapCodeCache(Handle<HeapObject> object, 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code); 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(HeapObject) 1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17964515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // Return the write barrier mode for this. Callers of this function 1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // must be able to present a reference to an DisallowHeapAllocation 17984515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // object as a sign that they are not going to use this function 17994515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // from code that allocates and thus invalidates the returned write 18004515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // barrier mode. 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline WriteBarrierMode GetWriteBarrierMode( 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const DisallowHeapAllocation& promise); 1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 1805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void HeapObjectShortPrint(std::ostream& os); // NOLINT 1806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef OBJECT_PRINT 1807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintHeader(std::ostream& os, const char* id); // NOLINT 1808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(HeapObject) 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(HeapObject) 1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void VerifyObjectField(int offset); 18137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch inline void VerifySmiField(int offset); 181485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Verify a pointer is a valid HeapObject pointer that points to object 1816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // areas in the heap. 1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void VerifyHeapPointer(Object* p); 1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline AllocationAlignment RequiredAlignment(); 1821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // First field in a heap object is map. 1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMapOffset = Object::kHeaderSize; 1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeaderSize = kMapOffset + kPointerSize; 1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kMapOffset == Internals::kHeapObjectMapOffset); 1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(HeapObject); 1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <int start_offset, int end_offset, int size> 1835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FixedBodyDescriptor; 1836756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1837756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <int start_offset> 1839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FlexibleBodyDescriptor; 1840756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1841756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The HeapNumber class describes heap allocated numbers that cannot be 1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// represented in a Smi (small integer) 1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass HeapNumber: public HeapObject { 1845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [value]: number value. 1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline double value() const; 1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_value(double value); 1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(HeapNumber) 1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HeapNumberBooleanValue(); 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1855c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE void HeapNumberPrint(std::ostream& os); // NOLINT 1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(HeapNumber) 1857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 18586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline int get_exponent(); 18596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline int get_sign(); 18606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 1862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kValueOffset = HeapObject::kHeaderSize; 1863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // IEEE doubles are two 32 bit words. The first is just mantissa, the second 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is a mixture of sign, exponent and mantissa. The offsets of two 32 bit 1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // words within double numbers are endian dependent and they are set 1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // accordingly. 1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if defined(V8_TARGET_LITTLE_ENDIAN) 1868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMantissaOffset = kValueOffset; 1869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kExponentOffset = kValueOffset + 4; 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif defined(V8_TARGET_BIG_ENDIAN) 1871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMantissaOffset = kValueOffset + 4; 1872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kExponentOffset = kValueOffset; 1873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#error Unknown byte ordering 1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 18768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kValueOffset + kDoubleSize; 1878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kSignMask = 0x80000000u; 1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kExponentMask = 0x7ff00000u; 1880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kMantissaMask = 0xfffffu; 18816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kMantissaBits = 52; 18829dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen static const int kExponentBits = 11; 1883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kExponentBias = 1023; 1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kExponentShift = 20; 1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInfinityOrNanExponent = 1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (kExponentMask >> kExponentShift) - kExponentBias; 1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMantissaBitsInTopWord = 20; 1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNonMantissaBitsInTopWord = 12; 1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(HeapNumber); 1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The Simd128Value class describes heap allocated 128 bit SIMD values. 1896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Simd128Value : public HeapObject { 1897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 1898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(Simd128Value) 1899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(Simd128Value) 1901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(Simd128Value) 1902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> ToString(Handle<Simd128Value> input); 1904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Equality operations. 1906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool Equals(Simd128Value* that); 1907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline bool Equals(Handle<Simd128Value> one, Handle<Simd128Value> two); 1908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Checks that another instance is bit-wise equal. 1910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool BitwiseEquals(const Simd128Value* other) const; 1911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Computes a hash from the 128 bit value, viewed as 4 32-bit integers. 1912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t Hash() const; 1913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Copies the 16 bytes of SIMD data to the destination address. 1914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CopyBits(void* destination) const; 1915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 1917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kValueOffset = HeapObject::kHeaderSize; 1918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kValueOffset + kSimd128Size; 1919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 1921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Simd128Value); 1922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 1923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// V has parameters (TYPE, Type, type, lane count, lane type) 1926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define SIMD128_TYPES(V) \ 1927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(FLOAT32X4, Float32x4, float32x4, 4, float) \ 1928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(INT32X4, Int32x4, int32x4, 4, int32_t) \ 1929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(UINT32X4, Uint32x4, uint32x4, 4, uint32_t) \ 1930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(BOOL32X4, Bool32x4, bool32x4, 4, bool) \ 1931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(INT16X8, Int16x8, int16x8, 8, int16_t) \ 1932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(UINT16X8, Uint16x8, uint16x8, 8, uint16_t) \ 1933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(BOOL16X8, Bool16x8, bool16x8, 8, bool) \ 1934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(INT8X16, Int8x16, int8x16, 16, int8_t) \ 1935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(UINT8X16, Uint8x16, uint8x16, 16, uint8_t) \ 1936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(BOOL8X16, Bool8x16, bool8x16, 16, bool) 1937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define SIMD128_VALUE_CLASS(TYPE, Type, type, lane_count, lane_type) \ 1939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class Type final : public Simd128Value { \ 1940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: \ 1941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline lane_type get_lane(int lane) const; \ 1942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_lane(int lane, lane_type value); \ 1943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch \ 1944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(Type) \ 1945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch \ 1946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(Type) \ 1947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch \ 1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> ToString(Handle<Type> input); \ 1949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch \ 1950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool Equals(Type* that); \ 1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch \ 1952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: \ 1953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Type); \ 1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 1955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSIMD128_TYPES(SIMD128_VALUE_CLASS) 1956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef SIMD128_VALUE_CLASS 1957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum EnsureElementsMode { 19603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DONT_ALLOW_DOUBLE_ELEMENTS, 19613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ALLOW_COPIED_DOUBLE_ELEMENTS, 19623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ALLOW_CONVERTED_DOUBLE_ELEMENTS 19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 19663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Indicator for one component of an AccessorPair. 19673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum AccessorComponent { 19683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ACCESSOR_GETTER, 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ACCESSOR_SETTER 19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 19713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 197213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochenum class GetKeysConversion { kKeepNumbers, kConvertToString }; 19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 197413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochenum class KeyCollectionMode { 197513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kOwnOnly = static_cast<int>(v8::KeyCollectionMode::kOwnOnly), 197613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kIncludePrototypes = 197713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static_cast<int>(v8::KeyCollectionMode::kIncludePrototypes) 197813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}; 1979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1980f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochenum class AllocationSiteUpdateMode { kUpdate, kCheckOnly }; 1981f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 19823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// JSReceiver includes types on which properties can be defined, i.e., 19833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// JSObject and JSProxy. 19843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass JSReceiver: public HeapObject { 1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [properties]: Backing storage for properties. 1987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // properties is a FixedArray in the fast case and a Dictionary in the 1988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // slow case. 1989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties. 1990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void initialize_properties(); 1991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasFastProperties(); 1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Gets slow properties for non-global objects. 1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline NameDictionary* property_dictionary(); 1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Deletes an existing named property in a normalized object. 1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void DeleteNormalizedProperty(Handle<JSReceiver> object, 1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> name, int entry); 1998e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSReceiver) 20003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.1 ToPrimitive 2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToPrimitive( 2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> receiver, 2004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ToPrimitiveHint hint = ToPrimitiveHint::kDefault); 2005f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2006f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ES6 section 7.1.1.1 OrdinaryToPrimitive 2007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> OrdinaryToPrimitive( 2008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> receiver, OrdinaryToPrimitiveHint hint); 2009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Context> GetFunctionRealm(Handle<JSReceiver> receiver); 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2012109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Get the first non-hidden prototype. 2013109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline MaybeHandle<Object> GetPrototype(Isolate* isolate, 2014109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<JSReceiver> receiver); 2015109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2016109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static Maybe<bool> HasInPrototypeChain( 2017109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, Handle<JSReceiver> object, Handle<Object> proto); 2018109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Implementation of [[HasProperty]], ECMA-262 5th edition, section 8.12.6. 2020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> HasProperty(LookupIterator* it); 2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Maybe<bool> HasProperty( 2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> object, Handle<Name> name); 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Maybe<bool> HasElement( 2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> object, uint32_t index); 2025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> HasOwnProperty( 2027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, Handle<Name> name); 2028bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> HasOwnProperty( 2029bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<JSReceiver> object, uint32_t index); 2030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 20313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( 20323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate, Handle<JSReceiver> receiver, const char* key); 20333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( 20343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSReceiver> receiver, Handle<Name> name); 20353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetElement( 20363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate, Handle<JSReceiver> receiver, uint32_t index); 20373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Implementation of ES6 [[Delete]] 2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeletePropertyOrElement( 2040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, Handle<Name> name, 2041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode = SLOPPY); 2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeleteProperty( 2043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, Handle<Name> name, 2044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode = SLOPPY); 2045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeleteProperty(LookupIterator* it, 2046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode); 2047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeleteElement( 2048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, uint32_t index, 2049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode = SLOPPY); 2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Object* DefineProperty(Isolate* isolate, 2052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> object, 2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> name, 2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> attributes); 2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> DefineProperties( 2056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object, Handle<Object> properties); 2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // "virtual" dispatcher to the correct [[DefineOwnProperty]] implementation. 2059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnProperty( 2060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSReceiver> object, Handle<Object> key, 2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 7.3.4 (when passed DONT_THROW) 2064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> CreateDataProperty( 2065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, ShouldThrow should_throw); 2066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.1.6.1 2068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> OrdinaryDefineOwnProperty( 2069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSObject> object, Handle<Object> key, 2070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 2071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> OrdinaryDefineOwnProperty( 2072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, PropertyDescriptor* desc, ShouldThrow should_throw); 2073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.1.6.2 2074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> IsCompatiblePropertyDescriptor( 2075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, bool extensible, PropertyDescriptor* desc, 2076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* current, Handle<Name> property_name, 2077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 2078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.1.6.3 2079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // |it| can be NULL in cases where the ES spec passes |undefined| as the 2080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // receiver. Exactly one of |it| and |property_name| must be provided. 2081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> ValidateAndApplyPropertyDescriptor( 2082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, LookupIterator* it, bool extensible, 2083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, PropertyDescriptor* current, 2084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw, Handle<Name> property_name = Handle<Name>()); 2085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2086f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE MUST_USE_RESULT static Maybe<bool> GetOwnPropertyDescriptor( 2087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSReceiver> object, Handle<Object> key, 2088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc); 2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> GetOwnPropertyDescriptor( 2090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, PropertyDescriptor* desc); 2091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef PropertyAttributes IntegrityLevel; 2093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 7.3.14 (when passed DONT_THROW) 2095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 'level' must be SEALED or FROZEN. 2096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetIntegrityLevel( 2097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, IntegrityLevel lvl, ShouldThrow should_throw); 2098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 7.3.15 2100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 'level' must be SEALED or FROZEN. 2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> TestIntegrityLevel( 2102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, IntegrityLevel lvl); 2103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 [[PreventExtensions]] (when passed DONT_THROW) 2105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> PreventExtensions( 2106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, ShouldThrow should_throw); 2107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> IsExtensible(Handle<JSReceiver> object); 21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Returns the class name ([[Class]] property in the specification). 21113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch String* class_name(); 21123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 21133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Returns the constructor name (the name (possibly, inferred name) of the 21143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // function that was used to instantiate the object). 2115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> GetConstructorName(Handle<JSReceiver> receiver); 2116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* GetCreationContext(); 21183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> GetPropertyAttributes( 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> object, Handle<Name> name); 2121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> 2122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetOwnPropertyAttributes(Handle<JSReceiver> object, Handle<Name> name); 2123bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> 2124bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch GetOwnPropertyAttributes(Handle<JSReceiver> object, uint32_t index); 21253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> GetElementAttributes( 2127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> object, uint32_t index); 2128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> 2129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetOwnElementAttributes(Handle<JSReceiver> object, uint32_t index); 2130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes( 2132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it); 2133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Set the object's prototype (only JSReceiver and null are allowed values). 2135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPrototype(Handle<JSReceiver> object, 2136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 2137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool from_javascript, 2138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 2139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 21403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline static Handle<Object> GetDataProperty(Handle<JSReceiver> object, 21413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Name> name); 2142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> GetDataProperty(LookupIterator* it); 2143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 21443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Retrieves a permanent object identity hash code. The undefined value might 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // be returned in case no hash was created yet. 214713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static inline Object* GetIdentityHash(Isolate* isolate, 214813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSReceiver> object); 21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Retrieves a permanent object identity hash code. May create and store a 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // hash code if needed and none exists. 215213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline static Smi* GetOrCreateIdentityHash(Isolate* isolate, 215313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSReceiver> object); 21543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 [[OwnPropertyKeys]] (modulo return type) 215613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch MUST_USE_RESULT static inline MaybeHandle<FixedArray> OwnPropertyKeys( 215713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSReceiver> object); 2158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2159109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<FixedArray> GetOwnValues( 2160109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<JSReceiver> object, PropertyFilter filter); 2161109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2162109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<FixedArray> GetOwnEntries( 2163109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<JSReceiver> object, PropertyFilter filter); 2164109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 2166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPropertiesOffset = HeapObject::kHeaderSize; 2167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHeaderSize = HeapObject::kHeaderSize + kPointerSize; 21683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool HasProxyInPrototype(Isolate* isolate); 2170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 21723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver); 21733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 21743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 21763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// The JSObject describes real heap allocated JavaScript objects with 21773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// properties. 21783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Note that the map of JSObject changes during execution to enable inline 21793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// caching. 21803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass JSObject: public JSReceiver { 21813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 2182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<JSObject> New( 2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> constructor, Handle<JSReceiver> new_target, 2184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<AllocationSite> site = Handle<AllocationSite>::null()); 2185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Gets global object properties. 2187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline GlobalDictionary* global_dictionary(); 2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Context> GetFunctionRealm(Handle<JSObject> object); 2190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [elements]: The elements (properties with names that are integers). 2192756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // 2193756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // Elements can be in two general modes: fast and slow. Each mode 2194f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // corresponds to a set of object representations of elements that 2195756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // have something in common. 2196756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // 2197756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // In the fast mode elements is a FixedArray and so each element can 2198756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // be quickly accessed. This fact is used in the generated code. The 21993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // elements array can have one of three maps in this mode: 2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // fixed_array_map, sloppy_arguments_elements_map or 22013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // fixed_cow_array_map (for copy-on-write arrays). In the latter case 22023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // the elements array may be shared by a few objects and so before 22033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // writing to any element the array must be copied. Use 22043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // EnsureWritableFastElements in this case. 2205756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // 2206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // In the slow mode the elements is either a NumberDictionary, a 2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // FixedArray parameter map for a (sloppy) arguments object. 220869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DECL_ACCESSORS(elements, FixedArrayBase) 2209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void initialize_elements(); 2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ResetElements(Handle<JSObject> object); 2211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void SetMapAndElements(Handle<JSObject> object, 2212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map, 2213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArrayBase> elements); 2214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline ElementsKind GetElementsKind(); 2215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ElementsAccessor* GetElementsAccessor(); 2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_SMI_ELEMENTS ElementsKind. 2217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFastSmiElements(); 2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_ELEMENTS ElementsKind. 2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFastObjectElements(); 2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_ELEMENTS or 2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FAST_SMI_ONLY_ELEMENTS. 2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFastSmiOrObjectElements(); 2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has any of the fast elements kinds. 2224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasFastElements(); 2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_DOUBLE_ELEMENTS 2226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ElementsKind. 22273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline bool HasFastDoubleElements(); 2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_HOLEY_*_ELEMENTS 2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ElementsKind. 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFastHoleyElements(); 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasSloppyArgumentsElements(); 2232109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool HasStringWrapperElements(); 2233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasDictionaryElements(); 2234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedTypedArrayElements(); 2236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedUint8ClampedElements(); 2238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedArrayElements(); 2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedInt8Elements(); 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedUint8Elements(); 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedInt16Elements(); 2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedUint16Elements(); 2243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedInt32Elements(); 2244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedUint32Elements(); 2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedFloat32Elements(); 2246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedFloat64Elements(); 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasFastArgumentsElements(); 2249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasSlowArgumentsElements(); 2250109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool HasFastStringWrapperElements(); 2251109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool HasSlowStringWrapperElements(); 22523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool HasEnumerableElements(); 22533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2254c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch inline SeededNumberDictionary* element_dictionary(); // Gets slow elements. 2255c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 22563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Requires: HasFastElements(). 22573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static void EnsureWritableFastElements(Handle<JSObject> object); 2258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Collects elements starting at index 0. 2260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Undefined values are placed after non-undefined values. 2261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the number of non-undefined values. 2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Object> PrepareElementsForSort(Handle<JSObject> object, 2263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t limit); 2264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // As PrepareElementsForSort, but only on objects where elements is 2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a dictionary, and it will stay a dictionary. Collates undefined and 2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // unexisting elements below limit from position zero of the elements. 2267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Object> PrepareSlowElementsForSort(Handle<JSObject> object, 2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t limit); 2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyWithInterceptor( 2271109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch LookupIterator* it, ShouldThrow should_throw, Handle<Object> value); 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2273109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // The API currently still wants DefineOwnPropertyIgnoreAttributes to convert 2274109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // AccessorInfo objects to data fields. We allow FORCE_FIELD as an exception 2275109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // to the default behavior that calls the setter. 2276109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch enum AccessorInfoHandling { FORCE_FIELD, DONT_FORCE_FIELD }; 2277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> DefineOwnPropertyIgnoreAttributes( 2279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, 2280109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch AccessorInfoHandling handling = DONT_FORCE_FIELD); 2281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnPropertyIgnoreAttributes( 2283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, 2284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw, 2285109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch AccessorInfoHandling handling = DONT_FORCE_FIELD); 22863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> SetOwnPropertyIgnoreAttributes( 2288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, Handle<Name> name, Handle<Object> value, 2289109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PropertyAttributes attributes); 22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> SetOwnElementIgnoreAttributes( 2292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, uint32_t index, Handle<Object> value, 2293109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PropertyAttributes attributes); 2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Equivalent to one of the above depending on whether |name| can be converted 2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to an array index. 2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> 2298109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DefinePropertyOrElementIgnoreAttributes(Handle<JSObject> object, 2299109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Name> name, 2300109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> value, 2301109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PropertyAttributes attributes = NONE); 2302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Adds or reconfigures a property to attributes NONE. It will fail when it 2304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // cannot. 23053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static Maybe<bool> CreateDataProperty( 23063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LookupIterator* it, Handle<Object> value, 23073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ShouldThrow should_throw = DONT_THROW); 2308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void AddProperty(Handle<JSObject> object, Handle<Name> name, 2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value, PropertyAttributes attributes); 2311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> AddDataElement( 2313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> receiver, uint32_t index, Handle<Object> value, 2314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes, ShouldThrow should_throw); 2315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> AddDataElement( 2316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> receiver, uint32_t index, Handle<Object> value, 2317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 2318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Extend the receiver with a single fast property appeared first in the 2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // passed map. This also extends the property backing store if necessary. 2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map); 2322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Migrates the given object to a map whose field representations are the 2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // lowest upper bound of all known representations for that field. 2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MigrateInstance(Handle<JSObject> instance); 2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Migrates the given object only if the target map is already available, 2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // or returns false if such a map is not yet available. 2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool TryMigrateInstance(Handle<JSObject> instance); 2330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Sets the property value in a normalized object given (key, value, details). 2332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Handles the special representation of JS global objects. 2333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetNormalizedProperty(Handle<JSObject> object, Handle<Name> name, 2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value, 2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyDetails details); 2336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetDictionaryElement(Handle<JSObject> object, uint32_t index, 2337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 2338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 2339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetDictionaryArgumentsElement(Handle<JSObject> object, 2340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t index, 2341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 2342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 2343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void OptimizeAsPrototype(Handle<JSObject> object, 2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrototypeOptimizationMode mode); 2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ReoptimizeIfPrototype(Handle<JSObject> object); 234713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static void MakePrototypesFast(Handle<Object> receiver, 234813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch WhereToStart where_to_start, Isolate* isolate); 2349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void LazyRegisterPrototypeUser(Handle<Map> user, Isolate* isolate); 2350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void UpdatePrototypeUserRegistration(Handle<Map> old_map, 2351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> new_map, 2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate); 2353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool UnregisterPrototypeUser(Handle<Map> user, Isolate* isolate); 2354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InvalidatePrototypeChains(Map* map); 2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2356c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Updates prototype chain tracking information when an object changes its 2357c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // map from |old_map| to |new_map|. 2358c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static void NotifyMapChange(Handle<Map> old_map, Handle<Map> new_map, 2359c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Isolate* isolate); 2360c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Utility used by many Array builtins and runtime functions 2362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline bool PrototypeHasNoElements(Isolate* isolate, JSObject* object); 2363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Alternative implementation of WeakFixedArray::NullCallback. 2365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class PrototypeRegistryCompactionCallback { 2366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 2367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Callback(Object* value, int old_index, int new_index); 2368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Retrieve interceptors. 23713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline InterceptorInfo* GetNamedInterceptor(); 2372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline InterceptorInfo* GetIndexedInterceptor(); 2373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Used from JSReceiver. 2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<PropertyAttributes> 2376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetPropertyAttributesWithInterceptor(LookupIterator* it); 2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<PropertyAttributes> 2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GetPropertyAttributesWithFailedAccessCheck(LookupIterator* it); 2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Defines an AccessorPair property on the given object. 2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(mstarzinger): Rename to SetAccessor(). 2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static MaybeHandle<Object> DefineAccessor(Handle<JSObject> object, 2383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> getter, 2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> setter, 2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttributes attributes); 2387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Object> DefineAccessor(LookupIterator* it, 2388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> getter, 2389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> setter, 2390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Defines an AccessorInfo property on the given object. 2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> SetAccessor( 2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AccessorInfo> info); 2396f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The result must be checked first for exceptions. If there's no exception, 2398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the output parameter |done| indicates whether the interceptor has a result 2399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or not. 2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithInterceptor( 2401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, bool* done); 2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void ValidateElements(Handle<JSObject> object); 24043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Makes sure that this object can contain HeapObject as elements. 2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void EnsureCanContainHeapObjectElements(Handle<JSObject> obj); 24073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Makes sure that this object can contain the specified elements. 2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void EnsureCanContainElements( 2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 24113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object** elements, 24123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t count, 24133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EnsureElementsMode mode); 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void EnsureCanContainElements( 2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArrayBase> elements, 2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t length, 24183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EnsureElementsMode mode); 2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void EnsureCanContainElements( 2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 24213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Arguments* arguments, 24223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t first_arg, 24233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t arg_count, 24243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EnsureElementsMode mode); 2425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Would we convert a fast elements array to dictionary mode given 2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // an access at key? 2428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool WouldConvertToSlowElements(uint32_t index); 2429402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 2430e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Computes the new capacity when expanding the elements of a JSObject. 2431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static uint32_t NewElementsCapacity(uint32_t old_capacity) { 2432e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // (old_capacity + 50%) + 16 2433e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return old_capacity + (old_capacity >> 1) + 16; 2434e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2435e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // These methods do not perform access checks! 2437f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch template <AllocationSiteUpdateMode update_or_check = 2438f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AllocationSiteUpdateMode::kUpdate> 2439f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static bool UpdateAllocationSite(Handle<JSObject> object, 2440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ElementsKind to_kind); 2441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Lookup interceptors are used for handling properties controlled by host 2443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // objects. 2444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasNamedInterceptor(); 2445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasIndexedInterceptor(); 2446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Support functions for v8 api (needed for correct interceptor behavior). 2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<bool> HasRealNamedProperty( 2449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, Handle<Name> name); 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<bool> HasRealElementProperty( 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, uint32_t index); 2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<bool> HasRealNamedCallbackProperty( 2453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, Handle<Name> name); 2454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the header size for a JSObject. Used to compute the index of 2456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // internal fields as well as the number of internal fields. 2457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int GetHeaderSize(InstanceType instance_type); 2458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int GetHeaderSize(); 2459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int GetInternalFieldCount(Map* map); 2461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int GetInternalFieldCount(); 246244f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline int GetInternalFieldOffset(int index); 2463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* GetInternalField(int index); 2464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SetInternalField(int index, Object* value); 24653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void SetInternalField(int index, Smi* value); 2466bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool WasConstructedFromApiFunction(); 24673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 24683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns a new map with all transitions dropped from the object's current 24693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // map and the ElementsKind set. 24703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static Handle<Map> GetElementsTransitionMap(Handle<JSObject> object, 24713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind to_kind); 2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void TransitionElementsKind(Handle<JSObject> object, 2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind); 2474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Always use this to migrate an object to a new map. 2476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // |expected_additional_properties| is only used for fast-to-slow transitions 2477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and ignored otherwise. 2478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void MigrateToMap(Handle<JSObject> object, Handle<Map> new_map, 2479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_additional_properties = 0); 2480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2481f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Forces a prototype without any of the checks that the regular SetPrototype 2482f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // would do. 2483f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void ForceSetPrototype(Handle<JSObject> object, Handle<Object> proto); 2484f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert the object to use the canonical dictionary 2486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // representation. If the object is expected to have additional properties 2487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // added this number can be indicated to have the backing store allocated to 2488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // an initial capacity for holding these properties. 24893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static void NormalizeProperties(Handle<JSObject> object, 24903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PropertyNormalizationMode mode, 2491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int expected_additional_properties, 2492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* reason); 24933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Convert and update the elements backing store to be a 24953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // SeededNumberDictionary dictionary. Returns the backing after conversion. 24963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static Handle<SeededNumberDictionary> NormalizeElements( 24973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSObject> object); 24983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RequireSlowElements(SeededNumberDictionary* dictionary); 2500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Transform slow named properties to fast variants. 2502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MigrateSlowToFast(Handle<JSObject> object, 2503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int unused_property_fields, const char* reason); 2504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool IsUnboxedDoubleField(FieldIndex index); 2506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Access fast-case object properties at index. 2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Object> FastPropertyAt(Handle<JSObject> object, 2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation, 2510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FieldIndex index); 2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* RawFastPropertyAt(FieldIndex index); 2512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline double RawFastDoublePropertyAt(FieldIndex index); 2513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void FastPropertyAtPut(FieldIndex index, Object* value); 2515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void RawFastPropertyAtPut(FieldIndex index, Object* value); 2516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void RawFastDoublePropertyAtPut(FieldIndex index, double value); 2517109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline void WriteToField(int descriptor, PropertyDetails details, 2518109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Object* value); 2519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void WriteToField(int descriptor, Object* value); 2520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Access to in object properties. 252244f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline int GetInObjectPropertyOffset(int index); 2523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* InObjectPropertyAt(int index); 2524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* InObjectPropertyAtPut(int index, 2525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value, 2526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode 2527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block = UPDATE_WRITE_BARRIER); 2528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the object's prototype (only JSReceiver and null are allowed values). 2530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPrototype(Handle<JSObject> object, 2531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 2532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool from_javascript, 2533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Makes the object prototype immutable 2536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Never called from JavaScript 2537f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void SetImmutableProto(Handle<JSObject> object); 2538f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Initializes the body starting at |start_offset|. It is responsibility of 2540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the caller to initialize object header. Fill the pre-allocated fields with 25413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // pre_allocated_value and the rest with filler_value. 25423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Note: this call does not update write barrier, the caller is responsible 25433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // to ensure that |filler_value| can be collected without WB here. 2544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void InitializeBody(Map* map, int start_offset, 2545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* pre_allocated_value, Object* filler_value); 2546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check whether this object references another object 2548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool ReferencesObject(Object* obj); 2549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> PreventExtensions( 2551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, ShouldThrow should_throw); 2552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsExtensible(Handle<JSObject> object); 25548defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy object. 2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum DeepCopyHints { kNoHints = 0, kObjectIsShallow = 1 }; 2557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<JSObject> DeepCopy( 2559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 2560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSiteUsageContext* site_context, 2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeepCopyHints hints = kNoHints); 2562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<JSObject> DeepWalk( 2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 2564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSiteCreationContext* site_context); 2565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSObject) 25678defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 2569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void JSObjectShortPrint(StringStream* accumulator); 2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSObject) 2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSObject) 2572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef OBJECT_PRINT 2573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintProperties(std::ostream& os); // NOLINT 2574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintElements(std::ostream& os); // NOLINT 2575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 2576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if defined(DEBUG) || defined(OBJECT_PRINT) 2577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintTransitions(std::ostream& os); // NOLINT 2578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void PrintElementsTransition( 2581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file, Handle<JSObject> object, 2582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind from_kind, Handle<FixedArrayBase> from_elements, 2583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind, Handle<FixedArrayBase> to_elements); 2584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void PrintInstanceMigration(FILE* file, Map* original_map, Map* new_map); 25863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 2588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Structure for collecting spill information about JSObjects. 2589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block class SpillInformation { 2590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Clear(); 2592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Print(); 2593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_objects_; 2594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_objects_with_fast_properties_; 2595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_objects_with_fast_elements_; 2596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_fast_used_fields_; 2597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_fast_unused_fields_; 2598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_slow_used_properties_; 2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_slow_unused_properties_; 2600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_fast_used_elements_; 2601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_fast_unused_elements_; 2602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_slow_used_elements_; 2603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_slow_unused_elements_; 2604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 2605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void IncrementSpillStatistics(SpillInformation* info); 2607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If a GC was caused while constructing this object, the elements pointer 2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // may point to a one pointer filler map. The object won't be rooted, but 2612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // our heap verification code could stumble across it. 2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ElementsAreSafeToExamine(); 2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 26158defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* SlowReverseLookup(Object* value); 2617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximal number of elements (numbered 0 .. kMaxElementCount - 1). 2619e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Also maximal value of JSArray's length property. 2620e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const uint32_t kMaxElementCount = 0xffffffffu; 2621e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 262269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Constants for heuristics controlling conversion of fast elements 262369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // to slow elements. 262469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 262569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Maximal gap that can be introduced by adding an element beyond 262669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // the current elements length. 2627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kMaxGap = 1024; 262869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 262969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Maximal length of fast elements array that won't be checked for 263069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // being dense enough on expansion. 263169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kMaxUncheckedFastElementsLength = 5000; 263269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 263369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Same as above but for old arrays. This limit is more strict. We 263469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // don't want to be wasteful with long lived objects. 263569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kMaxUncheckedOldFastElementsLength = 500; 263669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This constant applies only to the initial map of "global.Object" and 2638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // not to arbitrary other JSObject maps. 2639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInitialGlobalObjectUnusedPropertiesCount = 4; 2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxInstanceSize = 255 * kPointerSize; 2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // When extending the backing storage for property values, we increase 2643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // its size by more than the 1 entry necessary, so sequentially adding fields 2644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to the same object requires fewer allocations and copies. 2645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kFieldsAdded = 3; 2646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 2648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kElementsOffset = JSReceiver::kHeaderSize; 2649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeaderSize = kElementsOffset + kPointerSize; 2650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize); 2652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef FlexibleBodyDescriptor<JSReceiver::kPropertiesOffset> BodyDescriptor; 2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Gets the number of currently used elements. 2656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int GetFastElementsUsage(); 2657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool AllCanRead(LookupIterator* it); 2659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool AllCanWrite(LookupIterator* it); 2660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class JSReceiver; 2663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Object; 266469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Used from Object::GetProperty(). 2666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithFailedAccessCheck( 2667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LookupIterator* it); 2668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyWithFailedAccessCheck( 2670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, ShouldThrow should_throw); 2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeletePropertyWithInterceptor( 2673109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch LookupIterator* it, ShouldThrow should_throw); 26743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 26753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool ReferencesObjectFromElements(FixedArray* elements, 26763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ElementsKind kind, 26773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Object* object); 2678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 267913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Object* GetIdentityHash(Isolate* isolate, Handle<JSObject> object); 2680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 268113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Smi* GetOrCreateIdentityHash(Isolate* isolate, 268213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSObject> object); 26833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Helper for fast versions of preventExtensions, seal, and freeze. 2685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // attrs is one of NONE, SEALED, or FROZEN (depending on the operation). 2686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier template <PropertyAttributes attrs> 2687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> PreventExtensionsWithTransition( 2688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, ShouldThrow should_throw); 2689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); 2691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2694109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSAccessorPropertyDescriptor is just a JSObject with a specific initial 2695109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// map. This initial map adds in-object properties for "get", "set", 2696109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// "enumerable" and "configurable" properties, as assigned by the 2697109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// FromPropertyDescriptor function for regular accessor properties. 2698109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSAccessorPropertyDescriptor: public JSObject { 2699109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2700109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2701109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kGetOffset = JSObject::kHeaderSize; 2702109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSetOffset = kGetOffset + kPointerSize; 2703109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kEnumerableOffset = kSetOffset + kPointerSize; 2704109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConfigurableOffset = kEnumerableOffset + kPointerSize; 2705109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kConfigurableOffset + kPointerSize; 2706109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2707109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kGetIndex = 0; 2708109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSetIndex = 1; 2709109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kEnumerableIndex = 2; 2710109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConfigurableIndex = 3; 2711109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2712109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2713109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSAccessorPropertyDescriptor); 2714109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2715109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2716109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2717109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSDataPropertyDescriptor is just a JSObject with a specific initial map. 2718109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This initial map adds in-object properties for "value", "writable", 2719109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// "enumerable" and "configurable" properties, as assigned by the 2720109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// FromPropertyDescriptor function for regular data properties. 2721109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSDataPropertyDescriptor: public JSObject { 2722109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2723109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2724109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kValueOffset = JSObject::kHeaderSize; 2725109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kWritableOffset = kValueOffset + kPointerSize; 2726109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kEnumerableOffset = kWritableOffset + kPointerSize; 2727109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConfigurableOffset = kEnumerableOffset + kPointerSize; 2728109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kConfigurableOffset + kPointerSize; 2729109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2730109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kValueIndex = 0; 2731109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kWritableIndex = 1; 2732109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kEnumerableIndex = 2; 2733109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConfigurableIndex = 3; 2734109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2735109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2736109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSDataPropertyDescriptor); 2737109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2738109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2739109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2740109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSIteratorResult is just a JSObject with a specific initial map. 2741109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This initial map adds in-object properties for "done" and "value", 2742109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// as specified by ES6 section 25.1.1.3 The IteratorResult Interface 2743109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSIteratorResult: public JSObject { 2744109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2745f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(value, Object) 2746f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2747f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(done, Object) 2748f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2749109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2750109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kValueOffset = JSObject::kHeaderSize; 2751109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kDoneOffset = kValueOffset + kPointerSize; 2752109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kDoneOffset + kPointerSize; 2753109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2754109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kValueIndex = 0; 2755109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kDoneIndex = 1; 2756109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2757109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2758109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSIteratorResult); 2759109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2760109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2761109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2762109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Common superclass for JSSloppyArgumentsObject and JSStrictArgumentsObject. 2763109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSArgumentsObject: public JSObject { 2764109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2765109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2766109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kLengthOffset = JSObject::kHeaderSize; 2767109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kHeaderSize = kLengthOffset + kPointerSize; 2768109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2769109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kLengthIndex = 0; 2770109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2771109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2772109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSArgumentsObject); 2773109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2774109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2775109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2776109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSSloppyArgumentsObject is just a JSObject with specific initial map. 2777109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This initial map adds in-object properties for "length" and "callee". 2778109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSSloppyArgumentsObject: public JSArgumentsObject { 2779109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2780109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2781109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kCalleeOffset = JSArgumentsObject::kHeaderSize; 2782109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kCalleeOffset + kPointerSize; 2783109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2784109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kCalleeIndex = 1; 2785109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2786109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2787109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSSloppyArgumentsObject); 2788109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2789109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2790109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2791109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSStrictArgumentsObject is just a JSObject with specific initial map. 2792109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This initial map adds an in-object property for "length". 2793109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSStrictArgumentsObject: public JSArgumentsObject { 2794109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2795109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2796109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = JSArgumentsObject::kHeaderSize; 2797109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2798109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2799109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSStrictArgumentsObject); 2800109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2801109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2802109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 28033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Common superclass for FixedArrays that allow implementations to share 28043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// common accessors and some code paths. 28053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass FixedArrayBase: public HeapObject { 2806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [length]: length of the array. 2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int length() const; 2809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_length(int value); 2810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get and set the length using acquire loads and release stores. 2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int synchronized_length() const; 2813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_length(int value); 2814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedArrayBase) 28163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2817f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int GetMaxLengthForNewSpaceAllocation(ElementsKind kind); 2818f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 28193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Layout description. 28203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Length is smi tagged when it is stored. 28213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int kLengthOffset = HeapObject::kHeaderSize; 28223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int kHeaderSize = kLengthOffset + kPointerSize; 28233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 28243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 282669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass FixedDoubleArray; 2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass IncrementalMarking; 2828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 282969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 28303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// FixedArray describes fixed-sized arrays with element type Object*. 28313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass FixedArray: public FixedArrayBase { 28323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 2833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setter and getter for elements. 2834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Object* get(int index) const; 2835109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline Handle<Object> get(FixedArray* array, int index, 2836109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate); 2837f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <class T> 2838f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MaybeHandle<T> GetValue(Isolate* isolate, int index) const; 2839f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2840f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <class T> 2841f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<T> GetValueChecked(Isolate* isolate, int index) const; 2842f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2843f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Return a grown copy if the index is bigger than the array's length. 2844f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<FixedArray> SetAndGrow(Handle<FixedArray> array, int index, 2845f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> value); 2846f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setter that uses write barrier. 2848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, Object* value); 2849c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool is_the_hole(Isolate* isolate, int index); 2850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Setter that doesn't need write barrier. 2852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, Smi* value); 2853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setter with explicit barrier mode. 2854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, Object* value, WriteBarrierMode mode); 2855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setters for frequently used oddballs located in old space. 2857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_undefined(int index); 2858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_null(int index); 2859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_the_hole(int index); 2860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetFirstElementAddress(); 2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool ContainsOnlySmisOrHoles(); 2863756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 28646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Gives access to raw memory which stores the array's data. 28656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline Object** data_start(); 28666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void FillWithHoles(int from, int to); 2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shrink length and insert filler objects. 2870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Shrink(int length); 28713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Copy a sub array from the receiver to dest. 2873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void CopyTo(int pos, FixedArray* dest, int dest_pos, int len); 2874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. 2876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int SizeFor(int length) { return kHeaderSize + length * kPointerSize; } 2877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code Generation support. 2879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int OffsetOfElementAt(int index) { return SizeFor(index); } 2880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Garbage collection support. 2882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object** RawFieldOfElementAt(int index); 2883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedArray) 2885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2886e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Maximal allowed size, in bytes, of a single FixedArray. 2887e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Prevents overflowing size computations, as well as extreme memory 2888e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // consumption. 2889692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch static const int kMaxSize = 128 * MB * kPointerSize; 2890e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Maximally allowed length of a FixedArray. 2891e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize; 2892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 2894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(FixedArray) 2895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(FixedArray) 2896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 2897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Checks if two FixedArrays have identical contents. 2898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool IsEqualTo(FixedArray* other); 2899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Swap two elements in a pair of arrays. If this array and the 2902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // numbers array are the same object, the elements are only swapped 2903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // once. 2904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void SwapPairs(FixedArray* numbers, int i, int j); 2905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Sort prefix of this array and the numbers array as pairs wrt. the 2907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // numbers. If the numbers array and the this array are the same 2908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // object, the prefix of this array is sorted. 2909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void SortPairs(FixedArray* numbers, uint32_t len); 2910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef FlexibleBodyDescriptor<kHeaderSize> BodyDescriptor; 2912756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 29144515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // Set operation on FixedArray without using write barriers. Can 29154515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // only be used for storing old space objects or smis. 29163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static inline void NoWriteBarrierSet(FixedArray* array, 29173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index, 29183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* value); 29193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kHeaderSize == Internals::kFixedArrayHeaderSize); 2922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(FixedArray); 2924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// FixedDoubleArray describes fixed-sized arrays with element type double. 29283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass FixedDoubleArray: public FixedArrayBase { 29293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 29303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Setter and getter for elements. 293169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline double get_scalar(int index); 2932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint64_t get_representation(int index); 2933109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline Handle<Object> get(FixedDoubleArray* array, int index, 2934109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate); 29353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline void set(int index, double value); 29363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline void set_the_hole(int index); 29373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 29383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Checking for the hole. 2939c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool is_the_hole(Isolate* isolate, int index); 29403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline bool is_the_hole(int index); 29413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 29423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Garbage collection support. 29433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline static int SizeFor(int length) { 29443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return kHeaderSize + length * kDoubleSize; 29453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 29463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Gives access to raw memory which stores the array's data. 2948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline double* data_start(); 2949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void FillWithHoles(int from, int to); 2951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 29523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Code Generation support. 29533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static int OffsetOfElementAt(int index) { return SizeFor(index); } 29543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedDoubleArray) 29563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 29573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Maximal allowed size, in bytes, of a single FixedDoubleArray. 29583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Prevents overflowing size computations, as well as extreme memory 29593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // consumption. 29603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int kMaxSize = 512 * MB; 29613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Maximally allowed length of a FixedArray. 29623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize; 29633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 29643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Dispatched behavior. 2965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(FixedDoubleArray) 2966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(FixedDoubleArray) 29673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 29683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 29693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray); 29703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 29713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 29723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass WeakFixedArray : public FixedArray { 2974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // If |maybe_array| is not a WeakFixedArray, a fresh one will be allocated. 2976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This function does not check if the value exists already, callers must 2977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ensure this themselves if necessary. 2978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<WeakFixedArray> Add(Handle<Object> maybe_array, 2979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapObject> value, 2980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int* assigned_index = NULL); 2981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if an entry was found and removed. 2983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Remove(Handle<HeapObject> value); 2984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class NullCallback { 2986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 2987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Callback(Object* value, int old_index, int new_index) {} 2988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 2989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class CompactionCallback> 2991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Compact(); 2992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Object* Get(int index) const; 2994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Clear(int index); 2995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline int Length() const; 2996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsEmptySlot(int index) const; 2998c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Object* Empty() { return Smi::kZero; } 2999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class Iterator { 3001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit Iterator(Object* maybe_array) : list_(NULL) { Reset(maybe_array); } 3003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Reset(Object* maybe_array); 3004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class T> 3006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline T* Next(); 3007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 3009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int index_; 3010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakFixedArray* list_; 3011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef DEBUG 3012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int last_used_index_; 3013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DisallowHeapAllocation no_gc_; 3014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // DEBUG 3015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_COPY_AND_ASSIGN(Iterator); 3016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 3017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CAST(WeakFixedArray) 3019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 3021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLastUsedIndexIndex = 0; 3022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kFirstIndex = 1; 3023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<WeakFixedArray> Allocate( 3025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate, int size, Handle<WeakFixedArray> initialize_from); 3026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void Set(Handle<WeakFixedArray> array, int index, 3028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<HeapObject> value); 3029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void clear(int index); 3030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline int last_used_index() const; 3032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_last_used_index(int index); 3033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Disallow inherited setters. 3035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set(int index, Smi* value); 3036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set(int index, Object* value); 3037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set(int index, Object* value, WriteBarrierMode mode); 3038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DISALLOW_IMPLICIT_CONSTRUCTORS(WeakFixedArray); 3039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 3040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Generic array grows dynamically with O(1) amortized insertion. 3042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ArrayList : public FixedArray { 3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum AddMode { 3045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone, 3046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Use this if GC can delete elements from the array. 3047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kReloadLengthAfterAllocation, 3048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 3049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ArrayList> Add(Handle<ArrayList> array, Handle<Object> obj, 3050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AddMode mode = kNone); 3051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ArrayList> Add(Handle<ArrayList> array, Handle<Object> obj1, 3052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> obj2, AddMode = kNone); 3053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int Length(); 3054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetLength(int length); 3055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* Get(int index); 3056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object** Slot(int index); 3057f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void Set(int index, Object* obj, 3058f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 3059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Clear(int index, Object* undefined); 3060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsFull(); 3061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(ArrayList) 3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ArrayList> EnsureSpace(Handle<ArrayList> array, int length); 3065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kLengthIndex = 0; 3066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFirstIndex = 1; 3067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ArrayList); 3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 30693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3070c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// The property RegExpMatchInfo includes the matchIndices 3071c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// array of the last successful regexp match (an array of start/end index 3072c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// pairs for the match and all the captured substrings), the invariant is 3073c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// that there are at least two capture indices. The array also contains 3074c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// the subject string for the last successful match. 3075c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// After creation the result must be treated as a FixedArray in all regards. 3076c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass V8_EXPORT_PRIVATE RegExpMatchInfo : NON_EXPORTED_BASE(public FixedArray) { 3077c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 3078c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns the number of captures, which is defined as the length of the 3079c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // matchIndices objects of the last match. matchIndices contains two indices 3080c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // for each capture (including the match itself), i.e. 2 * #captures + 2. 3081c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline int NumberOfCaptureRegisters(); 3082c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void SetNumberOfCaptureRegisters(int value); 3083c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3084c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns the subject string of the last match. 3085c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline String* LastSubject(); 3086c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void SetLastSubject(String* value); 3087c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3088c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Like LastSubject, but modifiable by the user. 3089c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline Object* LastInput(); 3090c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void SetLastInput(Object* value); 3091c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3092c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns the i'th capture index, 0 <= i < NumberOfCaptures(). Capture(0) and 3093c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Capture(1) determine the start- and endpoint of the match itself. 3094c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline int Capture(int i); 3095c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void SetCapture(int i, int value); 3096c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3097c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Reserves space for captures. 3098c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<RegExpMatchInfo> ReserveCaptures( 3099c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<RegExpMatchInfo> match_info, int capture_count); 3100c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3101c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(RegExpMatchInfo) 3102c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3103c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNumberOfCapturesIndex = 0; 3104c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kLastSubjectIndex = 1; 3105c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kLastInputIndex = 2; 3106c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kFirstCaptureIndex = 3; 3107c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kLastMatchOverhead = kFirstCaptureIndex; 3108c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3109c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNumberOfCapturesOffset = FixedArray::kHeaderSize; 3110c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kLastSubjectOffset = kNumberOfCapturesOffset + kPointerSize; 3111c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kLastInputOffset = kLastSubjectOffset + kPointerSize; 3112c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kFirstCaptureOffset = kLastInputOffset + kPointerSize; 3113c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3114c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Every match info is guaranteed to have enough space to store two captures. 3115c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kInitialCaptureIndices = 2; 3116c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3117c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 3118c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(RegExpMatchInfo); 3119c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 3120c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3121f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define FRAME_ARRAY_FIELD_LIST(V) \ 3122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(WasmInstance, Object) \ 3123f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(WasmFunctionIndex, Smi) \ 3124f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Receiver, Object) \ 3125f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Function, JSFunction) \ 3126f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Code, AbstractCode) \ 3127f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Offset, Smi) \ 3128f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Flags, Smi) 3129f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3130f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Container object for data collected during simple stack trace captures. 3131f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass FrameArray : public FixedArray { 3132f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 3133f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define DECLARE_FRAME_ARRAY_ACCESSORS(name, type) \ 3134f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline type* name(int frame_ix) const; \ 3135f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline void Set##name(int frame_ix, type* value); 3136f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch FRAME_ARRAY_FIELD_LIST(DECLARE_FRAME_ARRAY_ACCESSORS) 3137f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef DECLARE_FRAME_ARRAY_ACCESSORS 3138f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3139f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline bool IsWasmFrame(int frame_ix) const; 3140c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool IsAsmJsWasmFrame(int frame_ix) const; 3141f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline int FrameCount() const; 3142f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3143f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void ShrinkToFit(); 3144f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3145f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Flags. 3146f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kIsWasmFrame = 1 << 0; 3147c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIsAsmJsWasmFrame = 1 << 1; 3148c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIsStrict = 1 << 2; 3149c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kForceConstructor = 1 << 3; 3150f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3151f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Handle<FrameArray> AppendJSFrame(Handle<FrameArray> in, 3152f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> receiver, 3153f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSFunction> function, 3154f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<AbstractCode> code, int offset, 3155f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int flags); 3156f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Handle<FrameArray> AppendWasmFrame(Handle<FrameArray> in, 3157c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> wasm_instance, 3158f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int wasm_function_index, 3159f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<AbstractCode> code, 3160f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int offset, int flags); 3161f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3162f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_CAST(FrameArray) 3163f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3164f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 3165f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The underlying fixed array embodies a captured stack trace. Frame i 3166f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // occupies indices 3167f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 3168f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // kFirstIndex + 1 + [i * kElementsPerFrame, (i + 1) * kElementsPerFrame[, 3169f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 3170f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // with internal offsets as below: 3171f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3172c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kWasmInstanceOffset = 0; 3173f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kWasmFunctionIndexOffset = 1; 3174f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3175f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kReceiverOffset = 0; 3176f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFunctionOffset = 1; 3177f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3178f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kCodeOffset = 2; 3179f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kOffsetOffset = 3; 3180f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3181f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFlagsOffset = 4; 3182f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3183f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kElementsPerFrame = 5; 3184f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3185f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Array layout indices. 3186f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3187f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFrameCountIndex = 0; 3188f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFirstIndex = 1; 3189f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3190f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static int LengthFor(int frame_count) { 3191f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return kFirstIndex + frame_count * kElementsPerFrame; 3192f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 3193f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3194f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Handle<FrameArray> EnsureSpace(Handle<FrameArray> array, int length); 3195f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3196f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch friend class Factory; 3197f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FrameArray); 3198f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 31993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DescriptorArrays are fixed arrays used to hold instance descriptors. 3201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The format of the these objects is: 3202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [0]: Number of descriptors 3203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [1]: Either Smi(0) if uninitialized, or a pointer to small fixed array: 3204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [0]: pointer to fixed array with enum cache 3205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [1]: either Smi(0) or pointer to fixed array with indices 3206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [2]: first key 3207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [2 + number of descriptors * kDescriptorSize]: start of slack 3208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass DescriptorArray: public FixedArray { 3209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Returns true for both shared empty_descriptor_array and for smis, which the 3211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // map uses to encode additional bit fields when the descriptor array is not 3212257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // yet used. 3213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsEmpty(); 3214e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 3215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the number of descriptors in the array. 3216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int number_of_descriptors(); 3217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int number_of_descriptors_storage(); 3219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int NumberOfSlackDescriptors(); 3221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetNumberOfDescriptors(int number_of_descriptors); 3223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int number_of_entries(); 3224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasEnumCache(); 3226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void CopyEnumCacheFrom(DescriptorArray* array); 3228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline FixedArray* GetEnumCache(); 3230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasEnumIndicesCache(); 3232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline FixedArray* GetEnumIndicesCache(); 3234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object** GetEnumCacheSlot(); 3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClearEnumCache(); 3238257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Initialize or change the enum cache, 3240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // using the supplied storage for the small "bridge". 3241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetEnumCache(Handle<DescriptorArray> descriptors, 3242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<FixedArray> new_cache, 3243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> new_index_cache); 3244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Accessors for fetching instance descriptor at descriptor number. 3246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Name* GetKey(int descriptor_number); 3247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetKeySlot(int descriptor_number); 3248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* GetValue(int descriptor_number); 3249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetValue(int descriptor_number, Object* value); 3250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetValueSlot(int descriptor_number); 3251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int GetValueOffset(int descriptor_number); 3252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetDescriptorStartSlot(int descriptor_number); 3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetDescriptorEndSlot(int descriptor_number); 3254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline PropertyDetails GetDetails(int descriptor_number); 3255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline PropertyType GetType(int descriptor_number); 3256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int GetFieldIndex(int descriptor_number); 3257109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch FieldType* GetFieldType(int descriptor_number); 3258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* GetConstant(int descriptor_number); 3259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* GetCallbacksObject(int descriptor_number); 3260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline AccessorDescriptor* GetCallbacks(int descriptor_number); 32613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Name* GetSortedKey(int descriptor_number); 3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int GetSortedKeyIndex(int descriptor_number); 3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetSortedKey(int pointer, int descriptor_number); 3265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetRepresentation(int descriptor_number, 3266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation); 32673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Accessor for complete descriptor. 3269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void Get(int descriptor_number, Descriptor* desc); 3270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Set(int descriptor_number, Descriptor* desc); 3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Replace(int descriptor_number, Descriptor* descriptor); 32723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Append automatically sets the enumeration index. This should only be used 3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to add descriptors in bulk at the end, followed by sorting the descriptor 3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // array. 3276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Append(Descriptor* desc); 32773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<DescriptorArray> CopyUpTo(Handle<DescriptorArray> desc, 3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int enumeration_index, 3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slack = 0); 3281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<DescriptorArray> CopyUpToAddAttributes( 3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<DescriptorArray> desc, 3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int enumeration_index, 3285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttributes attributes, 3286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slack = 0); 32870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 32880d5e116f6aee03185f237311a943491bb079a768Kristian Monsen // Sort the instance descriptors by the hash codes of their keys. 3289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Sort(); 3290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Search the instance descriptors for given name. 3292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(int Search(Name* name, int number_of_own_descriptors)); 3293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3294756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // As the above, but uses DescriptorLookupCache and updates it when 3295756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // necessary. 3296109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch INLINE(int SearchWithCache(Isolate* isolate, Name* name, Map* map)); 3297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsEqualUpTo(DescriptorArray* desc, int nof_descriptors); 3299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Allocates a DescriptorArray, but returns the singleton 3301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // empty descriptor array object if number_of_descriptors is 0. 3302109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static Handle<DescriptorArray> Allocate( 3303109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, int number_of_descriptors, int slack, 3304109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PretenureFlag pretenure = NOT_TENURED); 3305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DescriptorArray) 3307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Constant for denoting key was not found. 3309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNotFound = -1; 3310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorLengthIndex = 0; 3312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheIndex = 1; 3313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFirstIndex = 2; 3314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The length of the "bridge" to the enum cache. 3316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheBridgeLength = 2; 3317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheBridgeCacheIndex = 0; 3318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheBridgeIndicesCacheIndex = 1; 3319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 3321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorLengthOffset = FixedArray::kHeaderSize; 3322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheOffset = kDescriptorLengthOffset + kPointerSize; 3323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFirstOffset = kEnumCacheOffset + kPointerSize; 3324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description for the bridge array. 3326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheBridgeCacheOffset = FixedArray::kHeaderSize; 3327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout of descriptor. 3329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorKey = 0; 3330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorDetails = 1; 3331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorValue = 2; 3332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorSize = 3; 3333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if defined(DEBUG) || defined(OBJECT_PRINT) 3335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // For our gdb macros, we should perhaps change these in the future. 3336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print(); 3337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Print all the descriptors. 3339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintDescriptors(std::ostream& os); // NOLINT 3340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 3341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 3343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Is the descriptor array sorted and without duplicates? 3344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSortedNoDuplicates(int valid_descriptors = -1); 3345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Is the descriptor array consistent with the back pointers in targets? 3347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsConsistentWithBackPointers(Map* current_map); 3348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Are two DescriptorArrays equal? 3350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool IsEqualTo(DescriptorArray* other); 3351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 3352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the fixed array length required to hold number_of_descriptors 3354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // descriptors. 3355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int LengthFor(int number_of_descriptors) { 3356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ToKeyIndex(number_of_descriptors); 3357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 33593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static int ToDetailsIndex(int descriptor_number) { 33603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return kFirstIndex + (descriptor_number * kDescriptorSize) + 33613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch kDescriptorDetails; 33623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 33633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 33643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Conversion from descriptor number to array indices. 33653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static int ToKeyIndex(int descriptor_number) { 33663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return kFirstIndex + (descriptor_number * kDescriptorSize) + kDescriptorKey; 33673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 33683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3369bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static int ToValueIndex(int descriptor_number) { 3370bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return kFirstIndex + (descriptor_number * kDescriptorSize) + 3371bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kDescriptorValue; 3372bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 3373bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 3374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 33753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // An entry in a DescriptorArray, represented as an (array, index) pair. 33763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch class Entry { 33773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 33783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline explicit Entry(DescriptorArray* descs, int index) : 33793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch descs_(descs), index_(index) { } 33803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline PropertyType type(); 3382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* GetCallbackObject(); 33833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 33853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DescriptorArray* descs_; 33863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index_; 33873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 33883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Transfer a complete descriptor from the src descriptor array to this 3390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // descriptor array. 3391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CopyFrom(int index, DescriptorArray* src); 3392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetDescriptor(int descriptor_number, Descriptor* desc); 3394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Swap first and second descriptor. 3396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SwapSortedKeys(int first, int second); 3397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(DescriptorArray); 3399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SearchMode { ALL_ENTRIES, VALID_ENTRIES }; 3403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <SearchMode search_mode, typename T> 3405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierinline int Search(T* array, Name* name, int valid_entries = 0, 3406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int* out_insertion_index = NULL); 3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HashTable is a subclass of FixedArray that implements a hash table 3410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// that uses open addressing and quadratic probing. 3411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 3412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// In order for the quadratic probing to work, elements that have not 3413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// yet been used and elements that have been deleted are 3414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// distinguished. Probing continues when deleted elements are 3415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// encountered and stops when unused elements are encountered. 3416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 3417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Elements with key == undefined have not been used yet. 34183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// - Elements with key == the_hole have been deleted. 3419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 3420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The hash table class is parameterized with a Shape and a Key. 3421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Shape must be a class with the following interface: 3422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// class ExampleShape { 3423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// public: 3424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // Tells whether key matches other. 3425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static bool IsMatch(Key key, Object* other); 3426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // Returns the hash value for key. 3427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static uint32_t Hash(Key key); 3428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // Returns the hash value for object. 3429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static uint32_t HashForObject(Key key, Object* object); 3430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // Convert key to an object. 3431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// static inline Handle<Object> AsHandle(Isolate* isolate, Key key); 3432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // The prefix size indicates number of elements in the beginning 3433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // of the backing storage. 3434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static const int kPrefixSize = ..; 3435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // The Element size indicates number of elements per entry. 3436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static const int kEntrySize = ..; 3437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// }; 34383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// The prefix size indicates an amount of memory in the 3439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// beginning of the backing storage that can be used for non-element 3440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// information by subclasses. 3441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3442c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochtemplate<typename Key> 3443c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass BaseShape { 3444c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch public: 3445c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const bool UsesSeed = false; 3446c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static uint32_t Hash(Key key) { return 0; } 3447c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static uint32_t SeededHash(Key key, uint32_t seed) { 3448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(UsesSeed); 3449c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return Hash(key); 3450c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch } 3451c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static uint32_t HashForObject(Key key, Object* object) { return 0; } 3452c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static uint32_t SeededHashForObject(Key key, uint32_t seed, Object* object) { 3453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(UsesSeed); 3454c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return HashForObject(key, object); 3455c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch } 3456f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline Map* GetMap(Isolate* isolate); 3457c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 3458c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3459c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass HashTableBase : public FixedArray { 3461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 34623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Returns the number of elements in the hash table. 3463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int NumberOfElements(); 3464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3465e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Returns the number of deleted elements in the hash table. 3466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int NumberOfDeletedElements(); 3467e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 34683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Returns the capacity of the hash table. 3469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int Capacity(); 3470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ElementAdded should be called whenever an element is added to a 34723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // hash table. 3473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void ElementAdded(); 3474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ElementRemoved should be called whenever an element is removed from 34763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // a hash table. 3477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void ElementRemoved(); 3478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void ElementsRemoved(int n); 3479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 348069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Computes the required capacity for a table holding the given 348169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // number of elements. May be more than HashTable::kMaxCapacity. 3482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int ComputeCapacity(int at_least_space_for); 3483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 34843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Tells whether k is a real key. The hole and undefined are not allowed 3485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // as keys and can be used to indicate missing or deleted elements. 3486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsKey(Object* k); 348713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool IsKey(Isolate* isolate, Object* k); 3488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Compute the probe offset (quadratic probing). 3490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block INLINE(static uint32_t GetProbeOffset(uint32_t n)) { 3491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (n + n * n) >> 1; 3492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNumberOfElementsIndex = 0; 3495e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kNumberOfDeletedElementsIndex = 1; 3496e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kCapacityIndex = 2; 3497e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kPrefixStartIndex = 3; 3498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Constant used for denoting a absent entry. 3500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNotFound = -1; 3501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3502c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Minimum capacity for newly created hash tables. 3503c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMinCapacity = 4; 3504c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 35063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Update the number of elements in the hash table. 3507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetNumberOfElements(int nof); 3508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3509e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Update the number of deleted elements in the hash table. 3510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetNumberOfDeletedElements(int nod); 3511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns probe entry. 3513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static uint32_t GetProbe(uint32_t hash, uint32_t number, uint32_t size) { 3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base::bits::IsPowerOfTwo32(size)); 3515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (hash + GetProbeOffset(number)) & (size - 1); 3516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static uint32_t FirstProbe(uint32_t hash, uint32_t size) { 3519e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return hash & (size - 1); 3520e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 3521e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 3522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static uint32_t NextProbe( 3523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t last, uint32_t number, uint32_t size) { 3524e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return (last + number) & (size - 1); 3525e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 3526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Derived, typename Shape, typename Key> 3530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass HashTable : public HashTableBase { 3531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 353213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch typedef Shape ShapeT; 353313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 3534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Wrapper methods 3535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t Hash(Key key) { 3536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Shape::UsesSeed) { 3537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::SeededHash(key, GetHeap()->HashSeed()); 3538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 3539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::Hash(key); 3540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t HashForObject(Key key, Object* object) { 3544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Shape::UsesSeed) { 3545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::SeededHashForObject(key, GetHeap()->HashSeed(), object); 3546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 3547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::HashForObject(key, object); 3548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns a new HashTable object. 3552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Handle<Derived> New( 3553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, int at_least_space_for, 3554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, 3555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure = NOT_TENURED); 3556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(HashTable) 3558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Garbage collection support. 3560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IteratePrefix(ObjectVisitor* visitor); 3561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IterateElements(ObjectVisitor* visitor); 3562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find entry for key otherwise return kNotFound. 3564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int FindEntry(Key key); 3565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int FindEntry(Isolate* isolate, Key key, int32_t hash); 3566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int FindEntry(Isolate* isolate, Key key); 3567f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool Has(Isolate* isolate, Key key); 3568f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool Has(Key key); 3569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Rehashes the table in-place. 3571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Rehash(Key key); 3572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the key at entry. 357413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Object* KeyAt(int entry) { return get(EntryToIndex(entry) + kEntryKeyIndex); } 3575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3576014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kElementsStartIndex = kPrefixStartIndex + Shape::kPrefixSize; 3577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kEntrySize = Shape::kEntrySize; 357813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch STATIC_ASSERT(kEntrySize > 0); 357913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryKeyIndex = 0; 3580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kElementsStartOffset = 3581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kHeaderSize + kElementsStartIndex * kPointerSize; 3582c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Maximal capacity of HashTable. Based on maximal length of underlying 3583c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // FixedArray. Staying below kMaxCapacity also ensures that EntryToIndex 3584c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // cannot overflow. 3585c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMaxCapacity = 3586c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch (FixedArray::kMaxLength - kElementsStartIndex) / kEntrySize; 3587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the index for an entry (of the key) 3589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int EntryToIndex(int entry) { 3590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (entry * kEntrySize) + kElementsStartIndex; 3591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 3594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class ObjectHashTable; 3595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find the entry at which to insert element with the given key that 3597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // has the given hash value. 3598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t FindInsertionEntry(uint32_t hash); 3599e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 36003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Attempt to shrink hash table after removal of key. 3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<Derived> Shrink(Handle<Derived> table, Key key); 36023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Ensure enough space for n additional elements. 3604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<Derived> EnsureCapacity( 3605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Derived> table, 3606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int n, 3607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Key key, 3608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure = NOT_TENURED); 3609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if this table has sufficient capacity for adding n elements. 361113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool HasSufficientCapacityToAdd(int number_of_additional_elements); 3612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Sets the capacity of the hash table. 3614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetCapacity(int capacity) { 3615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // To scale a computed hash code to fit within the hash table, we 3616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // use bit-wise AND with a mask, so the capacity must be positive 3617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and non-zero. 3618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(capacity > 0); 3619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(capacity <= kMaxCapacity); 3620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch set(kCapacityIndex, Smi::FromInt(capacity)); 3621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns _expected_ if one of entries given by the first _probe_ probes is 3625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // equal to _expected_. Otherwise, returns the entry given by the probe 3626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // number _probe_. 3627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t EntryForProbe(Key key, Object* k, int probe, uint32_t expected); 3628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode); 3630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Rehashes this hash-table into the new table. 3632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Rehash(Handle<Derived> new_table, Key key); 3633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HashTableKey is an abstract superclass for virtual key behavior. 3637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass HashTableKey { 3638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns whether the other object matches this key. 3640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual bool IsMatch(Object* other) = 0; 3641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the hash value for this key. 3642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual uint32_t Hash() = 0; 3643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the hash value for object. 3644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual uint32_t HashForObject(Object* key) = 0; 36453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Returns the key object for storing into the hash table. 3646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT virtual Handle<Object> AsHandle(Isolate* isolate) = 0; 3647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Required. 3648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~HashTableKey() {} 3649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3651c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StringTableShape : public BaseShape<HashTableKey*> { 3653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 365444f0eee88ff00398ff7f715fab053374d808c90dSteve Block static inline bool IsMatch(HashTableKey* key, Object* value) { 3655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->IsMatch(value); 3656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 365844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static inline uint32_t Hash(HashTableKey* key) { 3659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->Hash(); 3660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 366244f0eee88ff00398ff7f715fab053374d808c90dSteve Block static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 3663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->HashForObject(object); 3664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 3667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPrefixSize = 0; 3669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kEntrySize = 1; 3670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SeqOneByteString; 3673257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// StringTable. 3675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 3676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// No special elements in the prefix and the element size is 1 3677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// because only the string itself (the key) needs to be stored. 3678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StringTable: public HashTable<StringTable, 3679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringTableShape, 3680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HashTableKey*> { 3681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find string in the string table. If it is not there yet, it is 3683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // added. The return value is the string found. 3684f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE static Handle<String> LookupString(Isolate* isolate, 3685f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<String> key); 3686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<String> LookupKey(Isolate* isolate, HashTableKey* key); 3687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static String* LookupKeyIfExists(Isolate* isolate, HashTableKey* key); 3688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tries to internalize given string and returns string handle on success 3690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // or an empty handle otherwise. 3691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<String> InternalizeStringIfExists( 3692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, 3693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> string); 3694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Looks up a string that is equal to the given string and returns 3696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // string handle if it is found, or an empty handle otherwise. 3697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<String> LookupStringIfExists( 3698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, 3699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> str); 3700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<String> LookupTwoCharsStringIfExists( 3701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, 3702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c1, 3703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c2); 3704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void EnsureCapacityForDeserialization(Isolate* isolate, int expected); 3706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(StringTable) 3708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 3710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <bool seq_one_byte> 3711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class JsonParser; 3712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(StringTable); 3714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass StringSetShape : public BaseShape<String*> { 37173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 37183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static inline bool IsMatch(String* key, Object* value); 37193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static inline uint32_t Hash(String* key); 37203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static inline uint32_t HashForObject(String* key, Object* object); 37213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 37223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kPrefixSize = 0; 37233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kEntrySize = 1; 37243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 37253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 37263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass StringSet : public HashTable<StringSet, StringSetShape, String*> { 37273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 37283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static Handle<StringSet> New(Isolate* isolate); 37293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static Handle<StringSet> Add(Handle<StringSet> blacklist, 37303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<String> name); 37313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool Has(Handle<String> name); 37323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 37333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DECLARE_CAST(StringSet) 37343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 3735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename Derived, typename Shape, typename Key> 3737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Dictionary: public HashTable<Derived, Shape, Key> { 3738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef HashTable<Derived, Shape, Key> DerivedHashTable; 3739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the value at entry. 3742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* ValueAt(int entry) { 3743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return this->get(Derived::EntryToIndex(entry) + 1); 3744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set the value for entry. 37473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void ValueAtPut(int entry, Object* value) { 3748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch this->set(Derived::EntryToIndex(entry) + 1, value); 3749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the property details for the property at entry. 3752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyDetails DetailsAt(int entry) { 3753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::DetailsAt(static_cast<Derived*>(this), entry); 3754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set the details for entry. 3757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void DetailsAtPut(int entry, PropertyDetails value) { 3758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Shape::DetailsAtPut(static_cast<Derived*>(this), entry, value); 3759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if property at given entry is deleted. 3762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsDeleted(int entry) { 3763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::IsDeleted(static_cast<Derived*>(this), entry); 3764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Delete a property from the dictionary. 3767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> DeleteProperty(Handle<Derived> dictionary, int entry); 3768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Attempt to shrink the dictionary after deletion of key. 3770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Handle<Derived> Shrink( 3771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Derived> dictionary, 3772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Key key) { 3773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DerivedHashTable::Shrink(dictionary, key); 3774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 37753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Sorting support 3777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): templatize or move to SeededNumberDictionary 3778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CopyValuesTo(FixedArray* elements); 3779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the number of elements in the dictionary filtering out properties 3781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // with the specified attributes. 3782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int NumberOfElementsFilterAttributes(PropertyFilter filter); 3783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the number of enumerable elements in the dictionary. 3785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int NumberOfEnumElements() { 3786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NumberOfElementsFilterAttributes(ENUMERABLE_STRINGS); 3787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch enum SortMode { UNSORTED, SORTED }; 3790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Collect the keys into the given KeyAccumulator, in ascending chronological 3792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // order of property creation. 3793f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void CollectKeysTo(Handle<Dictionary<Derived, Shape, Key>> dictionary, 3794f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch KeyAccumulator* keys); 3795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Copies enumerable keys to preallocated fixed array. 3797f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void CopyEnumKeysTo(Handle<Dictionary<Derived, Shape, Key>> dictionary, 3798f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<FixedArray> storage, KeyCollectionMode mode, 3799f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch KeyAccumulator* accumulator); 3800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Accessors for next enumeration index. 3802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void SetNextEnumerationIndex(int index) { 3803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(index != 0); 38043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch this->set(kNextEnumerationIndexIndex, Smi::FromInt(index)); 3805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int NextEnumerationIndex() { 3808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(this->get(kNextEnumerationIndexIndex))->value(); 3809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a new dictionary. 3812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<Derived> New( 3813f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate, int at_least_space_for, 3814f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PretenureFlag pretenure = NOT_TENURED, 3815f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY); 3816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Ensures that a new dictionary is created when the capacity is checked. 3818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetRequiresCopyOnCapacityChange(); 3819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Ensure enough space for n additional elements. 3821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> EnsureCapacity(Handle<Derived> obj, int n, Key key); 3822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef OBJECT_PRINT 382413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // For our gdb macros, we should perhaps change these in the future. 382513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void Print(); 382613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 3827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print(std::ostream& os); // NOLINT 3828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 3829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the key (slow). 3830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* SlowReverseLookup(Object* value); 3831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Sets the entry to (key, value) pair. 3833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SetEntry(int entry, 3834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key, 3835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 38368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch inline void SetEntry(int entry, 3837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key, 3838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value, 3839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyDetails details); 3840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3841f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MUST_USE_RESULT static Handle<Derived> Add(Handle<Derived> dictionary, 3842f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Key key, Handle<Object> value, 3843f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyDetails details, 3844f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int* entry_out = nullptr); 3845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Returns iteration indices array for the |dictionary|. 3847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Values are direct indices in the |HashTable| array. 3848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<FixedArray> BuildIterationIndicesArray( 3849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Derived> dictionary); 3850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3851c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMaxNumberKeyIndex = DerivedHashTable::kPrefixStartIndex; 3852c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; 3853c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 3855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Generic at put operation. 3856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<Derived> AtPut( 3857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Derived> dictionary, 3858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Key key, 3859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 3860f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Add entry to dictionary. Returns entry value. 3861f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int AddEntry(Handle<Derived> dictionary, Key key, Handle<Object> value, 3862f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyDetails details, uint32_t hash); 3863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Generate new enumeration indices to avoid enumeration index overflow. 3864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Returns iteration indices array for the |dictionary|. 3865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<FixedArray> GenerateNewEnumerationIndices( 3866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Derived> dictionary); 3867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Derived, typename Shape> 3871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass NameDictionaryBase : public Dictionary<Derived, Shape, Handle<Name> > { 3872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef Dictionary<Derived, Shape, Handle<Name> > DerivedDictionary; 3873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find entry for key, otherwise return kNotFound. Optimized version of 3876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // HashTable::FindEntry. 3877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int FindEntry(Handle<Name> key); 3878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Key> 3882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass BaseDictionaryShape : public BaseShape<Key> { 3883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline PropertyDetails DetailsAt(Dictionary* dict, int entry) { 3886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(Dictionary::kEntrySize == 3); 3887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(entry >= 0); // Not found is -1, which is not caught by get(). 388813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return PropertyDetails(Smi::cast(dict->get( 388913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Dictionary::EntryToIndex(entry) + Dictionary::kEntryDetailsIndex))); 3890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void DetailsAtPut(Dictionary* dict, int entry, 3894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDetails value) { 3895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(Dictionary::kEntrySize == 3); 389613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch dict->set(Dictionary::EntryToIndex(entry) + Dictionary::kEntryDetailsIndex, 389713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch value.AsSmi()); 3898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsDeleted(Dictionary* dict, int entry) { 3902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 3903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key, 3907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, PropertyDetails details); 3908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass NameDictionaryShape : public BaseDictionaryShape<Handle<Name> > { 3912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsMatch(Handle<Name> key, Object* other); 3914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t Hash(Handle<Name> key); 3915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t HashForObject(Handle<Name> key, Object* object); 3916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Name> key); 3917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPrefixSize = 2; 3918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kEntrySize = 3; 391913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 392013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryDetailsIndex = 2; 3921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const bool kIsEnumerable = true; 3922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass NameDictionary 3926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public NameDictionaryBase<NameDictionary, NameDictionaryShape> { 3927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef NameDictionaryBase<NameDictionary, NameDictionaryShape> 3928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DerivedDictionary; 3929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(NameDictionary) 3932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline static Handle<FixedArray> DoGenerateNewEnumerationIndices( 3934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<NameDictionary> dictionary); 393513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 393613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 393713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryDetailsIndex = 2; 3938c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kInitialCapacity = 2; 3939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 39403bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 3941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass GlobalDictionaryShape : public NameDictionaryShape { 3943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kEntrySize = 2; // Overrides NameDictionaryShape::kEntrySize 3945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline PropertyDetails DetailsAt(Dictionary* dict, int entry); 3948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void DetailsAtPut(Dictionary* dict, int entry, 3951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDetails value); 3952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsDeleted(Dictionary* dict, int entry); 3955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key, 3958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, PropertyDetails details); 3959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass GlobalDictionary 3963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public NameDictionaryBase<GlobalDictionary, GlobalDictionaryShape> { 3964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(GlobalDictionary) 396613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 396713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 3968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass NumberDictionaryShape : public BaseDictionaryShape<uint32_t> { 3972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool IsMatch(uint32_t key, Object* other); 3974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, uint32_t key); 3975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const bool kIsEnumerable = false; 3976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3979c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass SeededNumberDictionaryShape : public NumberDictionaryShape { 3980c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch public: 3981c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const bool UsesSeed = true; 3982c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const int kPrefixSize = 2; 3983f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kEntrySize = 3; 3984c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3985c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static inline uint32_t SeededHash(uint32_t key, uint32_t seed); 3986c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static inline uint32_t SeededHashForObject(uint32_t key, 3987c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch uint32_t seed, 3988c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch Object* object); 3989c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 3990c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3991c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3992c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass UnseededNumberDictionaryShape : public NumberDictionaryShape { 39932b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch public: 3994c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const int kPrefixSize = 0; 3995f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kEntrySize = 2; 3996c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3997c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static inline uint32_t Hash(uint32_t key); 3998c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static inline uint32_t HashForObject(uint32_t key, Object* object); 3999f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4000f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <typename Dictionary> 4001f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline PropertyDetails DetailsAt(Dictionary* dict, int entry) { 4002f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 4003f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return PropertyDetails::Empty(); 4004f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 4005f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4006f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <typename Dictionary> 4007f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline void DetailsAtPut(Dictionary* dict, int entry, 4008f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyDetails value) { 4009f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 4010f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 4011f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4012f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline Map* GetMap(Isolate* isolate); 4013c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 4014c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 4015c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 4016c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass SeededNumberDictionary 4017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public Dictionary<SeededNumberDictionary, 4018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SeededNumberDictionaryShape, 4019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t> { 4020c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch public: 4021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SeededNumberDictionary) 4022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Type specific at put (default NONE attributes is used when adding). 4024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<SeededNumberDictionary> AtNumberPut( 4025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SeededNumberDictionary> dictionary, uint32_t key, 4026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, bool used_as_prototype); 4027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<SeededNumberDictionary> AddNumberEntry( 4028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SeededNumberDictionary> dictionary, uint32_t key, 4029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, PropertyDetails details, bool used_as_prototype); 4030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set an existing entry or add a new one if needed. 40323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the updated dictionary. 40333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MUST_USE_RESULT static Handle<SeededNumberDictionary> Set( 4034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SeededNumberDictionary> dictionary, uint32_t key, 4035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, PropertyDetails details, bool used_as_prototype); 40363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateMaxNumberKey(uint32_t key, bool used_as_prototype); 4038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns true if the dictionary contains any elements that are non-writable, 40403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // non-configurable, non-enumerable, or have getters/setters. 40413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool HasComplexElements(); 40423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If slow elements are required we will never go back to fast-case 4044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // for the elements kept in this dictionary. We require slow 4045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // elements if an element has been added at an index larger than 4046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // kRequiresSlowElementsLimit or set_requires_slow_elements() has been called 4047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // when defining a getter or setter with a number key. 4048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool requires_slow_elements(); 4049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_requires_slow_elements(); 4050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the value of the max number key that has been added to this 4052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // dictionary. max_number_key can only be called if 4053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // requires_slow_elements returns false. 4054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint32_t max_number_key(); 4055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 405613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 405713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryDetailsIndex = 2; 405813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 4059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit masks. 4060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kRequiresSlowElementsMask = 1; 4061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kRequiresSlowElementsTagSize = 1; 4062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; 4063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 4064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4066c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass UnseededNumberDictionary 4067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public Dictionary<UnseededNumberDictionary, 4068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnseededNumberDictionaryShape, 4069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t> { 4070c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch public: 4071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(UnseededNumberDictionary) 4072c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 4073c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // Type specific at put (default NONE attributes is used when adding). 4074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<UnseededNumberDictionary> AtNumberPut( 4075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<UnseededNumberDictionary> dictionary, 4076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t key, 4077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 4078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<UnseededNumberDictionary> AddNumberEntry( 4079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<UnseededNumberDictionary> dictionary, 4080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t key, 4081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 4082f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<UnseededNumberDictionary> DeleteKey( 4083f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<UnseededNumberDictionary> dictionary, uint32_t key); 4084c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 4085c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // Set an existing entry or add a new one if needed. 40863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the updated dictionary. 40873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MUST_USE_RESULT static Handle<UnseededNumberDictionary> Set( 40883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<UnseededNumberDictionary> dictionary, 4089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t key, 40903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Object> value); 409113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 409213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 409313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryDetailsIndex = 2; 4094c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 4095c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 4096c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 4097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ObjectHashTableShape : public BaseShape<Handle<Object> > { 40982b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch public: 4099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsMatch(Handle<Object> key, Object* other); 4100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t Hash(Handle<Object> key); 4101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t HashForObject(Handle<Object> key, Object* object); 4102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Object> key); 4103592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static const int kPrefixSize = 0; 4104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEntrySize = 2; 4105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ObjectHashTable maps keys that are arbitrary objects to object values by 4109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// using the identity hash of the key for hashing purposes. 4110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ObjectHashTable: public HashTable<ObjectHashTable, 4111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectHashTableShape, 4112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> > { 4113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef HashTable< 4114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectHashTable, ObjectHashTableShape, Handle<Object> > DerivedHashTable; 4115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ObjectHashTable) 4117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Attempt to shrink hash table after removal of key. 4119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Handle<ObjectHashTable> Shrink( 4120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ObjectHashTable> table, 4121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key); 4122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Looks up the value associated with the given key. The hole value is 4124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // returned in case the key is not present. 4125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* Lookup(Handle<Object> key); 4126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* Lookup(Handle<Object> key, int32_t hash); 4127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* Lookup(Isolate* isolate, Handle<Object> key, int32_t hash); 4128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4129c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns the value at entry. 4130c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Object* ValueAt(int entry); 4131c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 4132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Adds (or overwrites) the value associated with the given key. 4133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table, 4134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key, 4135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 4136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table, 4137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> key, Handle<Object> value, 4138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t hash); 4139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an ObjectHashTable (possibly |table|) where |key| has been removed. 4141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<ObjectHashTable> Remove(Handle<ObjectHashTable> table, 4142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key, 4143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool* was_present); 4144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ObjectHashTable> Remove(Handle<ObjectHashTable> table, 4145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> key, bool* was_present, 4146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t hash); 4147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 4149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class MarkCompactCollector; 4150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddEntry(int entry, Object* key, Object* value); 4152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RemoveEntry(int entry); 4153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the index to the value of an entry. 4155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int EntryToValueIndex(int entry) { 4156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return EntryToIndex(entry) + 1; 4157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 415869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 415969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass ObjectHashSetShape : public ObjectHashTableShape { 4161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 4162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kPrefixSize = 0; 4163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kEntrySize = 1; 4164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 4165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass ObjectHashSet 4167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : public HashTable<ObjectHashSet, ObjectHashSetShape, Handle<Object>> { 4168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 4169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<ObjectHashSet> Add(Handle<ObjectHashSet> set, 4170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> key); 4171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool Has(Isolate* isolate, Handle<Object> key, int32_t hash); 4173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool Has(Isolate* isolate, Handle<Object> key); 4174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(ObjectHashSet) 4176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 417769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OrderedHashTable is a HashTable with Object keys that preserves 4179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// insertion order. There are Map and Set interfaces (OrderedHashMap 4180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// and OrderedHashTable, below). It is meant to be used by JSMap/JSSet. 4181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Only Object* keys are supported, with Object::SameValueZero() used as the 4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// equality operator and Object::GetHash() for the hash function. 4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Based on the "Deterministic Hash Table" as described by Jason Orendorff at 4186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables 4187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Originally attributed to Tyler Close. 4188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Memory layout: 4190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [0]: bucket count 4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [1]: element count 4192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [2]: deleted element count 4193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [3..(3 + NumberOfBuckets() - 1)]: "hash table", where each item is an 4194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// offset into the data table (see below) where the 4195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// first item in this bucket is stored. 4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [3 + NumberOfBuckets()..length]: "data table", an array of length 4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Capacity() * kEntrySize, where the first entrysize 4198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// items are handled by the derived class and the 4199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// item at kChainOffset is another entry into the 4200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// data table indicating the next entry in this hash 4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// bucket. 4202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When we transition the table to a new version we obsolete it and reuse parts 4204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// of the memory to store information how to transition an iterator to the new 4205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// table: 4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Memory layout for obsolete table: 4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [0]: bucket count 4209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [1]: Next newer table 4210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [2]: Number of removed holes or -1 when the table was cleared. 4211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [3..(3 + NumberOfRemovedHoles() - 1)]: The indexes of the removed holes. 4212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [3 + NumberOfRemovedHoles()..length]: Not used 4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Derived, class Iterator, int entrysize> 4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OrderedHashTable: public FixedArray { 42163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an OrderedHashTable with a capacity of at least |capacity|. 4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> Allocate( 4219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, int capacity, PretenureFlag pretenure = NOT_TENURED); 4220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an OrderedHashTable (possibly |table|) with enough space 4222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to add at least one new element. 4223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> EnsureGrowable(Handle<Derived> table); 4224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an OrderedHashTable (possibly |table|) that's shrunken 4226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // if possible. 4227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> Shrink(Handle<Derived> table); 4228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a new empty OrderedHashTable and records the clearing so that 4230bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // existing iterators can be updated. 4231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> Clear(Handle<Derived> table); 4232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns a true if the OrderedHashTable contains the key 4234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool HasKey(Handle<Derived> table, Handle<Object> key); 4235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfElements() { 4237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(get(kNumberOfElementsIndex))->value(); 4238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfDeletedElements() { 4241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(get(kNumberOfDeletedElementsIndex))->value(); 4242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4244bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Returns the number of contiguous entries in the data table, starting at 0, 4245bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // that either are real entries or have been deleted. 4246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int UsedCapacity() { return NumberOfElements() + NumberOfDeletedElements(); } 4247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfBuckets() { 4249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(get(kNumberOfBucketsIndex))->value(); 4250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an index into |this| for the given entry. 4253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int EntryToIndex(int entry) { 4254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kHashTableStartIndex + NumberOfBuckets() + (entry * kEntrySize); 4255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int HashToBucket(int hash) { return hash & (NumberOfBuckets() - 1); } 4258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int HashToEntry(int hash) { 4260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int bucket = HashToBucket(hash); 4261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* entry = this->get(kHashTableStartIndex + bucket); 4262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Smi::cast(entry)->value(); 4263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 426513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int KeyToFirstEntry(Isolate* isolate, Object* key) { 4266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* hash = key->GetHash(); 4267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the object does not have an identity hash, it was never used as a key 426813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (hash->IsUndefined(isolate)) return kNotFound; 4269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return HashToEntry(Smi::cast(hash)->value()); 4270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int NextChainEntry(int entry) { 4273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* next_entry = get(EntryToIndex(entry) + kChainOffset); 4274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Smi::cast(next_entry)->value(); 4275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 427713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // use KeyAt(i)->IsTheHole(isolate) to determine if this is a deleted entry. 4278bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Object* KeyAt(int entry) { 4279bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK_LT(entry, this->UsedCapacity()); 4280bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return get(EntryToIndex(entry)); 4281bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 4282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsObsolete() { 4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !get(kNextTableIndex)->IsSmi(); 4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The next newer table. This is only valid if the table is obsolete. 4288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Derived* NextTable() { 4289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Derived::cast(get(kNextTableIndex)); 4290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // When the table is obsolete we store the indexes of the removed holes. 4293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int RemovedIndexAt(int index) { 4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(get(kRemovedHolesIndex + index))->value(); 4295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNotFound = -1; 4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMinCapacity = 4; 4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNumberOfBucketsIndex = 0; 4301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNumberOfElementsIndex = kNumberOfBucketsIndex + 1; 4302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNumberOfDeletedElementsIndex = kNumberOfElementsIndex + 1; 4303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashTableStartIndex = kNumberOfDeletedElementsIndex + 1; 4304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNextTableIndex = kNumberOfElementsIndex; 4305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNumberOfBucketsOffset = 4307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kHeaderSize + kNumberOfBucketsIndex * kPointerSize; 4308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNumberOfElementsOffset = 4309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kHeaderSize + kNumberOfElementsIndex * kPointerSize; 4310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNumberOfDeletedElementsOffset = 4311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kHeaderSize + kNumberOfDeletedElementsIndex * kPointerSize; 4312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashTableStartOffset = 4313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kHeaderSize + kHashTableStartIndex * kPointerSize; 4314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNextTableOffset = 4315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kHeaderSize + kNextTableIndex * kPointerSize; 4316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kEntrySize = entrysize + 1; 4318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kChainOffset = entrysize; 4319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLoadFactor = 2; 4321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // NumberOfDeletedElements is set to kClearedTableSentinel when 4323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // the table is cleared, which allows iterator transitions to 4324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // optimize that case. 4325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kClearedTableSentinel = -1; 4326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 4328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> Rehash(Handle<Derived> table, int new_capacity); 4329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetNumberOfBuckets(int num) { 4331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set(kNumberOfBucketsIndex, Smi::FromInt(num)); 4332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetNumberOfElements(int num) { 4335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set(kNumberOfElementsIndex, Smi::FromInt(num)); 4336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetNumberOfDeletedElements(int num) { 4339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set(kNumberOfDeletedElementsIndex, Smi::FromInt(num)); 4340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4342bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Returns the number elements that can fit into the allocated buffer. 4343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int Capacity() { 4344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NumberOfBuckets() * kLoadFactor; 4345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetNextTable(Derived* next_table) { 4348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set(kNextTableIndex, next_table); 4349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetRemovedIndexAt(int index, int removed_index) { 4352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return set(kRemovedHolesIndex + index, Smi::FromInt(removed_index)); 4353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kRemovedHolesIndex = kHashTableStartIndex; 43563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxCapacity = 4358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (FixedArray::kMaxLength - kHashTableStartIndex) 4359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch / (1 + (kEntrySize * kLoadFactor)); 43603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 43613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSSetIterator; 4364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OrderedHashSet: public OrderedHashTable< 4367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OrderedHashSet, JSSetIterator, 1> { 4368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(OrderedHashSet) 4370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<OrderedHashSet> Add(Handle<OrderedHashSet> table, 4372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value); 437313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Handle<FixedArray> ConvertToKeysArray(Handle<OrderedHashSet> table, 437413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch GetKeysConversion convert); 4375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSMapIterator; 4379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass OrderedHashMap 4382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public OrderedHashTable<OrderedHashMap, JSMapIterator, 2> { 438369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 4384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(OrderedHashMap) 4385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* ValueAt(int entry); 438769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kValueOffset = 1; 4389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <int entrysize> 4393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass WeakHashTableShape : public BaseShape<Handle<Object> > { 4394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsMatch(Handle<Object> key, Object* other); 4396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t Hash(Handle<Object> key); 4397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t HashForObject(Handle<Object> key, Object* object); 4398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Object> key); 4399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrefixSize = 0; 4400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEntrySize = entrysize; 4401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// WeakHashTable maps keys that are arbitrary heap objects to heap object 4405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// values. The table wraps the keys in weak cells and store values directly. 4406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Thus it references keys weakly and values strongly. 4407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass WeakHashTable: public HashTable<WeakHashTable, 4408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WeakHashTableShape<2>, 4409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> > { 4410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef HashTable< 4411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WeakHashTable, WeakHashTableShape<2>, Handle<Object> > DerivedHashTable; 4412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(WeakHashTable) 4414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Looks up the value associated with the given key. The hole value is 441669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // returned in case the key is not present. 4417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* Lookup(Handle<HeapObject> key); 441869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 441969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Adds (or overwrites) the value associated with the given key. Mapping a 4420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // key to the hole value causes removal of the whole entry. 4421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<WeakHashTable> Put(Handle<WeakHashTable> table, 4422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapObject> key, 4423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapObject> value); 4424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<FixedArray> GetValues(Handle<WeakHashTable> table); 442669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 442769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 442869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch friend class MarkCompactCollector; 442969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddEntry(int entry, Handle<WeakCell> key, Handle<HeapObject> value); 443169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 443269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returns the index to the value of an entry. 443369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static inline int EntryToValueIndex(int entry) { 443469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return EntryToIndex(entry) + 1; 443569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 443669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 443769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 443869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 44393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ScopeInfo represents information about different scopes of a source 44403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// program and the allocation of the scope's variables. Scope information 44413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// is stored in a compressed form in ScopeInfo objects and is used 44423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// at runtime (stack dumps, deoptimization, etc.). 44433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// This object provides quick access to scope info details for runtime 44453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// routines. 44463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass ScopeInfo : public FixedArray { 44473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 4448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ScopeInfo) 44493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the type of this scope. 4451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ScopeType scope_type(); 44523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Does this scope call eval? 44543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool CallsEval(); 44553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Return the language mode of this scope. 4457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode(); 4458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // True if this scope is a (var) declaration scope. 4460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool is_declaration_scope(); 44613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Does this scope make a sloppy eval call? 4463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool CallsSloppyEval() { return CallsEval() && is_sloppy(language_mode()); } 44643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the total number of locals allocated on the stack and in the 44663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // context. This includes the parameters that are allocated in the context. 44673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int LocalCount(); 44683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the number of stack slots for code. This number consists of two 44703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // parts: 44713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // 1. One stack slot per stack allocated local. 44723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // 2. One stack slot for the function name if it is stack allocated. 44733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int StackSlotCount(); 44743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the number of context slots for code if a context is allocated. This 44763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // number consists of three parts: 44773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // 1. Size of fixed header for every context: Context::MIN_CONTEXT_SLOTS 44783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // 2. One context slot per context allocated local. 44793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // 3. One context slot for the function name if it is context allocated. 44803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Parameters allocated in the context count as context allocated locals. If 44813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // no contexts are allocated for this scope ContextLength returns 0. 44823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int ContextLength(); 44833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Does this scope declare a "this" binding? 4485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasReceiver(); 4486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Does this scope declare a "this" binding, and the "this" binding is stack- 4488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or context-allocated? 4489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasAllocatedReceiver(); 4490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Does this scope declare a "new.target" binding? 4492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasNewTarget(); 4493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 44943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Is this scope the scope of a named function expression? 44953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool HasFunctionName(); 44963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return if this has context allocated locals. 44983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool HasHeapAllocatedLocals(); 44993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return if contexts are allocated for this scope. 45013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool HasContext(); 45023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return if this is a function scope with "use asm". 4504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsAsmModule(); 4505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return if this is a nested function within an asm module scope. 4507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsAsmFunction(); 4508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasSimpleParameters(); 4510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the function_name if present. 45123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch String* FunctionName(); 45133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4514f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ModuleInfo* ModuleDescriptorInfo(); 4515f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 45163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the name of the given parameter. 45173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch String* ParameterName(int var); 45183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the name of the given local. 45203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch String* LocalName(int var); 45213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the name of the given stack local. 45233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch String* StackLocalName(int var); 45243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Return the name of the given stack local. 4526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int StackLocalIndex(int var); 4527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 45283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the name of the given context local. 45293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch String* ContextLocalName(int var); 45303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the mode of the given context local. 45323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VariableMode ContextLocalMode(int var); 45333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the initialization flag of the given context local. 45353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InitializationFlag ContextLocalInitFlag(int var); 45363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return the initialization flag of the given context local. 4538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaybeAssignedFlag ContextLocalMaybeAssignedFlag(int var); 4539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return true if this local was introduced by the compiler, and should not be 4541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // exposed to the user in a debugger. 4542bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static bool VariableIsSynthetic(String* name); 4543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Lookup support for serialized scope info. Returns the 45453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the stack slot index for a given slot name if the slot is 4546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // present; otherwise returns a value < 0. The name must be an internalized 4547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // string. 45483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int StackSlotIndex(String* name); 45493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Lookup support for serialized scope info. Returns the local context slot 4551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // index for a given slot name if the slot is present; otherwise 4552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // returns a value < 0. The name must be an internalized string. 45533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If the slot is present and mode != NULL, sets *mode to the corresponding 45543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // mode for that variable. 4555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int ContextSlotIndex(Handle<ScopeInfo> scope_info, Handle<String> name, 4556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VariableMode* mode, InitializationFlag* init_flag, 4557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaybeAssignedFlag* maybe_assigned_flag); 45583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4559c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Lookup metadata of a MODULE-allocated variable. Return 0 if there is no 4560c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // module variable with the given name (the index value of a MODULE variable 4561c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // is never 0). 4562f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int ModuleIndex(Handle<String> name, VariableMode* mode, 4563f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch InitializationFlag* init_flag, 4564f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MaybeAssignedFlag* maybe_assigned_flag); 4565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Lookup the name of a certain context slot by its index. 4567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch String* ContextSlotName(int slot_index); 4568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 45693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Lookup support for serialized scope info. Returns the 45703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // parameter index for a given parameter name if the parameter is present; 4571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // otherwise returns a value < 0. The name must be an internalized string. 45723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int ParameterIndex(String* name); 45733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Lookup support for serialized scope info. Returns the function context 4575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // slot index if the function name is present and context-allocated (named 45763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // function expressions, only), otherwise returns a value < 0. The name 4577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // must be an internalized string. 4578f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int FunctionContextSlotIndex(String* name); 45793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Lookup support for serialized scope info. Returns the receiver context 4581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // slot index if scope has a "this" binding, and the binding is 4582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // context-allocated. Otherwise returns a value < 0. 4583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int ReceiverContextSlotIndex(); 4584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FunctionKind function_kind(); 4586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4587f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Returns true if this ScopeInfo is linked to a outer ScopeInfo. 4588f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool HasOuterScopeInfo(); 4589f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4590f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Returns true if this ScopeInfo was created for a debug-evaluate scope. 4591f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool IsDebugEvaluateScope(); 4592f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4593f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Can be used to mark a ScopeInfo that looks like a with-scope as actually 4594f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // being a debug-evaluate scope. 4595f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void SetIsDebugEvaluateScope(); 4596f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4597f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Return the outer ScopeInfo if present. 4598f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ScopeInfo* OuterScopeInfo(); 4599f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4600f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifdef DEBUG 4601f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool Equals(ScopeInfo* other) const; 4602f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif 4603f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4604f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Handle<ScopeInfo> Create(Isolate* isolate, Zone* zone, Scope* scope, 4605f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MaybeHandle<ScopeInfo> outer_scope); 4606f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Handle<ScopeInfo> CreateForWithScope( 4607f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Isolate* isolate, MaybeHandle<ScopeInfo> outer_scope); 4608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ScopeInfo> CreateGlobalThisBinding(Isolate* isolate); 46093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Serializes empty scope info. 4611c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE static ScopeInfo* Empty(Isolate* isolate); 46123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 46143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void Print(); 46153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 46163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The layout of the static part of a ScopeInfo is as follows. Each entry is 46183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // numeric and occupies one array slot. 4619f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// 1. A set of properties of the scope. 4620f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// 2. The number of parameters. For non-function scopes this is 0. 4621f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// 3. The number of non-parameter variables allocated on the stack. 4622f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// 4. The number of non-parameter and parameter variables allocated in the 4623f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// context. 4624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define FOR_EACH_SCOPE_INFO_NUMERIC_FIELD(V) \ 4625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Flags) \ 4626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ParameterCount) \ 4627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(StackLocalCount) \ 4628f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(ContextLocalCount) 4629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define FIELD_ACCESSORS(name) \ 4631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Set##name(int value); \ 4632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int name(); 4633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_EACH_SCOPE_INFO_NUMERIC_FIELD(FIELD_ACCESSORS) 46343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef FIELD_ACCESSORS 46353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum { 46373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECL_INDEX(name) k##name, 4638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FOR_EACH_SCOPE_INFO_NUMERIC_FIELD(DECL_INDEX) 46393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECL_INDEX 4640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kVariablePartIndex 46413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 46423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 46443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The layout of the variable part of a ScopeInfo is as follows: 4645f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 1. ParameterNames: 46463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // This part stores the names of the parameters for function scopes. One 46473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // slot is used per parameter, so in total this part occupies 46483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // ParameterCount() slots in the array. For other scopes than function 46493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // scopes ParameterCount() is 0. 4650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 2. StackLocalFirstSlot: 4651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Index of a first stack slot for stack local. Stack locals belonging to 4652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // this scope are located on a stack at slots starting from this index. 4653f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 3. StackLocalNames: 46543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Contains the names of local variables that are allocated on the stack, 4655f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // in increasing order of the stack slot index. First local variable has a 4656f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // stack slot index defined in StackLocalFirstSlot (point 2 above). 4657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // One slot is used per stack local, so in total this part occupies 4658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // StackLocalCount() slots in the array. 4659f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 4. ContextLocalNames: 46603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Contains the names of local variables and parameters that are allocated 46613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // in the context. They are stored in increasing order of the context slot 46623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // index starting with Context::MIN_CONTEXT_SLOTS. One slot is used per 46633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // context local, so in total this part occupies ContextLocalCount() slots 46643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // in the array. 4665f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 5. ContextLocalInfos: 46663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Contains the variable modes and initialization flags corresponding to 4667f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // the context locals in ContextLocalNames. One slot is used per 46683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // context local, so in total this part occupies ContextLocalCount() 46693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // slots in the array. 4670f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 6. ReceiverInfo: 4671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the scope binds a "this" value, one slot is reserved to hold the 4672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // context or stack slot index for the variable. 4673f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 7. FunctionNameInfo: 46743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If the scope belongs to a named function expression this part contains 46753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // information about the function variable. It always occupies two array 46763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // slots: a. The name of the function variable. 46773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // b. The context or stack slot index for the variable. 4678f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 8. OuterScopeInfoIndex: 4679f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The outer scope's ScopeInfo or the hole if there's none. 4680f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 9. ModuleInfo, ModuleVariableCount, and ModuleVariables: 4681f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // For a module scope, this part contains the ModuleInfo, the number of 4682f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // MODULE-allocated variables, and the metadata of those variables. For 4683f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // non-module scopes it is empty. 4684f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int ParameterNamesIndex(); 4685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int StackLocalFirstSlotIndex(); 4686f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int StackLocalNamesIndex(); 4687f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int ContextLocalNamesIndex(); 4688f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int ContextLocalInfosIndex(); 4689f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int ReceiverInfoIndex(); 4690f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int FunctionNameInfoIndex(); 4691f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int OuterScopeInfoIndex(); 4692f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int ModuleInfoIndex(); 4693f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int ModuleVariableCountIndex(); 4694f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int ModuleVariablesIndex(); 46953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int Lookup(Handle<String> name, int start, int end, VariableMode* mode, 4697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch VariableLocation* location, InitializationFlag* init_flag, 4698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaybeAssignedFlag* maybe_assigned_flag); 4699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4700c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Get metadata of i-th MODULE-allocated variable, where 0 <= i < 4701c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // ModuleVariableCount. The metadata is returned via out-arguments, which may 4702c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // be nullptr if the corresponding information is not requested 4703c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void ModuleVariable(int i, String** name, int* index, 4704c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch VariableMode* mode = nullptr, 4705c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch InitializationFlag* init_flag = nullptr, 4706c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MaybeAssignedFlag* maybe_assigned_flag = nullptr); 4707c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 4708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Used for the function name variable for named function expressions, and for 4709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the receiver. 4710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum VariableAllocationInfo { NONE, STACK, CONTEXT, UNUSED }; 47113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Properties of scopes. 4713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier class ScopeTypeField : public BitField<ScopeType, 0, 4> {}; 4714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class CallsEvalField : public BitField<bool, ScopeTypeField::kNext, 1> {}; 4715f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(LANGUAGE_END == 2); 4716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class LanguageModeField 4717f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : public BitField<LanguageMode, CallsEvalField::kNext, 1> {}; 4718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class DeclarationScopeField 4719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, LanguageModeField::kNext, 1> {}; 4720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class ReceiverVariableField 4721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<VariableAllocationInfo, DeclarationScopeField::kNext, 4722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2> {}; 4723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class HasNewTargetField 4724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, ReceiverVariableField::kNext, 1> {}; 4725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class FunctionVariableField 4726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<VariableAllocationInfo, HasNewTargetField::kNext, 2> {}; 4727f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class AsmModuleField 4728f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : public BitField<bool, FunctionVariableField::kNext, 1> {}; 4729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class AsmFunctionField : public BitField<bool, AsmModuleField::kNext, 1> {}; 4730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class HasSimpleParametersField 4731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, AsmFunctionField::kNext, 1> {}; 4732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class FunctionKindField 4733f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : public BitField<FunctionKind, HasSimpleParametersField::kNext, 10> {}; 4734f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class HasOuterScopeInfoField 4735f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : public BitField<bool, FunctionKindField::kNext, 1> {}; 4736f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class IsDebugEvaluateScopeField 4737f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : public BitField<bool, HasOuterScopeInfoField::kNext, 1> {}; 47383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4739f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Properties of variables. 4740f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class VariableModeField : public BitField<VariableMode, 0, 3> {}; 4741f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class InitFlagField : public BitField<InitializationFlag, 3, 1> {}; 4742f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class MaybeAssignedFlagField : public BitField<MaybeAssignedFlag, 4, 1> {}; 4743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class ScopeIterator; 47453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 47463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 474780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// The cache for maps used by normalized (dictionary mode) objects. 474880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Such maps do not have property descriptors, so a typical program 474980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// needs very limited number of distinct normalized maps. 475080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenclass NormalizedMapCache: public FixedArray { 475180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen public: 4752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<NormalizedMapCache> New(Isolate* isolate); 475380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 4754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT MaybeHandle<Map> Get(Handle<Map> fast_map, 4755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyNormalizationMode mode); 4756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Set(Handle<Map> fast_map, Handle<Map> normalized_map); 475780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 475880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen void Clear(); 475980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 4760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(NormalizedMapCache) 476180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 4762109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline bool IsNormalizedMapCache(const HeapObject* obj); 4763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(NormalizedMapCache) 4765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEntries = 64; 4767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int GetIndex(Handle<Map> map); 4769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The following declarations hide base class methods. 4771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* get(int index); 4772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set(int index, Object* value); 477380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}; 477480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 4775f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// HandlerTable is a fixed array containing entries for exception handlers in 4776f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// the code object it is associated with. The tables comes in two flavors: 4777f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 1) Based on ranges: Used for unoptimized code. Contains one entry per 4778f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// exception handler and a range representing the try-block covered by that 4779f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// handler. Layout looks as follows: 4780f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// [ range-start , range-end , handler-offset , handler-data ] 4781f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 2) Based on return addresses: Used for turbofanned code. Contains one entry 4782f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// per call-site that could throw an exception. Layout looks as follows: 4783f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// [ return-address-offset , handler-offset ] 4784f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass HandlerTable : public FixedArray { 4785f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 4786f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Conservative prediction whether a given handler will locally catch an 4787f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // exception or cause a re-throw to outside the code boundary. Since this is 4788f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // undecidable it is merely an approximation (e.g. useful for debugger). 4789f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum CatchPrediction { 4790f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNCAUGHT, // The handler will (likely) rethrow the exception. 4791f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CAUGHT, // The exception will be caught by the handler. 4792f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PROMISE, // The exception will be caught and cause a promise rejection. 4793f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DESUGARING, // The exception will be caught, but both the exception and the 4794f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // catching are part of a desugaring and should therefore not 4795f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // be visible to the user (we won't notify the debugger of such 4796f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // exceptions). 4797f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ASYNC_AWAIT, // The exception will be caught and cause a promise rejection 4798f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // in the desugaring of an async function, so special 4799f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // async/await handling in the debugger can take place. 4800f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 4801f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4802f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Getters for handler table based on ranges. 4803f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int GetRangeStart(int index) const; 4804f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int GetRangeEnd(int index) const; 4805f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int GetRangeHandler(int index) const; 4806f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int GetRangeData(int index) const; 4807f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4808f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Setters for handler table based on ranges. 4809f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetRangeStart(int index, int value); 4810f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetRangeEnd(int index, int value); 4811f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetRangeHandler(int index, int offset, CatchPrediction pred); 4812f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetRangeData(int index, int value); 4813f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4814f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Setters for handler table based on return addresses. 4815f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetReturnOffset(int index, int value); 4816f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetReturnHandler(int index, int offset); 4817f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4818f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Lookup handler in a table based on ranges. 4819f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int LookupRange(int pc_offset, int* data, CatchPrediction* prediction); 4820f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4821f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Lookup handler in a table based on return addresses. 4822f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int LookupReturn(int pc_offset); 4823f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4824f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns the number of entries in the table. 4825f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int NumberOfRangeEntries() const; 4826f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4827f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns the required length of the underlying fixed array. 4828f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int LengthForRange(int entries) { return entries * kRangeEntrySize; } 4829f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int LengthForReturn(int entries) { return entries * kReturnEntrySize; } 4830f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4831f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(HandlerTable) 4832f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4833f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifdef ENABLE_DISASSEMBLER 4834f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void HandlerTableRangePrint(std::ostream& os); // NOLINT 4835f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void HandlerTableReturnPrint(std::ostream& os); // NOLINT 4836f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif 4837f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4838f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 4839f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Layout description for handler table based on ranges. 4840f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeStartIndex = 0; 4841f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeEndIndex = 1; 4842f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeHandlerIndex = 2; 4843f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeDataIndex = 3; 4844f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeEntrySize = 4; 4845f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4846f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Layout description for handler table based on return addresses. 4847f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kReturnOffsetIndex = 0; 4848f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kReturnHandlerIndex = 1; 4849f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kReturnEntrySize = 2; 4850f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4851f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Encoding of the {handler} field. 4852f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class HandlerPredictionField : public BitField<CatchPrediction, 0, 3> {}; 4853f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class HandlerOffsetField : public BitField<int, 3, 29> {}; 4854f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 485580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 48563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ByteArray represents fixed sized byte arrays. Used for the relocation info 48573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// that is attached to code objects. 485869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass ByteArray: public FixedArrayBase { 4859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 4860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int Size(); 48613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setter and getter. 4863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline byte get(int index); 4864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, byte value); 4865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4866bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Copy in / copy out whole byte slices. 4867bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline void copy_out(int index, byte* buffer, int length); 4868bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline void copy_in(int index, const byte* buffer, int length); 4869bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 4870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Treat contents as an int array. 4871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int get_int(int index); 4872bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline void set_int(int index, int value); 4873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int SizeFor(int length) { 48757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return OBJECT_POINTER_ALIGN(kHeaderSize + length); 4876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // We use byte arrays for free blocks in the heap. Given a desired size in 4878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // bytes that is a multiple of the word size and big enough to hold a byte 4879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // array, this function returns the number of elements a byte array should 4880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // have. 4881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int LengthFor(int size_in_bytes) { 4882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsAligned(size_in_bytes, kPointerSize)); 4883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(size_in_bytes >= kHeaderSize); 4884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return size_in_bytes - kHeaderSize; 4885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns data start address. 4888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Address GetDataStartAddress(); 4889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns a pointer to the ByteArray object for a given data start address. 4891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline ByteArray* FromDataStartAddress(Address address); 48923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(ByteArray) 48943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 4896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int ByteArraySize(); 4897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(ByteArray) 4898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(ByteArray) 4899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 4901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); 4902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maximal memory consumption for a single ByteArray. 4904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxSize = 512 * MB; 4905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maximal length of a single ByteArray. 4906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxLength = kMaxSize - kHeaderSize; 49073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 49083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block private: 4909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ByteArray); 49103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 49113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4912c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// Wrapper class for ByteArray which can store arbitrary C++ classes, as long 4913c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// as they can be copied with memcpy. 4914c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochtemplate <class T> 4915c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass PodArray : public ByteArray { 4916c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 4917c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<PodArray<T>> New(Isolate* isolate, int length, 4918c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PretenureFlag pretenure = NOT_TENURED); 4919c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void copy_out(int index, T* result) { 4920c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ByteArray::copy_out(index * sizeof(T), reinterpret_cast<byte*>(result), 4921c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch sizeof(T)); 4922c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 4923c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch T get(int index) { 4924c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch T result; 4925c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch copy_out(index, &result); 4926c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return result; 4927c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 4928c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void set(int index, const T& value) { 4929c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch copy_in(index * sizeof(T), reinterpret_cast<const byte*>(&value), 4930c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch sizeof(T)); 4931c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 4932c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int length() { return ByteArray::length() / sizeof(T); } 4933c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(PodArray<T>) 4934c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 4935c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 4936c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PodArray<T>); 4937c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 49383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// BytecodeArray represents a sequence of interpreter bytecodes. 4940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass BytecodeArray : public FixedArrayBase { 49413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block public: 4942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static int SizeFor(int length) { 4943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return OBJECT_POINTER_ALIGN(kHeaderSize + length); 4944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 49453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Setter and getter 4947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline byte get(int index); 4948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set(int index, byte value); 49493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns data start address. 4951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Address GetFirstBytecodeAddress(); 49523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessors for frame size. 4954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int frame_size() const; 4955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_frame_size(int frame_size); 49563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessor for register count (derived from frame_size). 4958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int register_count() const; 49593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessors for parameter count (including implicit 'this' receiver). 4961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int parameter_count() const; 4962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_parameter_count(int number_of_parameters); 49633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4964109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Accessors for profiling count. 4965109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline int interrupt_budget() const; 4966109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline void set_interrupt_budget(int interrupt_budget); 4967109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4968f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Accessors for OSR loop nesting level. 4969f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int osr_loop_nesting_level() const; 4970f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_osr_loop_nesting_level(int depth); 4971f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessors for the constant pool. 4973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(constant_pool, FixedArray) 49743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4975109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Accessors for handler table containing offsets of exception handlers. 4976109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(handler_table, FixedArray) 4977109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4978109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Accessors for source position table containing mappings between byte code 4979109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // offset and source position. 49803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DECL_ACCESSORS(source_position_table, ByteArray) 4981109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(BytecodeArray) 49833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 4985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int BytecodeArraySize(); 49863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4987109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline int instruction_size(); 4988109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 498913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of bytecode and its metadata. This includes the size of 499013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // bytecode, constant pool, source position table, and handler table. 499113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int SizeIncludingMetadata(); 499213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 4993109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int SourcePosition(int offset); 4994109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int SourceStatementPosition(int offset); 4995109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(BytecodeArray) 4997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(BytecodeArray) 49983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Disassemble(std::ostream& os); 50003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 5001109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void CopyBytecodesTo(BytecodeArray* to); 5002109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 5003f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int LookupRangeInHandlerTable(int code_offset, int* data, 5004f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch HandlerTable::CatchPrediction* prediction); 5005f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 5007109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConstantPoolOffset = FixedArrayBase::kHeaderSize; 5008109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kHandlerTableOffset = kConstantPoolOffset + kPointerSize; 5009109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSourcePositionTableOffset = 5010109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kHandlerTableOffset + kPointerSize; 5011109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kFrameSizeOffset = kSourcePositionTableOffset + kPointerSize; 5012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kParameterSizeOffset = kFrameSizeOffset + kIntSize; 5013109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kInterruptBudgetOffset = kParameterSizeOffset + kIntSize; 5014f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kOSRNestingLevelOffset = kInterruptBudgetOffset + kIntSize; 5015f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kHeaderSize = kOSRNestingLevelOffset + kCharSize; 50163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 5017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maximal memory consumption for a single BytecodeArray. 5018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxSize = 512 * MB; 5019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maximal length of a single BytecodeArray. 5020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxLength = kMaxSize - kHeaderSize; 50213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 5022f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kPointerFieldsBeginOffset = kConstantPoolOffset; 5023f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kPointerFieldsEndOffset = kFrameSizeOffset; 5024f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5025f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 5026f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kPointerFieldsEndOffset, kHeaderSize> 5027f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MarkingBodyDescriptor; 5028f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 5029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 50303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 50313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block private: 5032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArray); 50333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 50343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 50353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 5036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// FreeSpace are fixed-size free memory blocks used by the heap and GC. 5037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// They look like heap objects (are heap object tagged and have a map) so that 5038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// the heap remains iterable. They have a size and a next pointer. 5039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The next pointer is the raw address of the next FreeSpace object (or NULL) 5040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// in the free list. 5041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FreeSpace: public HeapObject { 5042257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 5043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [size]: size of the free space including the header. 5044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int size() const; 5045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_size(int value); 5046257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int nobarrier_size() const; 5048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void nobarrier_set_size(int value); 5049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int Size(); 5051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessors for the next field. 5053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline FreeSpace* next(); 5054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_next(FreeSpace* next); 5055257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline static FreeSpace* cast(HeapObject* obj); 5057257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 5059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(FreeSpace) 5060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(FreeSpace) 5061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 5063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Size is smi tagged when it is stored. 5064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSizeOffset = HeapObject::kHeaderSize; 5065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNextOffset = POINTER_SIZE_ALIGN(kSizeOffset + kPointerSize); 5066f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kSize = kNextOffset + kPointerSize; 5067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FreeSpace); 5070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 5071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// V has parameters (Type, type, TYPE, C type, element_size) 5074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAYS(V) \ 5075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Uint8, uint8, UINT8, uint8_t, 1) \ 5076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Int8, int8, INT8, int8_t, 1) \ 5077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Uint16, uint16, UINT16, uint16_t, 2) \ 5078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Int16, int16, INT16, int16_t, 2) \ 5079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Uint32, uint32, UINT32, uint32_t, 4) \ 5080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Int32, int32, INT32, int32_t, 4) \ 5081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Float32, float32, FLOAT32, float, 4) \ 5082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Float64, float64, FLOAT64, double, 8) \ 5083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Uint8Clamped, uint8_clamped, UINT8_CLAMPED, uint8_t, 1) 5084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FixedTypedArrayBase: public FixedArrayBase { 5087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [base_pointer]: Either points to the FixedTypedArrayBase itself or nullptr. 5089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(base_pointer, Object) 5090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [external_pointer]: Contains the offset between base_pointer and the start 5092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // of the data. If the base_pointer is a nullptr, the external_pointer 5093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // therefore points to the actual backing store. 5094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(external_pointer, void) 5095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 5097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedTypedArrayBase) 5098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBasePointerOffset = FixedArrayBase::kHeaderSize; 5100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kExternalPointerOffset = kBasePointerOffset + kPointerSize; 5101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHeaderSize = 5102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DOUBLE_POINTER_ALIGN(kExternalPointerOffset + kPointerSize); 5103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDataOffset = kHeaderSize; 5105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 5107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int size(); 5109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int TypedArraySize(InstanceType type, int length); 5111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int TypedArraySize(InstanceType type); 5112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use with care: returns raw pointer into heap. 5114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void* DataPtr(); 5115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int DataSize(); 5117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int ElementSize(InstanceType type); 5120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int DataSize(InstanceType type); 5122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArrayBase); 5124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 5125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits> 5128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FixedTypedArray: public FixedTypedArrayBase { 5129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef typename Traits::ElementType ElementType; 5131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const InstanceType kInstanceType = Traits::kInstanceType; 5132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedTypedArray<Traits>) 5134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline ElementType get_scalar(int index); 5136109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline Handle<Object> get(FixedTypedArray* array, int index); 5137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set(int index, ElementType value); 5138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline ElementType from_int(int value); 5140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline ElementType from_double(double value); 5141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This accessor applies the correct conversion from Smi, HeapNumber 5143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and undefined. 5144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetValue(uint32_t index, Object* value); 5145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(FixedTypedArray) 5147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(FixedTypedArray) 5148257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5149257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 5150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArray); 5151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 5152257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIXED_TYPED_ARRAY_TRAITS(Type, type, TYPE, elementType, size) \ 5154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Type##ArrayTraits { \ 5155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: /* NOLINT */ \ 5156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef elementType ElementType; \ 5157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const InstanceType kInstanceType = FIXED_##TYPE##_ARRAY_TYPE; \ 5158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const char* Designator() { return #type " array"; } \ 5159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> ToHandle(Isolate* isolate, \ 5160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elementType scalar); \ 5161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline elementType defaultValue(); \ 5162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; \ 5163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 5164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef FixedTypedArray<Type##ArrayTraits> Fixed##Type##Array; 5165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTYPED_ARRAYS(FIXED_TYPED_ARRAY_TRAITS) 5167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIXED_TYPED_ARRAY_TRAITS 5169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DeoptimizationInputData is a fixed array used to hold the deoptimization 5171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// data for code generated by the Hydrogen/Lithium compiler. It also 5172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contains information about functions that were inlined. If N different 5173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// functions were inlined then first N elements of the literal array will 5174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contain these functions. 5175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 5176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// It can be empty. 5177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass DeoptimizationInputData: public FixedArray { 5178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Layout description. Indices in the array. 5180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kTranslationByteArrayIndex = 0; 5181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kInlinedFunctionCountIndex = 1; 5182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kLiteralArrayIndex = 2; 5183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kOsrAstIdIndex = 3; 5184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kOsrPcOffsetIndex = 4; 5185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kOptimizationIdIndex = 5; 5186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSharedFunctionInfoIndex = 6; 5187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kWeakCellCacheIndex = 7; 5188c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kInliningPositionsIndex = 8; 5189c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kFirstDeoptEntryIndex = 9; 5190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Offsets of deopt entry elements relative to the start of the entry. 5192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAstIdRawOffset = 0; 5193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kTranslationIndexOffset = 1; 5194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kArgumentsStackHeightOffset = 2; 51952b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch static const int kPcOffset = 3; 51962b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch static const int kDeoptEntrySize = 4; 5197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Simple element accessors. 5199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECLARE_ELEMENT_ACCESSORS(name, type) \ 5200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline type* name(); \ 5201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Set##name(type* value); 5202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(TranslationByteArray, ByteArray) 5204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(InlinedFunctionCount, Smi) 5205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(LiteralArray, FixedArray) 5206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(OsrAstId, Smi) 5207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(OsrPcOffset, Smi) 5208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(OptimizationId, Smi) 5209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(SharedFunctionInfo, Object) 5210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(WeakCellCache, Object) 5211c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_ELEMENT_ACCESSORS(InliningPositions, PodArray<InliningPosition>) 521285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 5213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECLARE_ELEMENT_ACCESSORS 5214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Accessors for elements of the ith deoptimization entry. 5216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECLARE_ENTRY_ACCESSORS(name, type) \ 5217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline type* name(int i); \ 5218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Set##name(int i, type* value); 5219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ENTRY_ACCESSORS(AstIdRaw, Smi) 5221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ENTRY_ACCESSORS(TranslationIndex, Smi) 5222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ENTRY_ACCESSORS(ArgumentsStackHeight, Smi) 5223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ENTRY_ACCESSORS(Pc, Smi) 5224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECLARE_ENTRY_ACCESSORS 5226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline BailoutId AstId(int i); 5228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetAstId(int i, BailoutId value); 5230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int DeoptCount(); 5232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5233c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNotInlinedIndex = -1; 5234c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 5235c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns the inlined function at the given position in LiteralArray, or the 5236c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // outer function if index == kNotInlinedIndex. 5237c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch class SharedFunctionInfo* GetInlinedFunction(int index); 5238c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 5239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Allocates a DeoptimizationInputData. 5240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<DeoptimizationInputData> New(Isolate* isolate, 5241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int deopt_entry_count, 5242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure); 5243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DeoptimizationInputData) 5245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 52463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#ifdef ENABLE_DISASSEMBLER 5247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void DeoptimizationInputDataPrint(std::ostream& os); // NOLINT 5248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 5249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 5251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int IndexForEntry(int i) { 5252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kFirstDeoptEntryIndex + (i * kDeoptEntrySize); 5253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int LengthFor(int entry_count) { return IndexForEntry(entry_count); } 5257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DeoptimizationOutputData is a fixed array used to hold the deoptimization 5260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// data for code generated by the full compiler. 5261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// The format of the these objects is 5262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// [i * 2]: Ast ID for ith deoptimization. 5263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// [i * 2 + 1]: PC and state of ith deoptimization 5264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass DeoptimizationOutputData: public FixedArray { 5265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int DeoptPoints(); 5267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline BailoutId AstId(int index); 5269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetAstId(int index, BailoutId id); 5271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Smi* PcAndState(int index); 5273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetPcAndState(int index, Smi* offset); 5274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int LengthOfFixedArray(int deopt_points) { 5276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return deopt_points * 2; 5277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Allocates a DeoptimizationOutputData. 5280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<DeoptimizationOutputData> New(Isolate* isolate, 5281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int number_of_deopt_points, 5282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure); 5283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DeoptimizationOutputData) 5285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5286109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#ifdef ENABLE_DISASSEMBLER 5287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void DeoptimizationOutputDataPrint(std::ostream& os); // NOLINT 5288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 5289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// A literals array contains the literals for a JSFunction. It also holds 5293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// the type feedback vector. 5294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LiteralsArray : public FixedArray { 5295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 5296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kVectorIndex = 0; 5297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFirstLiteralIndex = 1; 5298c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE static const int kFeedbackVectorOffset; 529913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kOffsetToFirstLiteral; 5300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static int OffsetOfLiteralAt(int index) { 530213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return OffsetOfElementAt(index + kFirstLiteralIndex); 5303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline TypeFeedbackVector* feedback_vector() const; 5306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_feedback_vector(TypeFeedbackVector* vector); 5307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* literal(int literal_index) const; 5308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_literal(int literal_index, Object* literal); 530913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline void set_literal_undefined(int literal_index); 5310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int literals_count() const; 5311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<LiteralsArray> New(Isolate* isolate, 5313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<TypeFeedbackVector> vector, 5314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int number_of_literals, 5315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PretenureFlag pretenure = TENURED); 5316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(LiteralsArray) 5318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 5320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* get(int index) const; 5321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set(int index, Object* value); 5322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set(int index, Smi* value); 5323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set(int index, Object* value, WriteBarrierMode mode); 5324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 5325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass TemplateList : public FixedArray { 5328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 5329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<TemplateList> New(Isolate* isolate, int size); 5330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int length() const; 5331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline Object* get(int index) const; 5332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set(int index, Object* value); 5333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<TemplateList> Add(Isolate* isolate, Handle<TemplateList> list, 5334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> value); 5335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(TemplateList) 5336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 5337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kLengthIndex = 0; 5338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kFirstElementIndex = kLengthIndex + 1; 5339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(TemplateList); 5340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 5341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Code describes objects with on-the-fly generated machine code. 5343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Code: public HeapObject { 5344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 5345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Opaque data type for encapsulating code flags like kind, inline 5346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // cache state, and arguments count. 5347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef uint32_t Flags; 5348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NON_IC_KIND_LIST(V) \ 5350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FUNCTION) \ 5351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(OPTIMIZED_FUNCTION) \ 53523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(BYTECODE_HANDLER) \ 5353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(STUB) \ 5354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HANDLER) \ 5355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BUILTIN) \ 5356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(REGEXP) \ 53573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(WASM_FUNCTION) \ 53583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(WASM_TO_JS_FUNCTION) \ 53593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(JS_TO_WASM_FUNCTION) 5360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define IC_KIND_LIST(V) \ 5362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LOAD_IC) \ 536313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(LOAD_GLOBAL_IC) \ 5364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(KEYED_LOAD_IC) \ 5365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CALL_IC) \ 5366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(STORE_IC) \ 5367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(KEYED_STORE_IC) \ 5368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BINARY_OP_IC) \ 5369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(COMPARE_IC) \ 5370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TO_BOOLEAN_IC) 5371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CODE_KIND_LIST(V) \ 5373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NON_IC_KIND_LIST(V) \ 5374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IC_KIND_LIST(V) 5375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum Kind { 5377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DEFINE_CODE_KIND_ENUM(name) name, 5378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_KIND_LIST(DEFINE_CODE_KIND_ENUM) 5379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DEFINE_CODE_KIND_ENUM 5380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NUMBER_OF_KINDS 5381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 5382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const char* Kind2String(Kind kind); 5384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrologueOffsetNotSet = -1; 5386b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 5387c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) 5388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Printing 5389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const char* ICState2String(InlineCacheState state); 5390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void PrintExtraICState(std::ostream& os, // NOLINT 5391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind, ExtraICState extra); 5392c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#endif // defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) 5393c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 5394c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#ifdef ENABLE_DISASSEMBLER 5395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Disassemble(const char* name, std::ostream& os); // NOLINT 5396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // ENABLE_DISASSEMBLER 5397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [instruction_size]: Size of the native instructions 5399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int instruction_size() const; 5400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_instruction_size(int value); 5401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5402ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke // [relocation_info]: Code relocation information 5403ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke DECL_ACCESSORS(relocation_info, ByteArray) 5404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InvalidateRelocation(); 5405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InvalidateEmbeddedObjects(); 5406ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 54073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [handler_table]: Fixed array containing offsets of exception handlers. 54083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(handler_table, FixedArray) 54093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // [deoptimization_data]: Array containing data for deopt. 5411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DECL_ACCESSORS(deoptimization_data, FixedArray) 5412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // [source_position_table]: ByteArray for the source positions table. 5414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_ACCESSORS(source_position_table, ByteArray) 5415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [raw_type_feedback_info]: This field stores various things, depending on 5417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the kind of the code object. 5418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FUNCTION => type feedback information. 5419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // STUB and ICs => major/minor key as Smi. 5420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(raw_type_feedback_info, Object) 5421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* type_feedback_info(); 5422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_type_feedback_info( 5423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* value, WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 5424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint32_t stub_key(); 5425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_stub_key(uint32_t key); 5426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [next_code_link]: Link for lists of optimized or deoptimized code. 5428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note that storage for this field is overlapped with typefeedback_info. 5429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(next_code_link, Object) 54303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 54313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [gc_metadata]: Field used to hold GC related metadata. The contents of this 5432257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // field does not have to be traced during garbage collection since 5433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // it is only used by the garbage collector itself. 54343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(gc_metadata, Object) 54353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 54363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [ic_age]: Inline caching age: the value of the Heap::global_ic_age 54373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // at the moment when this object was created. 54383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_ic_age(int count); 5439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int ic_age() const; 5440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [prologue_offset]: Offset of the function prologue, used for aging 5442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FUNCTIONs and OPTIMIZED_FUNCTIONs. 5443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int prologue_offset() const; 5444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_prologue_offset(int offset); 54455d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 5446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [constant_pool offset]: Offset of the constant pool. 5447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Valid for FLAG_enable_embedded_constant_pool only 5448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int constant_pool_offset() const; 5449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_constant_pool_offset(int offset); 5450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Unchecked accessors to be used during GC. 5452ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke inline ByteArray* unchecked_relocation_info(); 5453ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 5454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int relocation_size(); 5455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [flags]: Various code flags. 5457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Flags flags(); 5458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_flags(Flags flags); 5459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [flags]: Access to specific code flags. 5461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Kind kind(); 5462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch inline ExtraICState extra_ic_state(); // Only valid for IC stubs. 5463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Testers for IC stub kinds. 5465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool is_inline_cache_stub(); 5466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_debug_stub(); 5467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_handler(); 5468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_call_stub(); 5469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_binary_op_stub(); 5470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_compare_ic_stub(); 5471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_to_boolean_ic_stub(); 5472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_optimized_code(); 54733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool is_wasm_code(); 5474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsCodeStubOrIC(); 5476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_raw_kind_specific_flags1(int value); 5478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_raw_kind_specific_flags2(int value); 5479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5480109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Testers for interpreter builtins. 548113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool is_interpreter_trampoline_builtin(); 5482109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 5483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [is_crankshafted]: For kind STUB or ICs, tells whether or not a code 5484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object was generated by either the hydrogen or the TurboFan optimizing 5485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // compiler (but it may not be an optimized function). 5486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_crankshafted(); 5487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_hydrogen_stub(); // Crankshafted, but not a function. 5488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_is_crankshafted(bool value); 5489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [is_turbofanned]: For kind STUB or OPTIMIZED_FUNCTION, tells whether the 5491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // code object was generated by the TurboFan optimizing compiler. 5492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_turbofanned(); 5493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_is_turbofanned(bool value); 54943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [can_have_weak_objects]: For kind OPTIMIZED_FUNCTION, tells whether the 5496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // embedded objects in code should be treated weakly. 5497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool can_have_weak_objects(); 5498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_can_have_weak_objects(bool value); 5499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5500f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // [is_construct_stub]: For kind BUILTIN, tells whether the code object 5501f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // represents a hand-written construct stub 5502f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // (e.g., NumberConstructor_ConstructStub). 5503f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool is_construct_stub(); 5504f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_is_construct_stub(bool value); 5505f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // [has_deoptimization_support]: For FUNCTION kind, tells if it has 5507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // deoptimization support. 5508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline bool has_deoptimization_support(); 5509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_has_deoptimization_support(bool value); 5510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5511589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // [has_debug_break_slots]: For FUNCTION kind, tells if it has 5512589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // been compiled with debug break slots. 5513589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch inline bool has_debug_break_slots(); 5514589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch inline void set_has_debug_break_slots(bool value); 5515589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 5516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // [has_reloc_info_for_serialization]: For FUNCTION kind, tells if its 5517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // reloc info includes runtime and external references to support 5518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // serialization/deserialization. 5519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool has_reloc_info_for_serialization(); 5520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_has_reloc_info_for_serialization(bool value); 5521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // [allow_osr_at_loop_nesting_level]: For FUNCTION kind, tells for 5523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // how long the function has been marked for OSR and therefore which 5524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // level of loop nesting we are willing to do on-stack replacement 5525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // for. 5526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_allow_osr_at_loop_nesting_level(int level); 5527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline int allow_osr_at_loop_nesting_level(); 5528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 55298f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch // [profiler_ticks]: For FUNCTION kind, tells for how many profiler ticks 55308f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch // the code object was seen on the stack with no IC patching going on. 55318f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline int profiler_ticks(); 55328f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline void set_profiler_ticks(int ticks); 55338f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 5534f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // [builtin_index]: For builtins, tells which builtin index the code object 5535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // has. Note that builtins can have a code kind other than BUILTIN. The 5536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // builtin index is a non-negative integer for builtins, and -1 otherwise. 5537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int builtin_index(); 5538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_builtin_index(int id); 5539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // [stack_slots]: For kind OPTIMIZED_FUNCTION, the number of stack slots 5541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // reserved in the code prologue. 5542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline unsigned stack_slots(); 5543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_stack_slots(unsigned slots); 5544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [safepoint_table_start]: For kind OPTIMIZED_FUNCTION, the offset in 5546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the instruction stream where the safepoint table starts. 55471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block inline unsigned safepoint_table_offset(); 55481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block inline void set_safepoint_table_offset(unsigned offset); 5549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [back_edge_table_start]: For kind FUNCTION, the offset in the 5551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // instruction stream where the back edge table starts. 5552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline unsigned back_edge_table_offset(); 5553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_back_edge_table_offset(unsigned offset); 5554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool back_edges_patched_for_osr(); 5556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 555769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // [to_boolean_foo]: For kind TO_BOOLEAN_IC tells what state the stub is in. 5558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint16_t to_boolean_state(); 5559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [marked_for_deoptimization]: For kind OPTIMIZED_FUNCTION tells whether 5561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the code is going to be deoptimized because of dead embedded maps. 5562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool marked_for_deoptimization(); 5563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_marked_for_deoptimization(bool flag); 5564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [constant_pool]: The constant pool for this function. 5566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Address constant_pool(); 5567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5568b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Get the safepoint entry for the given pc. 5569b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch SafepointEntry GetSafepointEntry(Address pc); 5570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find an object in a stub with a specified map 5572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* FindNthObject(int n, Map* match_map); 5573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find the first allocation site in an IC stub. 5575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSite* FindFirstAllocationSite(); 5576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Find the first map in an IC stub. 5578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Map* FindFirstMap(); 55793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class FindAndReplacePattern; 5581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For each (map-to-find, object-to-replace) pair in the pattern, this 5582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // function replaces the corresponding placeholder in the code with the 5583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object-to-replace. The function assumes that pairs in the pattern come in 5584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the same order as the placeholders in the code. 5585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the placeholder is a weak cell, then the value of weak cell is matched 5586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // against the map-to-find. 5587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void FindAndReplace(const FindAndReplacePattern& pattern); 5588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The entire code object including its header is copied verbatim to the 5590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // snapshot so that it can be written in one, fast, memcpy during 5591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deserialization. The deserializer will overwrite some pointers, rather 5592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // like a runtime linker, but the random allocation addresses used in the 5593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // mksnapshot process would still be present in the unlinked snapshot data, 5594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which would make snapshot production non-reproducible. This method wipes 5595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // out the to-be-overwritten header data for reproducible snapshots. 5596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void WipeOutHeader(); 55973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Flags operations. 5599b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static inline Flags ComputeFlags( 5600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind, ExtraICState extra_ic_state = kNoExtraICState, 5601bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch CacheHolderFlag holder = kCacheOnReceiver); 5602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Flags ComputeHandlerFlags( 5604bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Kind handler_kind, CacheHolderFlag holder = kCacheOnReceiver); 5605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline CacheHolderFlag ExtractCacheHolderFromFlags(Flags flags); 5607589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static inline Kind ExtractKindFromFlags(Flags flags); 5608589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags); 5609589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 5610bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static inline Flags RemoveHolderFromFlags(Flags flags); 5611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert a target address into a code object. 5613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Code* GetCodeFromTargetAddress(Address address); 5614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5615791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // Convert an entry address into an object. 5616791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block static inline Object* GetObjectFromEntryAddress(Address location_of_address); 5617791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 5618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the address of the first instruction. 5619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline byte* instruction_start(); 5620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5621ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke // Returns the address right after the last instruction. 5622ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke inline byte* instruction_end(); 5623ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 562413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of the instructions, padding, relocation and unwinding 562513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // information. 5626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int body_size(); 5627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 562813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of code and its metadata. This includes the size of code 562913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // relocation information, deoptimization data and handler table. 563013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int SizeIncludingMetadata(); 563113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the address of the first relocation info (read backwards!). 5633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline byte* relocation_start(); 5634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 563513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [has_unwinding_info]: Whether this code object has unwinding information. 563613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // If it doesn't, unwinding_information_start() will point to invalid data. 563713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 563813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // The body of all code objects has the following layout. 563913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 564013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- instruction_start() 564113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | instructions | 564213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | ... | 564313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ 564413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | relocation info | 564513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | ... | 564613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- instruction_end() 564713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 564813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // If has_unwinding_info() is false, instruction_end() points to the first 564913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // memory location after the end of the code object. Otherwise, the body 565013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // continues as follows: 565113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 565213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ 565313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | padding to the next | 565413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | 8-byte aligned address | 565513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- instruction_end() 565613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | [unwinding_info_size] | 565713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | as uint64_t | 565813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- unwinding_info_start() 565913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | unwinding info | 566013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | ... | 566113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- unwinding_info_end() 566213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 566313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // and unwinding_info_end() points to the first memory location after the end 566413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // of the code object. 566513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 566613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_BOOLEAN_ACCESSORS(has_unwinding_info) 566713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 566813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [unwinding_info_size]: Size of the unwinding information. 566913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int unwinding_info_size() const; 567013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline void set_unwinding_info_size(int value); 567113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 567213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the address of the unwinding information, if any. 567313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline byte* unwinding_info_start(); 567413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 567513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the address right after the end of the unwinding information. 567613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline byte* unwinding_info_end(); 567713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code entry point. 5679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline byte* entry(); 5680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns true if pc is inside this object's instructions. 5682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool contains(byte* pc); 5683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Relocate the code by delta bytes. Called to signal that this code 5685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // object has been moved by delta bytes. 5686d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block void Relocate(intptr_t delta); 5687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Migrate code described by desc. 5689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void CopyFrom(const CodeDesc& desc); 5690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56913bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch // Returns the object size for a given body (used for allocation). 56923bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch static int SizeFor(int body_size) { 5693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_SIZE_TAG_ALIGNED(body_size); 56943bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch return RoundUp(kHeaderSize + body_size, kCodeAlignment); 5695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 5696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Calculate the size of the code object to report for log events. This takes 5698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the layout of the code object into account. 5699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int ExecutableSize(); 5700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Code) 5702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 5704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int CodeSize(); 5705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Code) 5707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Code) 5708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 57098f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch void ClearInlineCaches(); 5710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset); 5712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t TranslateAstIdToPcOffset(BailoutId ast_id); 5713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5714f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int LookupRangeInHandlerTable(int code_offset, int* data, 5715f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch HandlerTable::CatchPrediction* prediction); 5716f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge, 5718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Age { 5719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kToBeExecutedOnceCodeAge = -3, 5720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNotExecutedCodeAge = -2, 5721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kExecutedOnceCodeAge = -1, 5722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNoAgeCodeAge = 0, 5723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_AGE_LIST(DECLARE_CODE_AGE_ENUM) 5724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAfterLastCodeAge, 5725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kFirstCodeAge = kToBeExecutedOnceCodeAge, 5726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLastCodeAge = kAfterLastCodeAge - 1, 5727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kCodeAgeCount = kAfterLastCodeAge - kFirstCodeAge - 1, 5728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsOldCodeAge = kSexagenarianCodeAge, 5729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPreAgedCodeAge = kIsOldCodeAge - 1 5730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 5731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_CODE_AGE_ENUM 5732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Code aging. Indicates how many full GCs this code has survived without 5734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // being entered through the prologue. Used to determine when it is 5735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // relatively safe to flush this code object and replace it with the lazy 5736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // compilation stub. 5737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate); 5738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MarkCodeAsExecuted(byte* sequence, Isolate* isolate); 5739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void MakeYoung(Isolate* isolate); 57403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void PreAge(Isolate* isolate); 5741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void MarkToBeExecutedOnce(Isolate* isolate); 5742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MakeOlder(MarkingParity); 5743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool IsYoungSequence(Isolate* isolate, byte* sequence); 5744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsOld(); 5745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Age GetAge(); 5746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Code* GetPreAgedCodeAgeStub(Isolate* isolate) { 5747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GetCodeAgeStub(isolate, kNotExecutedCodeAge, NO_MARKING_PARITY); 5748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDeoptLocation(FILE* out, Address pc); 5751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanDeoptAt(Address pc); 5752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 5754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void VerifyEmbeddedObjectsDependency(); 5755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 5756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef DEBUG 5758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum VerifyMode { kNoContextSpecificPointers, kNoContextRetainingPointers }; 5759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void VerifyEmbeddedObjects(VerifyMode mode = kNoContextRetainingPointers); 5760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void VerifyRecompiledCode(Code* old_code, Code* new_code); 5761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif // DEBUG 5762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool CanContainWeakObjects(); 5764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsWeakObject(Object* object); 5766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsWeakObjectInOptimizedCode(Object* object); 5768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<WeakCell> WeakCellFor(Handle<Code> code); 5770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCell* CachedWeakCell(); 5771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kConstantPoolSize = 5773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FLAG_enable_embedded_constant_pool ? kIntSize : 0; 5774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 5776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kRelocationInfoOffset = HeapObject::kHeaderSize; 57773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize; 5778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kDeoptimizationDataOffset = 57793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kHandlerTableOffset + kPointerSize; 5780f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kSourcePositionTableOffset = 5781f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kDeoptimizationDataOffset + kPointerSize; 5782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For FUNCTION kind, we store the type feedback info here. 57833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kTypeFeedbackInfoOffset = 5784f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSourcePositionTableOffset + kPointerSize; 5785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNextCodeLinkOffset = kTypeFeedbackInfoOffset + kPointerSize; 5786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kGCMetadataOffset = kNextCodeLinkOffset + kPointerSize; 5787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kInstructionSizeOffset = kGCMetadataOffset + kPointerSize; 5788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kICAgeOffset = kInstructionSizeOffset + kIntSize; 57893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kFlagsOffset = kICAgeOffset + kIntSize; 5790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kKindSpecificFlags1Offset = kFlagsOffset + kIntSize; 5791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kKindSpecificFlags2Offset = 5792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kKindSpecificFlags1Offset + kIntSize; 5793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note: We might be able to squeeze this into the flags above. 5794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrologueOffset = kKindSpecificFlags2Offset + kIntSize; 5795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kConstantPoolOffset = kPrologueOffset + kIntSize; 57963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kBuiltinIndexOffset = 5797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kConstantPoolOffset + kConstantPoolSize; 57983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kHeaderPaddingStart = kBuiltinIndexOffset + kIntSize; 5799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Add padding to align the instruction start following right after 5801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the Code object header. 5802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeaderSize = 5803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask; 5804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 580513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int GetUnwindingInfoSizeOffset() const; 580613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 5808589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 5809014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Byte offsets within kKindSpecificFlags1Offset. 5810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFullCodeFlags = kKindSpecificFlags1Offset; 5811589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch class FullCodeFlagsHasDeoptimizationSupportField: 5812589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch public BitField<bool, 0, 1> {}; // NOLINT 5813589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {}; 5814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier class FullCodeFlagsHasRelocInfoForSerialization 5815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, 2, 1> {}; 5816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Bit 3 in this bitfield is unused. 5817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class ProfilerTicksField : public BitField<int, 4, 28> {}; 5818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5819589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // Flags layout. BitField<type, shift, size>. 5820f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class HasUnwindingInfoField : public BitField<bool, 0, 1> {}; 582113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch class CacheHolderField 582213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch : public BitField<CacheHolderFlag, HasUnwindingInfoField::kNext, 2> {}; 582313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch class KindField : public BitField<Kind, CacheHolderField::kNext, 5> {}; 582413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch STATIC_ASSERT(NUMBER_OF_KINDS <= KindField::kMax); 5825f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class ExtraICStateField 5826f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : public BitField<ExtraICState, KindField::kNext, 5827f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PlatformSmiTagging::kSmiValueSize - KindField::kNext> { 5828f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 5829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 58303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // KindSpecificFlags1 layout (STUB, BUILTIN and OPTIMIZED_FUNCTION) 5831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStackSlotsFirstBit = 0; 5832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStackSlotsBitCount = 24; 5833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMarkedForDeoptimizationBit = 5834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStackSlotsFirstBit + kStackSlotsBitCount; 5835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kIsTurbofannedBit = kMarkedForDeoptimizationBit + 1; 5836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kCanHaveWeakObjects = kIsTurbofannedBit + 1; 5837f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Could be moved to overlap previous bits when we need more space. 5838f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kIsConstructStub = kCanHaveWeakObjects + 1; 5839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32); 5841f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(kIsConstructStub + 1 <= 32); 5842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class StackSlotsField: public BitField<int, 5844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStackSlotsFirstBit, kStackSlotsBitCount> {}; // NOLINT 5845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class MarkedForDeoptimizationField 5846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, kMarkedForDeoptimizationBit, 1> {}; // NOLINT 5847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsTurbofannedField : public BitField<bool, kIsTurbofannedBit, 1> { 5848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; // NOLINT 5849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class CanHaveWeakObjectsField 5850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, kCanHaveWeakObjects, 1> {}; // NOLINT 5851f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class IsConstructStubField : public BitField<bool, kIsConstructStub, 1> { 5852f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; // NOLINT 5853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // KindSpecificFlags2 layout (ALL) 5855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIsCrankshaftedBit = 0; 5856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsCrankshaftedField: public BitField<bool, 5857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsCrankshaftedBit, 1> {}; // NOLINT 5858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // KindSpecificFlags2 layout (STUB and OPTIMIZED_FUNCTION) 5860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSafepointTableOffsetFirstBit = kIsCrankshaftedBit + 1; 5861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSafepointTableOffsetBitCount = 30; 5862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kSafepointTableOffsetFirstBit + 5864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSafepointTableOffsetBitCount <= 32); 5865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(1 + kSafepointTableOffsetBitCount <= 32); 5866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class SafepointTableOffsetField: public BitField<int, 5868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSafepointTableOffsetFirstBit, 5869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSafepointTableOffsetBitCount> {}; // NOLINT 5870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // KindSpecificFlags2 layout (FUNCTION) 5872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class BackEdgeTableOffsetField: public BitField<int, 5873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsCrankshaftedBit + 1, 27> {}; // NOLINT 5874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class AllowOSRAtLoopNestingLevelField: public BitField<int, 5875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsCrankshaftedBit + 1 + 27, 4> {}; // NOLINT 5876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kArgumentsBits = 16; 5878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxArguments = (1 << kArgumentsBits) - 1; 5879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 58803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // This constant should be encodable in an ARM instruction. 5881bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kFlagsNotUsedInLookup = CacheHolderField::kMask; 5882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 5884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class RelocIterator; 5885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Deoptimizer; // For FindCodeAgeSequence. 5886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Code aging 5888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* FindCodeAgeSequence(); 5889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void GetCodeAgeAndParity(Code* code, Age* age, 5890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MarkingParity* parity); 5891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void GetCodeAgeAndParity(Isolate* isolate, byte* sequence, Age* age, 5892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MarkingParity* parity); 5893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Code* GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity); 5894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Code aging -- platform-specific 5896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void PatchPlatformCodeAge(Isolate* isolate, 5897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* sequence, Age age, 5898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MarkingParity parity); 5899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Code); 5901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5903109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass AbstractCode : public HeapObject { 5904109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 59053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // All code kinds and INTERPRETED_FUNCTION. 59063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch enum Kind { 59073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define DEFINE_CODE_KIND_ENUM(name) name, 59083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch CODE_KIND_LIST(DEFINE_CODE_KIND_ENUM) 59093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef DEFINE_CODE_KIND_ENUM 59103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch INTERPRETED_FUNCTION, 591113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch NUMBER_OF_KINDS 59123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch }; 59133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 591413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const char* Kind2String(Kind kind); 591513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5916109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int SourcePosition(int offset); 5917109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int SourceStatementPosition(int offset); 5918109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 59193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns the address of the first instruction. 59203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Address instruction_start(); 59213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 59223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns the address right after the last instruction. 59233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Address instruction_end(); 59243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 592513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of the code instructions. 59263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline int instruction_size(); 59273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5928f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Return the source position table. 5929f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline ByteArray* source_position_table(); 5930f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5931f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Set the source position table. 5932f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_source_position_table(ByteArray* source_position_table); 5933f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5934f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Return the exception handler table. 5935f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int LookupRangeInHandlerTable( 5936f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int code_offset, int* data, HandlerTable::CatchPrediction* prediction); 5937f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 593813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of instructions and the metadata. 593913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int SizeIncludingMetadata(); 594013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 59413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns true if pc is inside this object's instructions. 59423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool contains(byte* pc); 59433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 59443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns the AbstractCode::Kind of the code. 59453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Kind kind(); 59463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 59473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Calculate the size of the code object to report for log events. This takes 59483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the layout of the code object into account. 59493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline int ExecutableSize(); 59503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5951109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECLARE_CAST(AbstractCode) 5952109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline Code* GetCode(); 5953109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline BytecodeArray* GetBytecodeArray(); 5954f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5955f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Max loop nesting marker used to postpose OSR. We don't take loop 5956f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // nesting that is deeper than 5 levels into account. 5957f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kMaxLoopNestingMarker = 6; 5958f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(Code::AllowOSRAtLoopNestingLevelField::kMax >= 5959f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMaxLoopNestingMarker); 5960109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 5961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Dependent code is a singly linked list of fixed arrays. Each array contains 5963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// code objects in weak cells for one dependent group. The suffix of the array 5964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// can be filled with the undefined value if the number of codes is less than 5965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// the length of the array. 5966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 5967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// +------+-----------------+--------+--------+-----+--------+-----------+-----+ 5968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// | next | count & group 1 | code 1 | code 2 | ... | code n | undefined | ... | 5969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// +------+-----------------+--------+--------+-----+--------+-----------+-----+ 5970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// | 5971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// V 5972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// +------+-----------------+--------+--------+-----+--------+-----------+-----+ 5973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// | next | count & group 2 | code 1 | code 2 | ... | code m | undefined | ... | 5974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// +------+-----------------+--------+--------+-----+--------+-----------+-----+ 5975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// | 5976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// V 5977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// empty_fixed_array() 5978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 5979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The list of fixed arrays is ordered by dependency groups. 5980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DependentCode: public FixedArray { 5982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum DependencyGroup { 5984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that weakly embed this map and depend on being 5985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deoptimized when the map is garbage collected. 5986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kWeakCodeGroup, 5987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that embed a transition to this map, and depend on being 5988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deoptimized when the transition is replaced by a new version. 5989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTransitionGroup, 5990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that omit run-time prototype checks for prototypes 5991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // described by this map. The group is deoptimized whenever an object 5992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // described by this map changes shape (and transitions to a new map), 5993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // possibly invalidating the assumptions embedded in the code. 5994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPrototypeCheckGroup, 5995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that depends on global property values in property cells 5996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // not being changed. 5997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPropertyCellChangedGroup, 5998c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Group of code that omit run-time checks for field(s) introduced by 5999c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // this map, i.e. for the field type. 6000c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kFieldOwnerGroup, 6001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that omit run-time type checks for initial maps of 6002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // constructors. 6003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInitialMapChangedGroup, 6004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that depends on tenuring information in AllocationSites 6005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // not being changed. 6006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAllocationSiteTenuringChangedGroup, 6007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that depends on element transition information in 6008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // AllocationSites not being changed. 6009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAllocationSiteTransitionChangedGroup 6010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kGroupCount = kAllocationSiteTransitionChangedGroup + 1; 6013f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kNextLinkIndex = 0; 6014f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kFlagsIndex = 1; 6015f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kCodesStartIndex = 2; 6016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Contains(DependencyGroup group, WeakCell* code_cell); 6018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsEmpty(DependencyGroup group); 6019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> InsertCompilationDependencies( 6021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<DependentCode> entries, DependencyGroup group, 6022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Foreign> info); 6023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> InsertWeakCode(Handle<DependentCode> entries, 6025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DependencyGroup group, 6026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<WeakCell> code_cell); 6027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateToFinishedCode(DependencyGroup group, Foreign* info, 6029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCell* code_cell); 6030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveCompilationDependencies(DependentCode::DependencyGroup group, 6032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Foreign* info); 6033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void DeoptimizeDependentCodeGroup(Isolate* isolate, 6035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DependentCode::DependencyGroup group); 6036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MarkCodeForDeoptimization(Isolate* isolate, 6038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DependentCode::DependencyGroup group); 6039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The following low-level accessors should only be used by this class 6041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and the mark compact collector. 6042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline DependentCode* next_link(); 6043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_next_link(DependentCode* next); 6044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int count(); 6045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_count(int value); 6046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline DependencyGroup group(); 6047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_group(DependencyGroup group); 6048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* object_at(int i); 6049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_object_at(int i, Object* object); 6050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void clear_at(int i); 6051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void copy(int from, int to); 6052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DependentCode) 6053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const char* DependencyGroupName(DependencyGroup group); 6055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetMarkedForDeoptimization(Code* code, DependencyGroup group); 6056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> Insert(Handle<DependentCode> entries, 6059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DependencyGroup group, 6060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> object); 6061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> New(DependencyGroup group, Handle<Object> object, 6062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<DependentCode> next); 6063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> EnsureSpace(Handle<DependentCode> entries); 6064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Compact by removing cleared weak cells and return true if there was 6065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // any cleared weak cell. 6066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Compact(); 6067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static int Grow(int number_of_entries) { 6068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (number_of_entries < 5) return number_of_entries + 1; 6069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return number_of_entries * 5 / 4; 6070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 6071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int flags(); 6072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_flags(int flags); 6073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class GroupField : public BitField<int, 0, 3> {}; 6074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class CountField : public BitField<int, 3, 27> {}; 6075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kGroupCount <= GroupField::kMax + 1); 6076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PrototypeInfo; 6080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All heap objects have a Map that describes their structure. 6083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A Map contains information about: 6084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Size information about the object 6085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - How to iterate over an object (for garbage collection) 6086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Map: public HeapObject { 6087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 6088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Instance size. 6089791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // Size in bytes or kVariableSizeSentinel if instances do not have 6090791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // a fixed size. 6091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int instance_size(); 6092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_instance_size(int value); 6093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Only to clear an unused byte, remove once byte is used. 6095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_unused(); 6096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [inobject_properties_or_constructor_function_index]: Provides access 6098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to the inobject properties in case of JSObject maps, or the constructor 6099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // function index in case of primitive maps. 6100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int inobject_properties_or_constructor_function_index(); 6101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_inobject_properties_or_constructor_function_index(int value); 6102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Count of properties allocated in the object (JSObject only). 6103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int GetInObjectProperties(); 6104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetInObjectProperties(int value); 6105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Index of the constructor function in the native context (primitives only), 6106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or the special sentinel value to indicate that there is no object wrapper 6107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // for the primitive (i.e. in case of null or undefined). 6108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNoConstructorFunctionIndex = 0; 6109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int GetConstructorFunctionIndex(); 6110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetConstructorFunctionIndex(int value); 6111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<JSFunction> GetConstructorFunction( 6112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map, Handle<Context> native_context); 6113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 61143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Retrieve interceptors. 61153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline InterceptorInfo* GetNamedInterceptor(); 61163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline InterceptorInfo* GetIndexedInterceptor(); 61173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 6118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Instance type. 6119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline InstanceType instance_type(); 6120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_instance_type(InstanceType value); 6121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tells how many unused property fields are available in the 6123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instance (only used for JSObject in fast mode). 6124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int unused_property_fields(); 6125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_unused_property_fields(int value); 6126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit field. 6128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline byte bit_field() const; 6129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_bit_field(byte value); 6130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit field 2. 6132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline byte bit_field2() const; 6133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_bit_field2(byte value); 6134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6135257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Bit field 3. 6136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t bit_field3() const; 6137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_bit_field3(uint32_t bits); 6138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class EnumLengthBits: public BitField<int, 6140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0, kDescriptorIndexBitCount> {}; // NOLINT 6141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class NumberOfOwnDescriptorsBits: public BitField<int, 6142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDescriptorIndexBitCount, kDescriptorIndexBitCount> {}; // NOLINT 6143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kDescriptorIndexBitCount + kDescriptorIndexBitCount == 20); 6144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DictionaryMap : public BitField<bool, 20, 1> {}; 6145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OwnsDescriptors : public BitField<bool, 21, 1> {}; 6146109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch class HasHiddenPrototype : public BitField<bool, 22, 1> {}; 6147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Deprecated : public BitField<bool, 23, 1> {}; 6148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier class IsUnstable : public BitField<bool, 24, 1> {}; 6149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier class IsMigrationTarget : public BitField<bool, 25, 1> {}; 6150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class ImmutablePrototype : public BitField<bool, 26, 1> {}; 6151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class NewTargetIsBase : public BitField<bool, 27, 1> {}; 6152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Bit 28 is free. 6153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Keep this bit field at the very end for better code in 6155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Builtins::kJSConstructStubGeneric stub. 6156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This counter is used for in-object slack tracking. 6157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // The in-object slack tracking is considered enabled when the counter is 6158109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // non zero. The counter only has a valid count for initial maps. For 6159109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // transitioned maps only kNoSlackTracking has a meaning, namely that inobject 6160109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // slack tracking already finished for the transition tree. Any other value 6161109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // indicates that either inobject slack tracking is still in progress, or that 6162109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // the map isn't part of the transition tree anymore. 6163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class ConstructionCounter : public BitField<int, 29, 3> {}; 6164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSlackTrackingCounterStart = 7; 6165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSlackTrackingCounterEnd = 1; 6166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNoSlackTracking = 0; 6167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kSlackTrackingCounterStart <= ConstructionCounter::kMax); 6168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Inobject slack tracking is the way to reclaim unused inobject space. 6171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 6172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The instance size is initially determined by adding some slack to 6173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // expected_nof_properties (to allow for a few extra properties added 6174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // after the constructor). There is no guarantee that the extra space 6175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // will not be wasted. 6176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 6177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Here is the algorithm to reclaim the unused inobject space: 6178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - Detect the first constructor call for this JSFunction. 6179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // When it happens enter the "in progress" state: initialize construction 6180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // counter in the initial_map. 6181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - While the tracking is in progress initialize unused properties of a new 6182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // object with one_pointer_filler_map instead of undefined_value (the "used" 6183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // part is initialized with undefined_value as usual). This way they can 6184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // be resized quickly and safely. 6185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - Once enough objects have been created compute the 'slack' 6186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // (traverse the map transition tree starting from the 6187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // initial_map and find the lowest value of unused_property_fields). 6188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - Traverse the transition tree again and decrease the instance size 6189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // of every map. Existing objects will resize automatically (they are 6190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // filled with one_pointer_filler_map). All further allocations will 6191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // use the adjusted instance size. 6192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - SharedFunctionInfo's expected_nof_properties left unmodified since 6193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // allocations made using different closures could actually create different 6194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // kind of objects (see prototype inheritance pattern). 6195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 6196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Important: inobject slack tracking is not attempted during the snapshot 6197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // creation. 6198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kGenerousAllocationCount = 6200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSlackTrackingCounterStart - kSlackTrackingCounterEnd + 1; 6201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Starts the tracking by initializing object constructions countdown counter. 6203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void StartInobjectSlackTracking(); 6204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // True if the object constructions countdown counter is a range 6206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [kSlackTrackingCounterEnd, kSlackTrackingCounterStart]. 6207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsInobjectSlackTrackingInProgress(); 6208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Does the tracking step. 6210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void InobjectSlackTrackingStep(); 6211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Completes inobject slack tracking for the transition tree starting at this 6213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // initial map. 6214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CompleteInobjectSlackTracking(); 6215257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tells whether the object in the prototype property will be used 6217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // for instances created from this function. If the prototype 6218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // property is set to a value that is not a JSObject, the prototype 6219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // property will not be used to create instances of the function. 6220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // See ECMA-262, 13.2.2. 6221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_non_instance_prototype(bool value); 6222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_non_instance_prototype(); 6223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tells whether the instance has a [[Construct]] internal method. 6225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This property is implemented according to ES6, section 7.2.4. 6226109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline void set_is_constructor(bool value); 6227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_constructor() const; 62286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 6229109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Tells whether the instance with this map has a hidden prototype. 6230109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline void set_has_hidden_prototype(bool value); 6231109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool has_hidden_prototype() const; 6232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Records and queries whether the instance has a named interceptor. 6234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_has_named_interceptor(); 6235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_named_interceptor(); 6236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Records and queries whether the instance has an indexed interceptor. 6238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_has_indexed_interceptor(); 6239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_indexed_interceptor(); 6240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tells whether the instance is undetectable. 6242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // An undetectable object is a special class of JSObject: 'typeof' operator 6243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // returns undefined, ToBoolean returns false. Otherwise it behaves like 6244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // a normal JS object. It is useful for implementing undetectable 6245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // document.all in Firefox & Safari. 6246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // See https://bugzilla.mozilla.org/show_bug.cgi?id=248549. 6247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_is_undetectable(); 6248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_undetectable(); 6249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tells whether the instance has a [[Call]] internal method. 6251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This property is implemented according to ES6, section 7.2.3. 6252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_is_callable(); 6253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_callable() const; 6254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_new_target_is_base(bool value); 6256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool new_target_is_base(); 62578defd9ff6930b4e24729971a61cf7469daf119beSteve Block inline void set_is_extensible(bool value); 62588defd9ff6930b4e24729971a61cf7469daf119beSteve Block inline bool is_extensible(); 6259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_is_prototype_map(bool value); 6260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_prototype_map() const; 6261e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 6262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_elements_kind(ElementsKind elements_kind); 6263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ElementsKind elements_kind(); 62643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 62653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Tells whether the instance has fast elements that are only Smis. 6266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_smi_elements(); 62673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 62683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Tells whether the instance has fast elements. 6269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_object_elements(); 6270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_smi_or_object_elements(); 6271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_double_elements(); 6272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_elements(); 6273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_sloppy_arguments_elements(); 627413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool has_fast_sloppy_arguments_elements(); 6275109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool has_fast_string_wrapper_elements(); 6276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fixed_typed_array_elements(); 6277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_dictionary_elements(); 62783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 62793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static bool IsValidElementsTransition(ElementsKind from_kind, 62803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind to_kind); 62813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if the current map doesn't have DICTIONARY_ELEMENTS but if a 6283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // map with DICTIONARY_ELEMENTS was found in the prototype chain. 6284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool DictionaryElementsInPrototypeChainOnly(); 62850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 6286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Map* ElementsTransitionMap(); 62870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 6288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline FixedArrayBase* GetInitialElements(); 62890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 6290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [raw_transitions]: Provides access to the transitions storage field. 6291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Don't call set_raw_transitions() directly to overwrite transitions, use 6292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the TransitionArray::ReplaceTransitions() wrapper instead! 6293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(raw_transitions, Object) 6294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [prototype_info]: Per-prototype metadata. Aliased with transitions 6295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // (which prototype maps don't have). 6296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(prototype_info, Object) 6297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // PrototypeInfo is created lazily using this helper (which installs it on 6298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the given prototype's map). 6299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<PrototypeInfo> GetOrCreatePrototypeInfo( 6300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> prototype, Isolate* isolate); 6301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<PrototypeInfo> GetOrCreatePrototypeInfo( 6302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> prototype_map, Isolate* isolate); 630313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool should_be_fast_prototype_map() const; 630413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static void SetShouldBeFastPrototypeMap(Handle<Map> map, bool value, 630513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* isolate); 6306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [prototype chain validity cell]: Associated with a prototype object, 6308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // stored in that object's map's PrototypeInfo, indicates that prototype 6309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // chains through this object are currently valid. The cell will be 6310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // invalidated and replaced when the prototype chain changes. 6311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Cell> GetOrCreatePrototypeChainValidityCell(Handle<Map> map, 6312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate); 6313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPrototypeChainValid = 0; 6314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPrototypeChainInvalid = 1; 6315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6316c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Return the map of the root of object's prototype chain. 6317c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Map* GetPrototypeChainRootMap(Isolate* isolate); 6318c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6319c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns a WeakCell object containing given prototype. The cell is cached 6320c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // in PrototypeInfo which is created lazily. 6321c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<WeakCell> GetOrCreatePrototypeWeakCell( 6322c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSObject> prototype, Isolate* isolate); 6323c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map* FindRootMap(); 6325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map* FindFieldOwner(int descriptor); 6326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int GetInObjectPropertyOffset(int index); 6328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfFields(); 6330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(ishell): candidate with JSObject::MigrateToMap(). 6332bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool InstancesNeedRewriting(Map* target); 6333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool InstancesNeedRewriting(Map* target, int target_number_of_fields, 6334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int target_inobject, int target_unused, 6335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* old_number_of_fields); 6336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(ishell): moveit! 6337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> GeneralizeAllFieldRepresentations(Handle<Map> map); 6338109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static Handle<FieldType> GeneralizeFieldType( 6339109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Representation rep1, Handle<FieldType> type1, Representation rep2, 6340109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<FieldType> type2, Isolate* isolate); 6341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void GeneralizeFieldType(Handle<Map> map, int modify_index, 6342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Representation new_representation, 6343109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<FieldType> new_field_type); 6344bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6345bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static inline Handle<Map> ReconfigureProperty( 6346bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Map> map, int modify_index, PropertyKind new_kind, 6347bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch PropertyAttributes new_attributes, Representation new_representation, 6348bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<FieldType> new_field_type, StoreMode store_mode); 6349bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6350bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static inline Handle<Map> ReconfigureElementsKind( 6351bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Map> map, ElementsKind new_elements_kind); 6352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> PrepareForDataProperty(Handle<Map> old_map, 6354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int descriptor_number, 6355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 6356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<Map> Normalize(Handle<Map> map, PropertyNormalizationMode mode, 6358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* reason); 6359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tells whether the map is used for JSObjects in dictionary mode (ie 6361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // normalized objects, ie objects for which HasFastProperties returns false). 6362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A map can never be used for both dictionary mode and fast mode JSObjects. 6363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // False by default and for HeapObjects that are not JSObjects. 6364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_dictionary_map(bool value); 6365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_dictionary_map(); 63660d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 6367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tells whether the instance needs security checks when accessing its 6368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // properties. 6369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_is_access_check_needed(bool access_check_needed); 6370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool is_access_check_needed(); 6371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if map has a non-empty stub code cache. 6373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool has_code_cache(); 6374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [prototype]: implicit prototype object. 6376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(prototype, Object) 6377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO(jkummerow): make set_prototype private. 6378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetPrototype( 6379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map, Handle<Object> prototype, 6380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrototypeOptimizationMode proto_mode = FAST_PROTOTYPE); 6381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [constructor]: points back to the function responsible for this map. 6383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The field overlaps with the back pointer. All maps in a transition tree 6384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // have the same constructor, so maps with back pointers can walk the 6385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // back pointer chain until they find the map holding their constructor. 6386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(constructor_or_backpointer, Object) 6387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* GetConstructor() const; 6388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetConstructor(Object* constructor, 6389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 6390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [back pointer]: points back to the parent map from which a transition 6391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // leads to this map. The field overlaps with the constructor (see above). 6392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* GetBackPointer(); 6393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetBackPointer(Object* value, 6394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 6395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [instance descriptors]: describes the object. 6397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(instance_descriptors, DescriptorArray) 6398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // [layout descriptor]: describes the object layout. 6400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_ACCESSORS(layout_descriptor, LayoutDescriptor) 6401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // |layout descriptor| accessor which can be used from GC. 6402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline LayoutDescriptor* layout_descriptor_gc_safe(); 6403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool HasFastPointerLayout() const; 6404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // |layout descriptor| accessor that is safe to call even when 6406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // FLAG_unbox_double_fields is disabled (in this case Map does not contain 6407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // |layout_descriptor| field at all). 6408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline LayoutDescriptor* GetLayoutDescriptor(); 6409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void UpdateDescriptors(DescriptorArray* descriptors, 6411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LayoutDescriptor* layout_descriptor); 6412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void InitializeDescriptors(DescriptorArray* descriptors, 6413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LayoutDescriptor* layout_descriptor); 6414257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [stub cache]: contains stubs compiled for this map. 641613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(code_cache, FixedArray) 6417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [dependent code]: list of optimized codes that weakly embed this map. 6419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(dependent_code, DependentCode) 6420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [weak cell cache]: cache that stores a weak cell pointing to this map. 6422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(weak_cell_cache, Object) 6423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline PropertyDetails GetLastDescriptorDetails(); 6425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int LastAdded(); 6427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int NumberOfOwnDescriptors(); 6429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetNumberOfOwnDescriptors(int number); 6430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Cell* RetrieveDescriptorsPointer(); 6432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6433109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Checks whether all properties are stored either in the map or on the object 6434109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // (inobject, properties, or elements backing store), requiring no special 6435109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // checks. 6436109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool OnlyHasSimpleProperties(); 6437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int EnumLength(); 6438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetEnumLength(int length); 6439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool owns_descriptors(); 6441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_owns_descriptors(bool owns_descriptors); 6442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void mark_unstable(); 6443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_stable(); 6444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_migration_target(bool value); 6445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_migration_target(); 6446f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_immutable_proto(bool value); 6447f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool is_immutable_proto(); 6448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_construction_counter(int value); 6449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int construction_counter(); 6450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void deprecate(); 6451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_deprecated(); 6452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool CanBeDeprecated(); 6453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a non-deprecated version of the input. If the input was not 6454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deprecated, it is directly returned. Otherwise, the non-deprecated version 6455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is found by re-transitioning from the root of the transition tree using the 6456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // descriptor array of the map. Returns MaybeHandle<Map>() if no updated map 6457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // is found. 6458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static MaybeHandle<Map> TryUpdate(Handle<Map> map) WARN_UNUSED_RESULT; 6459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a non-deprecated version of the input. This method may deprecate 6461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // existing maps along the way if encodings conflict. Not for use while 6462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // gathering type feedback. Use TryUpdate in those cases instead. 6463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> Update(Handle<Map> map); 6464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Handle<Map> CopyInitialMap(Handle<Map> map); 6466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> CopyInitialMap(Handle<Map> map, int instance_size, 6467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int in_object_properties, 6468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int unused_property_fields); 6469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyDropDescriptors(Handle<Map> map); 6470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyInsertDescriptor(Handle<Map> map, 6471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Descriptor* descriptor, 6472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Map> CopyWithField( 6475109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Map> map, Handle<Name> name, Handle<FieldType> type, 6476109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PropertyAttributes attributes, Representation representation, 6477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Map> CopyWithConstant( 6480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map, 6481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 6482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> constant, 6483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttributes attributes, 6484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 648580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 6486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a new map with all transitions dropped from the given map and 6487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the ElementsKind set. 6488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> TransitionElementsTo(Handle<Map> map, 6489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind); 6490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> AsElementsKind(Handle<Map> map, ElementsKind kind); 6492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyAsElementsKind(Handle<Map> map, 6494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind kind, 6495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> AsLanguageMode(Handle<Map> initial_map, 6498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode, 6499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FunctionKind kind); 6500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<Map> CopyForPreventExtensions(Handle<Map> map, 6503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PropertyAttributes attrs_to_add, 6504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Symbol> transition_marker, 6505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* reason); 6506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> FixProxy(Handle<Map> map, InstanceType type, int size); 6508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximal number of fast properties. Used to restrict the number of map 6511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // transitions to avoid an explosion in the number of maps for objects used as 6512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // dictionaries. 6513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool TooManyFastProperties(StoreFromKeyed store_mode); 6514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> TransitionToDataProperty(Handle<Map> map, 6515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 6516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value, 6517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttributes attributes, 6518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFromKeyed store_mode); 6519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> TransitionToAccessorProperty( 6520bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate, Handle<Map> map, Handle<Name> name, int descriptor, 6521bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Object> getter, Handle<Object> setter, 65223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch PropertyAttributes attributes); 6523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> ReconfigureExistingProperty(Handle<Map> map, 6524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int descriptor, 6525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyKind kind, 6526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 6527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void AppendDescriptor(Descriptor* desc); 6529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns a copy of the map, prepared for inserting into the transition 6531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // tree (if the |map| owns descriptors then the new one will share 6532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // descriptors with |map|). 6533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> CopyForTransition(Handle<Map> map, const char* reason); 6534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns a copy of the map, with all transitions dropped from the 6536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instance descriptors. 6537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<Map> Copy(Handle<Map> map, const char* reason); 6538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> Create(Isolate* isolate, int inobject_properties); 6539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the next free property index (only valid for FAST MODE). 6541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int NextFreePropertyIndex(); 6542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 65433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns the number of properties described in instance_descriptors 65443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // filtering out properties with the specified attributes. 6545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfDescribedProperties(DescriptorFlag which = OWN_DESCRIPTORS, 6546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyFilter filter = ALL_PROPERTIES); 6547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Map) 6549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code cache operations. 6551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Clears the code cache. 655344f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void ClearCodeCache(Heap* heap); 6554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Update code cache. 65563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static void UpdateCodeCache(Handle<Map> map, 6557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 65583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Code> code); 6559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Extend the descriptor array of the map with the list of descriptors. 6561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // In case of duplicates, the latest descriptor is used. 6562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void AppendCallbackDescriptors(Handle<Map> map, 6563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> descriptors); 6564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static inline int SlackForArraySize(int old_size, int size_limit); 6566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void EnsureDescriptorSlack(Handle<Map> map, int slack); 6568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6569bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Code* LookupInCodeCache(Name* name, Code::Flags code); 65703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 65713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Computes a hash value for this map, to be used in HashTables and such. 65723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int Hash(); 65733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 65743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns the transitioned map for this map with the most generic 6575bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // elements_kind that's found in |candidates|, or |nullptr| if no match is 65763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // found at all. 6577bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Map* FindElementsKindTransitionedMap(MapHandleList* candidates); 6578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool CanTransition(); 6580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsBooleanMap(); 6582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsPrimitiveMap(); 6583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSReceiverMap(); 6584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSObjectMap(); 6585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSArrayMap(); 6586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSFunctionMap(); 6587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsStringMap(); 6588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSProxyMap(); 6589f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline bool IsModuleMap(); 6590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSGlobalProxyMap(); 6591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSGlobalObjectMap(); 6592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSTypedArrayMap(); 6593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSDataViewMap(); 6594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool CanOmitMapChecks(); 6596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void AddDependentCode(Handle<Map> map, 6598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DependentCode::DependencyGroup group, 6599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code); 6600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsMapInArrayPrototypeChain(); 6602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<WeakCell> WeakCellForMap(Handle<Map> map); 6604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 6606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Map) 6607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Map) 6608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 6610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void DictionaryMapVerify(); 6611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void VerifyOmittedMapChecks(); 6612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 6613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6614756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick inline int visitor_id(); 6615756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick inline void set_visitor_id(int visitor_id); 66163bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 6617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> TransitionToPrototype(Handle<Map> map, 6618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> prototype, 6619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PrototypeOptimizationMode mode); 6620053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block 6621f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<Map> TransitionToImmutableProto(Handle<Map> map); 6622f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 6623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxPreAllocatedPropertyFields = 255; 6624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 6626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceSizesOffset = HeapObject::kHeaderSize; 6627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; 6628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBitField3Offset = kInstanceAttributesOffset + kIntSize; 6629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrototypeOffset = kBitField3Offset + kPointerSize; 6630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kConstructorOrBackPointerOffset = 6631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kPrototypeOffset + kPointerSize; 6632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // When there is only one transition, it is stored directly in this field; 6633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // otherwise a transition array is used. 6634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For prototype maps, this slot is used to store this map's PrototypeInfo 6635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // struct. 6636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kTransitionsOrPrototypeInfoOffset = 6637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kConstructorOrBackPointerOffset + kPointerSize; 6638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorsOffset = 6639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kTransitionsOrPrototypeInfoOffset + kPointerSize; 6640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_DOUBLE_FIELDS_UNBOXING 6641f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kLayoutDescriptorOffset = kDescriptorsOffset + kPointerSize; 6642f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kCodeCacheOffset = kLayoutDescriptorOffset + kPointerSize; 6643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 6644f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kLayoutDescriptorOffset = 1; // Must not be ever accessed. 6645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCodeCacheOffset = kDescriptorsOffset + kPointerSize; 6646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 6647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDependentCodeOffset = kCodeCacheOffset + kPointerSize; 6648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kWeakCellCacheOffset = kDependentCodeOffset + kPointerSize; 6649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kWeakCellCacheOffset + kPointerSize; 66507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 66517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Layout of pointer fields. Heap iteration code relies on them 66523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // being continuously allocated. 66537f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; 6654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPointerFieldsEndOffset = kSize; 6655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Byte offsets within kInstanceSizesOffset. 6657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; 6658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInObjectPropertiesOrConstructorFunctionIndexByte = 1; 6659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInObjectPropertiesOrConstructorFunctionIndexOffset = 6660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInstanceSizesOffset + kInObjectPropertiesOrConstructorFunctionIndexByte; 6661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Note there is one byte available for use here. 6662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kUnusedByte = 2; 6663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kUnusedOffset = kInstanceSizesOffset + kUnusedByte; 66649ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick static const int kVisitorIdByte = 3; 66659ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick static const int kVisitorIdOffset = kInstanceSizesOffset + kVisitorIdByte; 6666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Byte offsets within kInstanceAttributesOffset attributes. 6668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_LITTLE_ENDIAN 6669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Order instance type and bit field together such that they can be loaded 6670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // together as a 16-bit word with instance type in the lower 8 bits regardless 6671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // of endianess. Also provide endian-independent offset to that 16-bit word. 6672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceTypeOffset = kInstanceAttributesOffset + 0; 6673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBitFieldOffset = kInstanceAttributesOffset + 1; 6674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 6675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBitFieldOffset = kInstanceAttributesOffset + 0; 6676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInstanceTypeOffset = kInstanceAttributesOffset + 1; 6677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 6678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInstanceTypeAndBitFieldOffset = 6679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInstanceAttributesOffset + 0; 6680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBitField2Offset = kInstanceAttributesOffset + 2; 6681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kUnusedPropertyFieldsByte = 3; 6682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kUnusedPropertyFieldsOffset = kInstanceAttributesOffset + 3; 6683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kInstanceTypeAndBitFieldOffset == 6685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Internals::kMapInstanceTypeAndBitFieldOffset); 6686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions for bit field. 6688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHasNonInstancePrototype = 0; 6689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kIsCallable = 1; 6690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHasNamedInterceptor = 2; 6691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHasIndexedInterceptor = 3; 6692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIsUndetectable = 4; 6693bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kIsAccessCheckNeeded = 5; 6694bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kIsConstructor = 6; 6695bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Bit 7 is free. 6696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions for bit field 2 66983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu static const int kIsExtensible = 0; 6699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Bit 1 is free. 6700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsPrototypeMapBits : public BitField<bool, 2, 1> {}; 6701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ElementsKindBits: public BitField<ElementsKind, 3, 5> {}; 67023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 67033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Derived values from bit field 2 67043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int8_t kMaximumBitField2FastElementValue = static_cast<int8_t>( 6705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (FAST_ELEMENTS + 1) << Map::ElementsKindBits::kShift) - 1; 6706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int8_t kMaximumBitField2FastSmiElementValue = 6707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int8_t>((FAST_SMI_ELEMENTS + 1) << 6708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::ElementsKindBits::kShift) - 1; 6709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int8_t kMaximumBitField2FastHoleyElementValue = 6710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int8_t>((FAST_HOLEY_ELEMENTS + 1) << 6711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::ElementsKindBits::kShift) - 1; 6712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int8_t kMaximumBitField2FastHoleySmiElementValue = 6713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int8_t>((FAST_HOLEY_SMI_ELEMENTS + 1) << 6714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::ElementsKindBits::kShift) - 1; 6715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6716756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 6717756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kPointerFieldsEndOffset, 6718756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kSize> BodyDescriptor; 6719756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 6720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Compares this map to another to see if they describe equivalent objects. 6721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If |mode| is set to CLEAR_INOBJECT_PROPERTIES, |other| is treated as if 6722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // it had exactly zero inobject properties. 6723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The "shared" flags of both this map and |other| are ignored. 6724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool EquivalentToForNormalization(Map* other, PropertyNormalizationMode mode); 6725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Returns true if given field is unboxed double. 6727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool IsUnboxedDoubleField(FieldIndex index); 6728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 6730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void TraceTransition(const char* what, Map* from, Map* to, Name* name); 6731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void TraceAllTransitions(Map* map); 6732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 6733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Handle<Map> AddMissingTransitionsForTesting( 6735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> split_map, Handle<DescriptorArray> descriptors, 6736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<LayoutDescriptor> full_layout_descriptor); 6737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 6739bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Returns the map that this (root) map transitions to if its elements_kind 6740bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // is changed to |elements_kind|, or |nullptr| if no such map is cached yet. 6741bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Map* LookupElementsTransitionMap(ElementsKind elements_kind); 6742bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6743bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Tries to replay property transitions starting from this (root) map using 6744bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // the descriptor array of the |map|. The |root_map| is expected to have 6745bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // proper elements kind and therefore elements kinds transitions are not 6746bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // taken by this function. Returns |nullptr| if matching transition map is 6747bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // not found. 6748bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Map* TryReplayPropertyTransitions(Map* map); 6749bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ConnectTransition(Handle<Map> parent, Handle<Map> child, 6751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, SimpleTransitionFlag flag); 6752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool EquivalentToForTransition(Map* other); 6754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> RawCopy(Handle<Map> map, int instance_size); 6755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> ShareDescriptor(Handle<Map> map, 6756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<DescriptorArray> descriptors, 6757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Descriptor* descriptor); 6758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> AddMissingTransitions( 6759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map, Handle<DescriptorArray> descriptors, 6760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<LayoutDescriptor> full_layout_descriptor); 6761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InstallDescriptors( 6762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> parent_map, Handle<Map> child_map, int new_descriptor, 6763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<DescriptorArray> descriptors, 6764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<LayoutDescriptor> full_layout_descriptor); 6765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyAddDescriptor(Handle<Map> map, 6766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Descriptor* descriptor, 6767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyReplaceDescriptors( 6769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> map, Handle<DescriptorArray> descriptors, 6770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<LayoutDescriptor> layout_descriptor, TransitionFlag flag, 6771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MaybeHandle<Name> maybe_name, const char* reason, 6772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SimpleTransitionFlag simple_flag); 6773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyReplaceDescriptor(Handle<Map> map, 6775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<DescriptorArray> descriptors, 6776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Descriptor* descriptor, 6777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index, 6778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<Map> TryReconfigureExistingProperty( 6780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map, int descriptor, PropertyKind kind, 6781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes, const char** reason); 6782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyNormalized(Handle<Map> map, 6784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyNormalizationMode mode); 6785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6786bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static Handle<Map> Reconfigure(Handle<Map> map, 6787bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch ElementsKind new_elements_kind, 6788bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch int modify_index, PropertyKind new_kind, 6789bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch PropertyAttributes new_attributes, 6790bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Representation new_representation, 6791bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<FieldType> new_field_type, 6792bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch StoreMode store_mode); 6793bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6794bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static Handle<Map> CopyGeneralizeAllRepresentations( 6795bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Map> map, ElementsKind elements_kind, int modify_index, 6796bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch StoreMode store_mode, PropertyKind kind, PropertyAttributes attributes, 6797bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch const char* reason); 6798bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fires when the layout of an object with a leaf map changes. 6800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This includes adding transitions to the leaf map or changing 6801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the descriptor array. 6802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void NotifyLeafMapLayoutChange(); 6803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void DeprecateTransitionTree(); 6805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ReplaceDescriptors(DescriptorArray* new_descriptors, 6807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LayoutDescriptor* new_layout_descriptor); 6808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map* FindLastMatchMap(int verbatim, int length, DescriptorArray* descriptors); 6811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Update field type of the given descriptor to new representation and new 6813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // type. The type must be prepared for storing in descriptor array: 6814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // it must be either a simple type or a map wrapped in a weak cell. 6815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UpdateFieldType(int descriptor_number, Handle<Name> name, 6816958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Representation new_representation, 6817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> new_wrapped_type); 6818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintReconfiguration(FILE* file, int modify_index, PropertyKind kind, 6820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 6821109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void PrintGeneralization(FILE* file, const char* reason, int modify_index, 6822109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int split, int descriptors, bool constant_to_field, 6823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation old_representation, 6824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation new_representation, 6825109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MaybeHandle<FieldType> old_field_type, 6826109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MaybeHandle<Object> old_value, 6827109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MaybeHandle<FieldType> new_field_type, 6828109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MaybeHandle<Object> new_value); 6829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFastPropertiesSoftLimit = 12; 6831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxFastProperties = 128; 6832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Map); 6834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 6835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// An abstract superclass, a marker class really, for simple structure classes. 6838257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// It doesn't carry much functionality but allows struct classes to be 6839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// identified in the type system. 6840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Struct: public HeapObject { 6841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 6842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void InitializeBody(int object_size); 6843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Struct) 6844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6846c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// A container struct to hold state required for PromiseResolveThenableJob. 6847c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass PromiseResolveThenableJobInfo : public Struct { 6848f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 6849f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(thenable, JSReceiver) 6850f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(then, JSReceiver) 6851f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(resolve, JSFunction) 6852f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(reject, JSFunction) 6853c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(debug_id, Object) 6854c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(debug_name, Object) 6855c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(context, Context) 6856f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6857f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kThenableOffset = Struct::kHeaderSize; 6858f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kThenOffset = kThenableOffset + kPointerSize; 6859f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kResolveOffset = kThenOffset + kPointerSize; 6860f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kRejectOffset = kResolveOffset + kPointerSize; 6861c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kDebugIdOffset = kRejectOffset + kPointerSize; 6862c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kDebugNameOffset = kDebugIdOffset + kPointerSize; 6863c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kContextOffset = kDebugNameOffset + kPointerSize; 6864c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kContextOffset + kPointerSize; 6865f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6866c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(PromiseResolveThenableJobInfo) 6867c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(PromiseResolveThenableJobInfo) 6868c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(PromiseResolveThenableJobInfo) 6869f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6870f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 6871c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PromiseResolveThenableJobInfo); 6872c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 6873c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6874c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// Struct to hold state required for PromiseReactionJob. 6875c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass PromiseReactionJobInfo : public Struct { 6876c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 6877c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(value, Object) 6878c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(tasks, Object) 6879c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(deferred, Object) 6880c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(debug_id, Object) 6881c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(debug_name, Object) 6882c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(context, Context) 6883c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6884c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kValueOffset = Struct::kHeaderSize; 6885c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kTasksOffset = kValueOffset + kPointerSize; 6886c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kDeferredOffset = kTasksOffset + kPointerSize; 6887c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kDebugIdOffset = kDeferredOffset + kPointerSize; 6888c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kDebugNameOffset = kDebugIdOffset + kPointerSize; 6889c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kContextOffset = kDebugNameOffset + kPointerSize; 6890c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kContextOffset + kPointerSize; 6891c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6892c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(PromiseReactionJobInfo) 6893c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(PromiseReactionJobInfo) 6894c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(PromiseReactionJobInfo) 6895c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6896c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 6897c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PromiseReactionJobInfo); 6898f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 6899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A simple one-element struct, useful where smis need to be boxed. 6901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Box : public Struct { 6902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 6903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [value]: the boxed contents. 6904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(value, Object) 6905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Box) 6907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 6909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Box) 6910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Box) 6911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kValueOffset = HeapObject::kHeaderSize; 6913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kValueOffset + kPointerSize; 6914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Box); 6917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 6918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Container for metadata stored on each prototype map. 6921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PrototypeInfo : public Struct { 6922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 6923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int UNREGISTERED = -1; 6924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6925c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [weak_cell]: A WeakCell containing this prototype. ICs cache the cell here. 6926c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(weak_cell, Object) 6927c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [prototype_users]: WeakFixedArray containing maps using this prototype, 6929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or Smi(0) if uninitialized. 6930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(prototype_users, Object) 693113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 693213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [object_create_map]: A field caching the map for Object.create(prototype). 693313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static inline void SetObjectCreateMap(Handle<PrototypeInfo> info, 693413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<Map> map); 693513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline Map* ObjectCreateMap(); 693613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool HasObjectCreateMap(); 693713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [registry_slot]: Slot in prototype's user registry where this user 6939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // is stored. Returns UNREGISTERED if this prototype has not been registered. 6940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int registry_slot() const; 6941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_registry_slot(int slot); 6942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [validity_cell]: Cell containing the validity bit for prototype chains 6943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // going through this object, or Smi(0) if uninitialized. 6944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // When a prototype object changes its map, then both its own validity cell 6945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and those of all "downstream" prototypes are invalidated; handlers for a 6946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // given receiver embed the currently valid cell for that receiver's prototype 6947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // during their compilation and check it on execution. 6948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(validity_cell, Object) 694913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [bit_field] 695013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int bit_field() const; 695113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline void set_bit_field(int bit_field); 695213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 695313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_BOOLEAN_ACCESSORS(should_be_fast_map) 6954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(PrototypeInfo) 6956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 6958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(PrototypeInfo) 6959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(PrototypeInfo) 6960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6961c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kWeakCellOffset = HeapObject::kHeaderSize; 6962c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kPrototypeUsersOffset = kWeakCellOffset + kPointerSize; 6963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kRegistrySlotOffset = kPrototypeUsersOffset + kPointerSize; 6964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kValidityCellOffset = kRegistrySlotOffset + kPointerSize; 696513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kObjectCreateMap = kValidityCellOffset + kPointerSize; 696613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kBitFieldOffset = kObjectCreateMap + kPointerSize; 696713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kSize = kBitFieldOffset + kPointerSize; 696813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 696913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Bit field usage. 697013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kShouldBeFastBit = 0; 6971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 697313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(object_create_map, Object) 697413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PrototypeInfo); 6976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 6977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6978c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass Tuple3 : public Struct { 6979c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 6980c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(value1, Object) 6981c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(value2, Object) 6982c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(value3, Object) 6983c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6984c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(Tuple3) 6985c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6986c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Dispatched behavior. 6987c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(Tuple3) 6988c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(Tuple3) 6989c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6990c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kValue1Offset = HeapObject::kHeaderSize; 6991c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kValue2Offset = kValue1Offset + kPointerSize; 6992c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kValue3Offset = kValue2Offset + kPointerSize; 6993c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kValue3Offset + kPointerSize; 6994c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6995c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 6996c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Tuple3); 6997c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 6998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Pair used to store both a ScopeInfo and an extension object in the extension 7000f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// slot of a block, catch, or with context. Needed in the rare case where a 7001f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// declaration block scope (a "varblock" as used to desugar parameter 7002f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// destructuring) also contains a sloppy direct eval, or for with and catch 7003f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// scopes. (In no other case both are needed at the same time.) 7004f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ContextExtension : public Struct { 7005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 7006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [scope_info]: Scope info. 7007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(scope_info, ScopeInfo) 7008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [extension]: Extension object. 7009f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(extension, Object) 7010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7011f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_CAST(ContextExtension) 7012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7013014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 7014f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_PRINTER(ContextExtension) 7015f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_VERIFIER(ContextExtension) 7016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kScopeInfoOffset = HeapObject::kHeaderSize; 7018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kExtensionOffset = kScopeInfoOffset + kPointerSize; 7019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kExtensionOffset + kPointerSize; 7020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 7022f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ContextExtension); 7023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 7024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Script describes a script which has been added to the VM. 7027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Script: public Struct { 7028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 7029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Script types. 7030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum Type { 7031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block TYPE_NATIVE = 0, 7032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block TYPE_EXTENSION = 1, 7033f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch TYPE_NORMAL = 2, 7034f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch TYPE_WASM = 3 7035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 7036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Script compilation types. 7038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum CompilationType { 7039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block COMPILATION_TYPE_HOST = 0, 70403e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu COMPILATION_TYPE_EVAL = 1 7041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 7042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 70433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Script compilation state. 70443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum CompilationState { 70453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch COMPILATION_STATE_INITIAL = 0, 70463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch COMPILATION_STATE_COMPILED = 1 70473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 70483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [source]: the script source. 7050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(source, Object) 7051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [name]: the script name. 7053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(name, Object) 7054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [id]: the script id. 7056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(id) 7057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [line_offset]: script line offset in resource from where it was extracted. 7059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(line_offset) 7060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [column_offset]: script column offset in resource from where it was 7062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // extracted. 7063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(column_offset) 7064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [context_data]: context data for the context this script was compiled in. 7066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(context_data, Object) 7067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // [wrapper]: the wrapper cache. This is either undefined or a WeakCell. 7069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_ACCESSORS(wrapper, HeapObject) 7070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [type]: the script type. 7072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(type) 7073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7074d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // [line_ends]: FixedArray of line ends positions. 7075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(line_ends, Object) 7076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7077109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // [eval_from_shared]: for eval scripts the shared function info for the 7078d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // function from which eval was called. 7079d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block DECL_ACCESSORS(eval_from_shared, Object) 7080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7081bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // [eval_from_position]: the source position in the code for the function 7082bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // from which eval was called, as positive integer. Or the code offset in the 7083bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // code from which eval was called, as negative integer. 7084bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECL_INT_ACCESSORS(eval_from_position) 7085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [shared_function_infos]: weak fixed array containing all shared 7087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // function infos created from this script. 7088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(shared_function_infos, Object) 7089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [flags]: Holds an exciting bitfield. 7091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(flags) 7092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [source_url]: sourceURL from magic comment 7094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(source_url, Object) 7095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7096f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // [source_mapping_url]: sourceMappingURL magic comment 7097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(source_mapping_url, Object) 7098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7099c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [wasm_compiled_module]: the compiled wasm module this script belongs to. 7100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // This must only be called if the type of this script is TYPE_WASM. 7101c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(wasm_compiled_module, Object) 7102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [compilation_type]: how the the script was compiled. Encoded in the 7104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 'flags' field. 7105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline CompilationType compilation_type(); 7106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_compilation_type(CompilationType type); 7107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [compilation_state]: determines whether the script has already been 7109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // compiled. Encoded in the 'flags' field. 7110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline CompilationState compilation_state(); 7111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_compilation_state(CompilationState state); 7112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [hide_source]: determines whether the script source can be exposed as 7114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // function source. Encoded in the 'flags' field. 7115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool hide_source(); 7116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_hide_source(bool value); 7117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [origin_options]: optional attributes set by the embedder via ScriptOrigin, 7119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and used by the embedder to make decisions about the script. V8 just passes 7120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // this through. Encoded in the 'flags' field. 7121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline v8::ScriptOriginOptions origin_options(); 7122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_origin_options(ScriptOriginOptions origin_options); 7123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Script) 7125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 71263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // If script source is an external string, check that the underlying 71273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // resource is accessible. Otherwise, always return true. 71283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block inline bool HasValidSource(); 71293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 7130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Object> GetNameOrSourceURL(Handle<Script> script); 7131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7132bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Set eval origin for stack trace formatting. 7133bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static void SetEvalOrigin(Handle<Script> script, 7134bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<SharedFunctionInfo> outer, 7135bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch int eval_position); 7136bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Retrieve source position from where eval was called. 7137bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch int GetEvalPosition(); 7138bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 7139109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Init line_ends array with source code positions of line ends. 7140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void InitLineEnds(Handle<Script> script); 7141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 714213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Carries information about a source position. 714313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch struct PositionInfo { 714413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch PositionInfo() : line(-1), column(-1), line_start(-1), line_end(-1) {} 714513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 714613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int line; // Zero-based line number. 714713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int column; // Zero-based column number. 714813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int line_start; // Position of first character in line. 7149c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int line_end; // Position of final linebreak character in line. 715013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch }; 715113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 715213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Specifies whether to add offsets to position infos. 715313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch enum OffsetFlag { NO_OFFSET = 0, WITH_OFFSET = 1 }; 715413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 715513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Retrieves information about the given position, optionally with an offset. 715613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns false on failure, and otherwise writes into the given info object 715713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // on success. 7158c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The static method should is preferable for handlified callsites because it 7159c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // initializes the line ends array, avoiding expensive recomputations. 7160c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The non-static version is not allocating and safe for unhandlified 7161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // callsites. 7162c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static bool GetPositionInfo(Handle<Script> script, int position, 7163c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PositionInfo* info, OffsetFlag offset_flag); 716413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool GetPositionInfo(int position, PositionInfo* info, 7165c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch OffsetFlag offset_flag) const; 7166c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7167c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Wrappers for GetPositionInfo 7168c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static int GetColumnNumber(Handle<Script> script, int code_offset); 7169c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int GetColumnNumber(int code_pos) const; 7170c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static int GetLineNumber(Handle<Script> script, int code_offset); 7171c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int GetLineNumber(int code_pos) const; 717213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 7173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get the JS object wrapping the given script; create it if none exists. 7174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<JSObject> GetWrapper(Handle<Script> script); 7175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Look through the list of existing shared function infos to find one 7177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // that matches the function literal. Return empty handle if not found. 7178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaybeHandle<SharedFunctionInfo> FindSharedFunctionInfo(FunctionLiteral* fun); 7179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterate over all script objects on the heap. 7181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class Iterator { 7182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 7183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit Iterator(Isolate* isolate); 7184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Script* Next(); 7185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 7187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakFixedArray::Iterator iterator_; 7188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_COPY_AND_ASSIGN(Iterator); 7189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 7190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 7192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Script) 7193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Script) 7194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSourceOffset = HeapObject::kHeaderSize; 7196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNameOffset = kSourceOffset + kPointerSize; 7197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kLineOffsetOffset = kNameOffset + kPointerSize; 7198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kColumnOffsetOffset = kLineOffsetOffset + kPointerSize; 7199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kContextOffset = kColumnOffsetOffset + kPointerSize; 7200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kWrapperOffset = kContextOffset + kPointerSize; 7201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kTypeOffset = kWrapperOffset + kPointerSize; 7202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLineEndsOffset = kTypeOffset + kPointerSize; 7203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kIdOffset = kLineEndsOffset + kPointerSize; 7204d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block static const int kEvalFromSharedOffset = kIdOffset + kPointerSize; 7205bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kEvalFromPositionOffset = 7206d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block kEvalFromSharedOffset + kPointerSize; 7207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSharedFunctionInfosOffset = 7208bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kEvalFromPositionOffset + kPointerSize; 7209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFlagsOffset = kSharedFunctionInfosOffset + kPointerSize; 7210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSourceUrlOffset = kFlagsOffset + kPointerSize; 7211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSourceMappingUrlOffset = kSourceUrlOffset + kPointerSize; 7212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kSourceMappingUrlOffset + kPointerSize; 7213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 7215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bit positions in the flags field. 7216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCompilationTypeBit = 0; 7217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCompilationStateBit = 1; 7218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHideSourceBit = 2; 7219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kOriginOptionsShift = 3; 7220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kOriginOptionsSize = 3; 7221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kOriginOptionsMask = ((1 << kOriginOptionsSize) - 1) 7222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch << kOriginOptionsShift; 7223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Script); 7225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 7226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// List of builtin functions we want to identify to improve code 7229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// generation. 7230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 7231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Each entry has a name of a global object property holding an object 7232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// optionally followed by ".prototype", a name of a builtin function 7233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// on the object (the one the id is set for), and a label. 7234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 7235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Installation of ids for the selected builtin functions is handled 7236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// by the bootstrapper. 72373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define FUNCTIONS_WITH_ID_LIST(V) \ 72383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, indexOf, ArrayIndexOf) \ 72393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, lastIndexOf, ArrayLastIndexOf) \ 72403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, push, ArrayPush) \ 72413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, pop, ArrayPop) \ 72423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, shift, ArrayShift) \ 7243f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getDate, DateGetDate) \ 7244f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getDay, DateGetDay) \ 7245f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getFullYear, DateGetFullYear) \ 7246f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getHours, DateGetHours) \ 7247f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getMilliseconds, DateGetMilliseconds) \ 7248f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getMinutes, DateGetMinutes) \ 7249f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getMonth, DateGetMonth) \ 7250f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getSeconds, DateGetSeconds) \ 7251f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getTime, DateGetTime) \ 72523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Function.prototype, apply, FunctionApply) \ 72533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Function.prototype, call, FunctionCall) \ 72543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Object.prototype, hasOwnProperty, ObjectHasOwnProperty) \ 72553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, charCodeAt, StringCharCodeAt) \ 72563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, charAt, StringCharAt) \ 72573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, concat, StringConcat) \ 7258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(String.prototype, substr, StringSubstr) \ 72593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, toLowerCase, StringToLowerCase) \ 72603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, toUpperCase, StringToUpperCase) \ 72613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String, fromCharCode, StringFromCharCode) \ 72623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, random, MathRandom) \ 72633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, floor, MathFloor) \ 72643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, round, MathRound) \ 72653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, ceil, MathCeil) \ 72663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, abs, MathAbs) \ 72673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, log, MathLog) \ 726813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, log1p, MathLog1p) \ 726913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, log2, MathLog2) \ 727013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, log10, MathLog10) \ 727113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, cbrt, MathCbrt) \ 72723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, exp, MathExp) \ 727313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, expm1, MathExpm1) \ 72743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, sqrt, MathSqrt) \ 72753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, pow, MathPow) \ 72763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, max, MathMax) \ 72773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, min, MathMin) \ 72783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, cos, MathCos) \ 7279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, cosh, MathCosh) \ 7280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, sign, MathSign) \ 72813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, sin, MathSin) \ 7282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, sinh, MathSinh) \ 72833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, tan, MathTan) \ 7284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, tanh, MathTanh) \ 72853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, acos, MathAcos) \ 7286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, acosh, MathAcosh) \ 72873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, asin, MathAsin) \ 7288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, asinh, MathAsinh) \ 72893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, atan, MathAtan) \ 72903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, atan2, MathAtan2) \ 729113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, atanh, MathAtanh) \ 72923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, imul, MathImul) \ 72933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, clz32, MathClz32) \ 72943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, fround, MathFround) \ 7295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, trunc, MathTrunc) \ 7296f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Number, isFinite, NumberIsFinite) \ 7297f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Number, isInteger, NumberIsInteger) \ 7298f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Number, isNaN, NumberIsNaN) \ 7299f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Number, isSafeInteger, NumberIsSafeInteger) \ 7300c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(Number, parseFloat, NumberParseFloat) \ 7301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Number, parseInt, NumberParseInt) \ 7302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Number.prototype, toString, NumberToString) 7303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define ATOMIC_FUNCTIONS_WITH_ID_LIST(V) \ 7305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Atomics, load, AtomicsLoad) \ 7306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Atomics, store, AtomicsStore) 7307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochenum BuiltinFunctionId { 7309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayCode, 7310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DECLARE_FUNCTION_ID(ignored1, ignore2, name) \ 7311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch k##name, 7312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID) 7313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ATOMIC_FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID) 7314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_FUNCTION_ID 7315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Fake id for a special case of Math.pow. Note, it continues the 7316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // list of math functions. 731713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kMathPowHalf, 731813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // These are manually assigned to special getters during bootstrapping. 7319f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kArrayBufferByteLength, 7320c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kArrayEntries, 7321c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kArrayKeys, 7322c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kArrayValues, 7323c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kArrayIteratorNext, 732413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kDataViewBuffer, 732513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kDataViewByteLength, 732613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kDataViewByteOffset, 7327f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kFunctionHasInstance, 7328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalDecodeURI, 7329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalDecodeURIComponent, 7330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalEncodeURI, 7331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalEncodeURIComponent, 7332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalEscape, 7333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalUnescape, 7334f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kGlobalIsFinite, 7335f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kGlobalIsNaN, 733613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kTypedArrayByteLength, 733713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kTypedArrayByteOffset, 7338c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kTypedArrayEntries, 7339c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kTypedArrayKeys, 734013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kTypedArrayLength, 7341c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kTypedArrayValues, 7342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSharedArrayBufferByteLength, 7343c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kStringIterator, 7344f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kStringIteratorNext, 7345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 7346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Result of searching in an optimized code map of a SharedFunctionInfo. Note 7349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// that both {code} and {literals} can be NULL to pass search result status. 7350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstruct CodeAndLiterals { 7351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Code* code; // Cached optimized code. 7352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LiteralsArray* literals; // Cached literals array. 7353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 7354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SharedFunctionInfo describes the JSFunction information that can be 7357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// shared by multiple instances of the function. 7358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass SharedFunctionInfo: public HeapObject { 7359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 7360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [name]: Function name. 7361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(name, Object) 7362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [code]: Function code. 7364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(code, Code) 7365109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 73663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Get the abstract code associated with the function, which will either be 73673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // a Code object or a BytecodeArray. 73683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline AbstractCode* abstract_code(); 73693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 7370c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Tells whether or not this shared function info is interpreted. 7371c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // 7372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Note: function->IsInterpreted() does not necessarily return the same value 7373c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // as function->shared()->IsInterpreted() because the shared function info 7374c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // could tier up to baseline via a different function closure. The interpreter 7375c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // entry stub will "self-heal" this divergence when the function is executed. 7376c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool IsInterpreted() const; 7377c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void ReplaceCode(Code* code); 7379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool HasBaselineCode() const; 7380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [optimized_code_map]: Map from native context to optimized code 7382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and a shared literals array. 7383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(optimized_code_map, FixedArray) 7384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns entry from optimized code map for specified context and OSR entry. 7386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Note that {code == nullptr, literals == nullptr} indicates no matching 7387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // entry has been found, whereas {code, literals == nullptr} indicates that 7388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // code is context-independent. 7389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CodeAndLiterals SearchOptimizedCodeMap(Context* native_context, 7390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BailoutId osr_ast_id); 7391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear optimized code map. 7393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClearOptimizedCodeMap(); 7394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 739513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Like ClearOptimizedCodeMap, but preserves literals. 739613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void ClearCodeFromOptimizedCodeMap(); 739713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 7398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We have a special root FixedArray with the right shape and values 7399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to represent the cleared optimized code map. This predicate checks 7400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // if that root is installed. 7401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool OptimizedCodeMapIsCleared() const; 7402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Removes a specific optimized code object from the optimized code map. 7404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // In case of non-OSR the code reference is cleared from the cache entry but 7405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the entry itself is left in the map in order to proceed sharing literals. 7406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void EvictFromOptimizedCodeMap(Code* optimized_code, const char* reason); 7407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Trims the optimized code map after entries have been removed. 7409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void TrimOptimizedCodeMap(int shrink_by); 7410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 741113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Handle<LiteralsArray> FindOrCreateLiterals( 741213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<SharedFunctionInfo> shared, Handle<Context> native_context); 741313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 74143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Add or update entry in the optimized code map for context-dependent code. 74153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // If {code} is not given, then an existing entry's code won't be overwritten. 74163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static void AddToOptimizedCodeMap(Handle<SharedFunctionInfo> shared, 74173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Context> native_context, 74183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MaybeHandle<Code> code, 74193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<LiteralsArray> literals, 74203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch BailoutId osr_ast_id); 7421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Set up the link between shared function info and the script. The shared 7423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // function info is added to the list on the script. 7424c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE static void SetScript(Handle<SharedFunctionInfo> shared, 7425c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> script_object); 7426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description of the optimized code map. 7428c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kEntriesStart = 0; 7429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kContextOffset = 0; 7430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCachedCodeOffset = 1; 7431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLiteralsOffset = 2; 7432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kOsrAstIdOffset = 3; 7433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEntryLength = 4; 7434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInitialLength = kEntriesStart + kEntryLength; 7435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNotFound = -1; 7437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7438bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Helpers for assembly code that does a backwards walk of the optimized code 7439bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // map. 7440bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kOffsetToPreviousContext = 7441bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FixedArray::kHeaderSize + kPointerSize * (kContextOffset - kEntryLength); 7442bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kOffsetToPreviousCachedCode = 7443bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FixedArray::kHeaderSize + 7444bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kPointerSize * (kCachedCodeOffset - kEntryLength); 7445bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kOffsetToPreviousLiterals = 7446bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FixedArray::kHeaderSize + kPointerSize * (kLiteralsOffset - kEntryLength); 7447bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kOffsetToPreviousOsrAstId = 7448bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FixedArray::kHeaderSize + kPointerSize * (kOsrAstIdOffset - kEntryLength); 7449bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 74503bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch // [scope_info]: Scope info. 74513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(scope_info, ScopeInfo) 74523bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 7453f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The outer scope info for the purpose of parsing this function, or the hole 7454f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // value if it isn't yet known. 7455f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(outer_scope_info, HeapObject) 7456f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [construct stub]: Code stub for constructing instances of this function. 7458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(construct_stub, Code) 7459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7460f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Sets the given code as the construct stub, and marks builtin code objects 7461f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // as a construct stub. 7462f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void SetConstructStub(Code* code); 7463f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns if this function has been compiled to native code yet. 7465f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool is_compiled() const; 7466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [length]: The function length - usually the number of declared parameters. 7468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Use up to 2^30 parameters. 7469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int length() const; 7470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_length(int value); 7471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [internal formal parameter count]: The declared number of parameters. 7473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For subclass constructors, also includes new.target. 7474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The size of function's frame is internal_formal_parameter_count + 1. 7475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int internal_formal_parameter_count() const; 7476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_internal_formal_parameter_count(int value); 7477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set the formal parameter count so the function code will be 7479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // called without using argument adaptor frames. 7480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void DontAdaptArguments(); 7481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [expected_nof_properties]: Expected number of properties for the function. 7483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int expected_nof_properties() const; 7484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_expected_nof_properties(int value); 7485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 748613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [feedback_metadata] - describes ast node feedback from full-codegen and 7487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (increasingly) from crankshafted code where sufficient feedback isn't 7488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // available. 748913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(feedback_metadata, TypeFeedbackMetadata) 7490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 7492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // [unique_id] - For --trace-maps purposes, an identifier that's persistent 7493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // even if the GC moves this SharedFunctionInfo. 7494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline int unique_id() const; 7495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_unique_id(int value); 7496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 7497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [instance class name]: class name for instances. 7499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(instance_class_name, Object) 7500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // [function data]: This field holds some additional data for function. 7502014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Currently it has one of: 7503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - a FunctionTemplateInfo to make benefit the API [IsApiFunction()]. 7504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - a BytecodeArray for the interpreter [HasBytecodeArray()]. 7505f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // - a FixedArray with Asm->Wasm conversion [HasAsmWasmData()]. 7506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(function_data, Object) 7507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline bool IsApiFunction(); 75096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline FunctionTemplateInfo* get_api_func_data(); 75103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_api_func_data(FunctionTemplateInfo* data); 7511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasBytecodeArray(); 7512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline BytecodeArray* bytecode_array(); 75133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_bytecode_array(BytecodeArray* bytecode); 75143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void ClearBytecodeArray(); 7515f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool HasAsmWasmData(); 7516f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline FixedArray* asm_wasm_data(); 7517f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_asm_wasm_data(FixedArray* data); 7518f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void ClearAsmWasmData(); 75193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 75203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // [function identifier]: This field holds an additional identifier for the 75213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // function. 75223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // - a Smi identifying a builtin function [HasBuiltinFunctionId()]. 75233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // - a String identifying the function's inferred name [HasInferredName()]. 75243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The inferred_name is inferred from variable or property 75253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // assignment of this function. It is used to facilitate debugging and 75263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // profiling of JavaScript code written in OO style, where almost 75273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // all functions are anonymous but are assigned to object 75283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // properties. 75293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DECL_ACCESSORS(function_identifier, Object) 75303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 75313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool HasBuiltinFunctionId(); 75323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline BuiltinFunctionId builtin_function_id(); 75333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_builtin_function_id(BuiltinFunctionId id); 75343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool HasInferredName(); 75353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline String* inferred_name(); 75363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_inferred_name(String* inferred_name); 75376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 7538c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [script]: Script from which the function originates. 7539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(script, Object) 7540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 75416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // [num_literals]: Number of literals used by this function. 7542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int num_literals() const; 75436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline void set_num_literals(int value); 75446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 7545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [start_position_and_type]: Field used to store both the source code 7546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // position, whether or not the function is a function expression, 7547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // and whether or not the function is a toplevel function. The two 7548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // least significants bit indicates whether the function is an 7549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // expression and the rest contains the source code position. 7550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int start_position_and_type() const; 7551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_start_position_and_type(int value); 7552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The function is subject to debugging if a debug info is attached. 7554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasDebugInfo(); 7555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline DebugInfo* GetDebugInfo(); 7556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // A function has debug code if the compiled code has debug break slots. 7558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasDebugCode(); 7559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [debug info]: Debug information. 7561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(debug_info, Object) 7562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7563f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // The function's name if it is non-empty, otherwise the inferred name. 7564f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch String* DebugName(); 7565f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 75663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Used for flags such as --hydrogen-filter. 75673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool PassesFilter(const char* raw_filter); 75683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 7569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Position of the 'function' token in the script source. 7570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int function_token_position() const; 7571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_function_token_position(int function_token_position); 7572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Position of this function in the script source. 7574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int start_position() const; 7575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_start_position(int start_position); 7576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // End position of this function in the script source. 7578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int end_position() const; 7579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_end_position(int end_position); 7580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7581109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Is this function a named function expression in the source code. 7582109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_named_expression) 7583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Is this function a top-level function (scripts, evals). 75853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_toplevel) 7586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit field containing various information collected by the compiler to 7588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // drive optimization. 7589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int compiler_hints() const; 7590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_compiler_hints(int value); 7591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int ast_node_count() const; 75938f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline void set_ast_node_count(int count); 75948f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 7595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int profiler_ticks() const; 7596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_profiler_ticks(int ticks); 75973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 75988f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch // Inline cache age is used to infer whether the function survived a context 75998f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch // disposal or not. In the former case we reset the opt_count. 76008f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline int ic_age(); 76018f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline void set_ic_age(int age); 7602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 76037f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Indicates if this function can be lazy compiled. 76047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // This is used to determine if we can safely flush code from a function 76057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // when doing GC if we expect that the function will no longer be used. 76063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation) 76077f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 7608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Indicates whether optimizations have been disabled for this 7609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // shared function info. If a function is repeatedly optimized or if 7610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // we cannot optimize the function we disable optimization to avoid 7611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // spending time attempting to optimize it again. 76123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(optimization_disabled) 7613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates the language mode. 7615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline LanguageMode language_mode(); 7616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_language_mode(LanguageMode language_mode); 76173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 76183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // False if the function definitely does not allocate an arguments object. 76193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(uses_arguments) 76201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Indicates that this function uses a super property (or an eval that may 7622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // use a super property). 7623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // This is needed to set up the [[HomeObject]] on the function instance. 7624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(needs_home_object) 7625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 76263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // True if the function has any duplicated parameter names. 76273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(has_duplicate_parameters) 76283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 76293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Indicates whether the function is a native function. 7630589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // These needs special treatment in .call and .apply since 7631257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // null passed as the receiver should not be translated to the 7632257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // global object. 76333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(native) 76343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Indicate that this function should always be inlined in optimized code. 7636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(force_inline) 7637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 76383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Indicates that the function was created by the Function function. 76393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Though it's anonymous, toString should treat it as if it had the name 76403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // "anonymous". We don't set the name itself so that the system does not 76413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // see a binding for it. 76423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(name_should_print_as_anonymous) 76433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7644109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indicates that the function is either an anonymous expression 7645109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // or an arrow function (the name field can be set through the API, 7646109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // which does not change this flag). 7647109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_anonymous_expression) 7648257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 76493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Is this a function or top-level/eval code. 76503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_BOOLEAN_ACCESSORS(is_function) 76513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Indicates that code for this function cannot be compiled with Crankshaft. 7653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(dont_crankshaft) 7654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates that code for this function cannot be flushed. 7656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(dont_flush) 7657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7658f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Indicates that this is a constructor for a base class with instance fields. 7659f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_BOOLEAN_ACCESSORS(requires_class_field_init) 7660f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Indicates that this is a synthesized function to set up class instance 7661f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // fields. 7662f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_class_field_initializer) 7663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates that this function is an asm function. 7665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(asm_function) 7666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Indicates that the the shared function info is deserialized from cache. 7668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_BOOLEAN_ACCESSORS(deserialized) 7669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Indicates that the the shared function info has never been compiled before. 7671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(never_compiled) 7672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7673109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Whether this function was created from a FunctionDeclaration. 7674109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_declaration) 7675109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 7676c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Whether this function was marked to be tiered up. 7677c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_BOOLEAN_ACCESSORS(marked_for_tier_up) 7678c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7679f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Indicates that asm->wasm conversion failed and should not be re-attempted. 7680f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_BOOLEAN_ACCESSORS(is_asm_wasm_broken) 7681f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7682f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline FunctionKind kind() const; 7683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_kind(FunctionKind kind); 76843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Indicates whether or not the code in the shared function support 7686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // deoptimization. 7687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline bool has_deoptimization_support(); 7688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Enable deoptimization support through recompiled code. 7690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void EnableDeoptimizationSupport(Code* recompiled); 7691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7692257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Disable (further) attempted optimization of all functions sharing this 76933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // shared function info. 7694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void DisableOptimization(BailoutReason reason); 7695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline BailoutReason disable_optimization_reason(); 7697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Lookup the bailout ID and DCHECK that it exists in the non-optimized 7699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // code, returns whether it asserted (i.e., always true if assertions are 7700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // disabled). 7701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool VerifyBailoutId(BailoutId id); 7702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [source code]: Source code for the function. 7704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasSourceCode() const; 77053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Object> GetSourceCode(); 7706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Number of times the function was optimized. 7708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline int opt_count(); 7709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_opt_count(int opt_count); 7710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Number of times the function was deoptimized. 7712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_deopt_count(int value); 7713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int deopt_count(); 7714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void increment_deopt_count(); 7715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Number of time we tried to re-enable optimization after it 7717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // was disabled due to high number of deoptimizations. 7718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_opt_reenable_tries(int value); 7719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int opt_reenable_tries(); 7720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void TryReenableOptimization(); 7722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores deopt_count, opt_reenable_tries and ic_age as bit-fields. 7724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_counters(int value); 7725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int counters() const; 7726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores opt_count and bailout_reason as bit-fields. 7728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_opt_count_and_bailout_reason(int value); 7729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int opt_count_and_bailout_reason() const; 7730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_disable_optimization_reason(BailoutReason reason); 7732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tells whether this function should be subject to debugging. 7734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsSubjectToDebugging(); 7735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Whether this function is defined in native code or extensions. 7737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsBuiltin(); 7738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check whether or not this function is inlineable. 7740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInlineable(); 7741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Source size of this function. 7743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int SourceSize(); 7744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns `false` if formal parameters include rest parameters, optional 7746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // parameters, or destructuring parameters. 7747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(caitp): make this a flag set during parsing 7748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_simple_parameters(); 7749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Initialize a SharedFunctionInfo from a parsed function literal. 7751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InitFromFunctionLiteral(Handle<SharedFunctionInfo> shared_info, 7752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FunctionLiteral* lit); 7753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 7755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(SharedFunctionInfo) 7756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(SharedFunctionInfo) 7757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 77588f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch void ResetForNewContext(int new_ic_age); 77598f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 7760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterate over all shared function infos. 7761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class Iterator { 7762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 7763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit Iterator(Isolate* isolate); 7764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SharedFunctionInfo* Next(); 7765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 7767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool NextScript(); 7768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Script::Iterator script_iterator_; 7770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakFixedArray::Iterator sfi_iterator_; 7771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DisallowHeapAllocation no_gc_; 7772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_COPY_AND_ASSIGN(Iterator); 7773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 7774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SharedFunctionInfo) 7776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Constants. 7778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDontAdaptArgumentsSentinel = -1; 7779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 77816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Pointer fields. 7782f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kCodeOffset = HeapObject::kHeaderSize; 7783f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kNameOffset = kCodeOffset + kPointerSize; 7784f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kOptimizedCodeMapOffset = kNameOffset + kPointerSize; 7785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kScopeInfoOffset = kOptimizedCodeMapOffset + kPointerSize; 7786f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kOuterScopeInfoOffset = kScopeInfoOffset + kPointerSize; 7787f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kConstructStubOffset = kOuterScopeInfoOffset + kPointerSize; 77886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kInstanceClassNameOffset = 77896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kConstructStubOffset + kPointerSize; 77906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kFunctionDataOffset = 77916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kInstanceClassNameOffset + kPointerSize; 77926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kScriptOffset = kFunctionDataOffset + kPointerSize; 77936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kDebugInfoOffset = kScriptOffset + kPointerSize; 77943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kFunctionIdentifierOffset = kDebugInfoOffset + kPointerSize; 779513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kFeedbackMetadataOffset = 77963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch kFunctionIdentifierOffset + kPointerSize; 7797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 779813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kUniqueIdOffset = kFeedbackMetadataOffset + kPointerSize; 7799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLastPointerFieldOffset = kUniqueIdOffset; 7800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 7801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Just to not break the postmortrem support with conditional offsets 780213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kUniqueIdOffset = kFeedbackMetadataOffset; 780313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kLastPointerFieldOffset = kFeedbackMetadataOffset; 7804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 7805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 78067f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_32_BIT 78077f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Smi fields. 7808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLengthOffset = kLastPointerFieldOffset + kPointerSize; 78097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize; 7810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kExpectedNofPropertiesOffset = 78117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kFormalParameterCountOffset + kPointerSize; 78127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kNumLiteralsOffset = 78137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kExpectedNofPropertiesOffset + kPointerSize; 7814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kStartPositionAndTypeOffset = 78157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kNumLiteralsOffset + kPointerSize; 78167f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kEndPositionOffset = 78177f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kStartPositionAndTypeOffset + kPointerSize; 78187f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kFunctionTokenPositionOffset = 78197f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kEndPositionOffset + kPointerSize; 78207f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kCompilerHintsOffset = 78217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kFunctionTokenPositionOffset + kPointerSize; 7822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kOptCountAndBailoutReasonOffset = 78237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kCompilerHintsOffset + kPointerSize; 7824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCountersOffset = 7825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOptCountAndBailoutReasonOffset + kPointerSize; 7826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAstNodeCountOffset = 7827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kCountersOffset + kPointerSize; 7828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kProfilerTicksOffset = 7829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAstNodeCountOffset + kPointerSize; 78308f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 78317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Total size. 7832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kProfilerTicksOffset + kPointerSize; 78337f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#else 7834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The only reason to use smi fields instead of int fields is to allow 7835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// iteration without maps decoding during garbage collections. 7836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// To avoid wasting space on 64-bit architectures we use the following trick: 7837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// we group integer fields into pairs 7838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The least significant integer in each pair is shifted left by 1. By doing 7839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// this we guarantee that LSB of each kPointerSize aligned word is not set and 7840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// thus this word cannot be treated as pointer to HeapObject during old space 7841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// traversal. 7842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_LITTLE_ENDIAN 7843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLengthOffset = kLastPointerFieldOffset + kPointerSize; 78447f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kFormalParameterCountOffset = 78457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kLengthOffset + kIntSize; 78467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 78477f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kExpectedNofPropertiesOffset = 78487f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kFormalParameterCountOffset + kIntSize; 78497f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kNumLiteralsOffset = 78507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kExpectedNofPropertiesOffset + kIntSize; 78517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 78527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kEndPositionOffset = 78536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kNumLiteralsOffset + kIntSize; 78547f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kStartPositionAndTypeOffset = 78557f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kEndPositionOffset + kIntSize; 78567f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 78577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kFunctionTokenPositionOffset = 78587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kStartPositionAndTypeOffset + kIntSize; 78596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kCompilerHintsOffset = 7860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kFunctionTokenPositionOffset + kIntSize; 78617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 7862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kOptCountAndBailoutReasonOffset = 78636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kCompilerHintsOffset + kIntSize; 7864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCountersOffset = 7865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOptCountAndBailoutReasonOffset + kIntSize; 78667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 7867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAstNodeCountOffset = 7868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kCountersOffset + kIntSize; 7869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kProfilerTicksOffset = 7870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAstNodeCountOffset + kIntSize; 78713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 78726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Total size. 7873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kProfilerTicksOffset + kIntSize; 78740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 7875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#elif V8_TARGET_BIG_ENDIAN 7876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kFormalParameterCountOffset = 7877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kLastPointerFieldOffset + kPointerSize; 7878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLengthOffset = kFormalParameterCountOffset + kIntSize; 7879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNumLiteralsOffset = kLengthOffset + kIntSize; 7881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kExpectedNofPropertiesOffset = kNumLiteralsOffset + kIntSize; 7882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kStartPositionAndTypeOffset = 7884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kExpectedNofPropertiesOffset + kIntSize; 7885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kEndPositionOffset = kStartPositionAndTypeOffset + kIntSize; 7886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kCompilerHintsOffset = kEndPositionOffset + kIntSize; 7888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kFunctionTokenPositionOffset = 7889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kCompilerHintsOffset + kIntSize; 7890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kCountersOffset = kFunctionTokenPositionOffset + kIntSize; 7892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kOptCountAndBailoutReasonOffset = kCountersOffset + kIntSize; 7893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kProfilerTicksOffset = 7895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kOptCountAndBailoutReasonOffset + kIntSize; 7896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kAstNodeCountOffset = kProfilerTicksOffset + kIntSize; 7897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Total size. 7899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kSize = kAstNodeCountOffset + kIntSize; 7900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 7902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#error Unknown byte ordering 7903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif // Big endian 7904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif // 64-bit 7905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 79060d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 79076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kAlignedSize = POINTER_SIZE_ALIGN(kSize); 7908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7909f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch typedef FixedBodyDescriptor<kCodeOffset, 7910f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kLastPointerFieldOffset + kPointerSize, kSize> 7911f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BodyDescriptor; 7912756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef FixedBodyDescriptor<kNameOffset, 7913f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kLastPointerFieldOffset + kPointerSize, kSize> 7914f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BodyDescriptorWeakCode; 7915756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 7916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions in start_position_and_type. 7917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The source code start position is in the 30 most significant bits of 7918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the start_position_and_type field. 7919109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kIsNamedExpressionBit = 0; 7920109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kIsTopLevelBit = 1; 7921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kStartPositionShift = 2; 7922109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1); 7923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions in compiler_hints. 79253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch enum CompilerHints { 7926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // byte 0 79273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kAllowLazyCompilation, 7928c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kMarkedForTierUp, 7929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOptimizationDisabled, 79303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch kNeverCompiled, 7931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNative, 79323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kStrictModeFunction, 79333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kUsesArguments, 7934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNeedsHomeObject, 7935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // byte 1 79363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kHasDuplicateParameters, 7937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kForceInline, 7938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kIsAsmFunction, 7939109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kIsAnonymousExpression, 79403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kNameShouldPrintAsAnonymous, 79413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kIsFunction, 7942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kDontCrankshaft, 7943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDontFlush, 7944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // byte 2 7945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kFunctionKind, 7946f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // rest of byte 2 and first two bits of byte 3 are used by FunctionKind 7947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // byte 3 7948f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kDeserialized = kFunctionKind + 10, 7949109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kIsDeclaration, 7950f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kIsAsmWasmBroken, 7951f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kRequiresClassFieldInit, 7952f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kIsClassFieldInitializer, 7953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kCompilerHintsCount, // Pseudo entry 79543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }; 7955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // kFunctionKind has to be byte-aligned 7956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT((kFunctionKind % kBitsPerByte) == 0); 7957f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7958f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class FunctionKindBits : public BitField<FunctionKind, kFunctionKind, 10> {}; 7959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DeoptCountBits : public BitField<int, 0, 4> {}; 7961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OptReenableTriesBits : public BitField<int, 4, 18> {}; 7962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ICAgeBits : public BitField<int, 22, 8> {}; 7963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OptCountBits : public BitField<int, 0, 22> {}; 7965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DisabledOptimizationReasonBits : public BitField<int, 22, 8> {}; 7966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7967e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 7968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#if V8_HOST_ARCH_32_BIT 7969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // On 32 bit platforms, compiler hints is a smi. 7970e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static const int kCompilerHintsSmiTagSize = kSmiTagSize; 7971e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static const int kCompilerHintsSize = kPointerSize; 7972e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#else 7973e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // On 64 bit platforms, compiler hints is not a smi, see comment above. 7974e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static const int kCompilerHintsSmiTagSize = 0; 7975e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static const int kCompilerHintsSize = kIntSize; 7976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#endif 7977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 7978c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch STATIC_ASSERT(SharedFunctionInfo::kCompilerHintsCount + 7979c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch SharedFunctionInfo::kCompilerHintsSmiTagSize <= 79803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte); 79813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7982e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 7983257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Constants for optimizing codegen for strict mode function and 7984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // native tests when using integer-width instructions. 7985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kStrictModeBit = 7986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kStrictModeFunction + kCompilerHintsSmiTagSize; 7987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNativeBit = kNative + kCompilerHintsSmiTagSize; 7988bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kHasDuplicateParametersBit = 7989bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kHasDuplicateParameters + kCompilerHintsSmiTagSize; 7990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7991f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFunctionKindShift = 7992f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kFunctionKind + kCompilerHintsSmiTagSize; 7993f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kAllFunctionKindBitsMask = FunctionKindBits::kMask 7994f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch << kCompilerHintsSmiTagSize; 7995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7996c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMarkedForTierUpBit = 7997c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kMarkedForTierUp + kCompilerHintsSmiTagSize; 7998c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Constants for optimizing codegen for strict mode function and 80003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // native tests. 80013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Allows to use byte-width instructions. 8002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kStrictModeBitWithinByte = kStrictModeBit % kBitsPerByte; 8003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNativeBitWithinByte = kNativeBit % kBitsPerByte; 8004bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kHasDuplicateParametersBitWithinByte = 8005bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kHasDuplicateParametersBit % kBitsPerByte; 8006e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kClassConstructorBitsWithinByte = 8008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FunctionKind::kClassConstructor << kCompilerHintsSmiTagSize; 8009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kClassConstructorBitsWithinByte < (1 << kBitsPerByte)); 8010257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8011c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMarkedForTierUpBitWithinByte = 8012c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kMarkedForTierUpBit % kBitsPerByte; 8013c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if defined(V8_TARGET_LITTLE_ENDIAN) 8015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define BYTE_OFFSET(compiler_hint) \ 8016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kCompilerHintsOffset + \ 8017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (compiler_hint + kCompilerHintsSmiTagSize) / kBitsPerByte 8018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif defined(V8_TARGET_BIG_ENDIAN) 8019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define BYTE_OFFSET(compiler_hint) \ 8020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kCompilerHintsOffset + (kCompilerHintsSize - 1) - \ 8021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ((compiler_hint + kCompilerHintsSmiTagSize) / kBitsPerByte) 8022e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#else 8023e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#error Unknown byte ordering 8024e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#endif 8025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kStrictModeByteOffset = BYTE_OFFSET(kStrictModeFunction); 8026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNativeByteOffset = BYTE_OFFSET(kNative); 8027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFunctionKindByteOffset = BYTE_OFFSET(kFunctionKind); 8028bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kHasDuplicateParametersByteOffset = 8029bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch BYTE_OFFSET(kHasDuplicateParameters); 8030c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMarkedForTierUpByteOffset = BYTE_OFFSET(kMarkedForTierUp); 8031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef BYTE_OFFSET 8032e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8033e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 8034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns entry from optimized code map for specified context and OSR entry. 8035c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The result is either kNotFound, or a start index of the context-dependent 8036c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // entry. 8037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int SearchOptimizedCodeMapEntry(Context* native_context, 8038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BailoutId osr_ast_id); 8039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo); 8041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Printing support. 8045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct SourceCodeOf { 8046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit SourceCodeOf(SharedFunctionInfo* v, int max = -1) 8047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : value(v), max_length(max) {} 8048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const SharedFunctionInfo* value; 8049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_length; 8050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 8051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8053958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const SourceCodeOf& v); 8054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSGeneratorObject: public JSObject { 8057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 8058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [function]: The function corresponding to this generator object. 8059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(function, JSFunction) 8060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [context]: The context of the suspended computation. 8062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(context, Context) 8063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [receiver]: The receiver of the suspended computation. 8065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(receiver, Object) 8066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 806713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [input_or_debug_pos] 806813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // For executing generators: the most recent input value. 806913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // For suspended new-style generators: debug information (bytecode offset). 807013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // For suspended old-style generators: unused. 807113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // There is currently no need to remember the most recent input value for a 807213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // suspended generator. 807313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(input_or_debug_pos, Object) 8074109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 8075bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // [resume_mode]: The most recent resume mode. 8076bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch enum ResumeMode { kNext, kReturn, kThrow }; 8077bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECL_INT_ACCESSORS(resume_mode) 8078bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 807913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [continuation] 8080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 808113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // A positive value indicates a suspended generator. The special 8082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kGeneratorExecuting and kGeneratorClosed values indicate that a generator 8083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // cannot be resumed. 8084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int continuation() const; 8085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_continuation(int continuation); 808613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool is_closed() const; 808713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool is_executing() const; 808813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool is_suspended() const; 808913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 809013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // For suspended generators: the source position at which the generator 809113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // is suspended. 809213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int source_position() const; 8093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [operand_stack]: Saved operand stack. 8095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(operand_stack, FixedArray) 8096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSGeneratorObject) 8098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 8100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSGeneratorObject) 8101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Magic sentinel values for the continuation. 8103bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kGeneratorExecuting = -2; 8104bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kGeneratorClosed = -1; 8105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description. 8107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFunctionOffset = JSObject::kHeaderSize; 8108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kContextOffset = kFunctionOffset + kPointerSize; 8109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kReceiverOffset = kContextOffset + kPointerSize; 811013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kInputOrDebugPosOffset = kReceiverOffset + kPointerSize; 811113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kResumeModeOffset = kInputOrDebugPosOffset + kPointerSize; 8112bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kContinuationOffset = kResumeModeOffset + kPointerSize; 8113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kOperandStackOffset = kContinuationOffset + kPointerSize; 8114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kOperandStackOffset + kPointerSize; 8115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 8117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSGeneratorObject); 8118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 8119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8120c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass ModuleInfoEntry : public Struct { 8121c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 8122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(ModuleInfoEntry) 8123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(ModuleInfoEntry) 8124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(ModuleInfoEntry) 8125c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8126c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(export_name, Object) 8127c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(local_name, Object) 8128c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(import_name, Object) 8129c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_INT_ACCESSORS(module_request) 8130c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_INT_ACCESSORS(cell_index) 8131c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_INT_ACCESSORS(beg_pos) 8132c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_INT_ACCESSORS(end_pos) 8133c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8134c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<ModuleInfoEntry> New(Isolate* isolate, 8135c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> export_name, 8136c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> local_name, 8137c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> import_name, 8138c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int module_request, int cell_index, 8139c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int beg_pos, int end_pos); 8140c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8141c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kExportNameOffset = HeapObject::kHeaderSize; 8142c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kLocalNameOffset = kExportNameOffset + kPointerSize; 8143c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kImportNameOffset = kLocalNameOffset + kPointerSize; 8144c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kModuleRequestOffset = kImportNameOffset + kPointerSize; 8145c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kCellIndexOffset = kModuleRequestOffset + kPointerSize; 8146c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kBegPosOffset = kCellIndexOffset + kPointerSize; 8147c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kEndPosOffset = kBegPosOffset + kPointerSize; 8148c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kEndPosOffset + kPointerSize; 8149c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8150c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 8151c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ModuleInfoEntry); 8152c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 8153c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8154c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// ModuleInfo is to ModuleDescriptor what ScopeInfo is to Scope. 8155c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass ModuleInfo : public FixedArray { 8156c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 8157c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(ModuleInfo) 8158c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8159c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<ModuleInfo> New(Isolate* isolate, Zone* zone, 8160c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ModuleDescriptor* descr); 8161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8162c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline FixedArray* module_requests() const; 8163c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline FixedArray* special_exports() const; 8164c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline FixedArray* regular_exports() const; 8165c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline FixedArray* namespace_imports() const; 8166c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline FixedArray* regular_imports() const; 8167c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8168c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Accessors for [regular_exports]. 8169c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int RegularExportCount() const; 8170c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch String* RegularExportLocalName(int i) const; 8171c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int RegularExportCellIndex(int i) const; 8172c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FixedArray* RegularExportExportNames(int i) const; 8173c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8174c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<ModuleInfoEntry> LookupRegularImport(Handle<ModuleInfo> info, 8175c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<String> local_name); 8176c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8177c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#ifdef DEBUG 8178c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool Equals(ModuleInfo* other) const; 8179c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#endif 8180c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8181c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 8182c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch friend class Factory; 8183c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch friend class ModuleDescriptor; 8184c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch enum { 8185c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kModuleRequestsIndex, 8186c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kSpecialExportsIndex, 8187c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kRegularExportsIndex, 8188c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kNamespaceImportsIndex, 8189c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kRegularImportsIndex, 8190c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kLength 8191c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch }; 8192c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch enum { 8193c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kRegularExportLocalNameOffset, 8194c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kRegularExportCellIndexOffset, 8195c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kRegularExportExportNamesOffset, 8196c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kRegularExportLength 8197c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch }; 8198c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ModuleInfo); 8199c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 8200c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// When importing a module namespace (import * as foo from "bar"), a 8201c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// JSModuleNamespace object (representing module "bar") is created and bound to 8202c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// the declared variable (foo). A module can have at most one namespace object. 8203c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass JSModuleNamespace : public JSObject { 8204c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 8205c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(JSModuleNamespace) 8206c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(JSModuleNamespace) 8207c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(JSModuleNamespace) 8208c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8209c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The actual module whose namespace is being represented. 8210c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(module, Module) 8211c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8212c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Retrieve the value exported by [module] under the given [name]. If there is 8213c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // no such export, return Just(undefined). If the export is uninitialized, 8214c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // schedule an exception and return Nothing. 8215c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MUST_USE_RESULT MaybeHandle<Object> GetExport(Handle<String> name); 8216c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8217c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kModuleOffset = JSObject::kHeaderSize; 8218c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kModuleOffset + kPointerSize; 8219c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8220c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 8221c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSModuleNamespace); 8222c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 8223c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8224f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// A Module object is a mapping from export names to cells 8225f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// This is still very much in flux. 8226f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass Module : public Struct { 8227f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 8228f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_CAST(Module) 8229f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_VERIFIER(Module) 8230f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_PRINTER(Module) 8231f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8232c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The code representing this Module, or an abstraction thereof. 8233c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // This is either a SharedFunctionInfo or a JSFunction or a ModuleInfo 8234c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // depending on whether the module has been instantiated and evaluated. See 8235c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Module::ModuleVerify() for the precise invariant. 8236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(code, Object) 8237f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8238c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Arrays of cells corresponding to regular exports and regular imports. 8239c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // A cell's position in the array is determined by the cell index of the 8240c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // associated module entry (which coincides with the variable index of the 8241c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // associated variable). 8242c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(regular_exports, FixedArray) 8243c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(regular_imports, FixedArray) 8244c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8245c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The complete export table, mapping an export name to its cell. 8246c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // TODO(neis): We may want to remove the regular exports from the table. 8247f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(exports, ObjectHashTable) 8248f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8249c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Hash for this object (a random non-zero Smi). 8250c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_INT_ACCESSORS(hash) 8251c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8252c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The namespace object (or undefined). 8253c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(module_namespace, HeapObject) 8254c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8255c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Modules imported or re-exported by this module. 8256f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Corresponds 1-to-1 to the module specifier strings in 8257f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // ModuleInfo::module_requests. 8258f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(requested_modules, FixedArray) 8259f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8260f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Get the ModuleInfo associated with the code. 8261f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline ModuleInfo* info() const; 8262f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8263c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool instantiated() const; 8264c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool evaluated() const; 8265c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void set_evaluated(); 8266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8267f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Implementation of spec operation ModuleDeclarationInstantiation. 8268f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Returns false if an exception occurred during instantiation, true 8269f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // otherwise. 8270f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT bool Instantiate(Handle<Module> module, 8271f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Context> context, 8272c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch v8::Module::ResolveCallback callback); 8273f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8274f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Implementation of spec operation ModuleEvaluation. 8275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT MaybeHandle<Object> Evaluate(Handle<Module> module); 8276f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8277c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<Object> LoadVariable(Handle<Module> module, int cell_index); 8278c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static void StoreVariable(Handle<Module> module, int cell_index, 8279c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> value); 8280f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8281c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Get the namespace object for [module_request] of [module]. If it doesn't 8282c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // exist yet, it is created. 8283c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<JSModuleNamespace> GetModuleNamespace(Handle<Module> module, 8284c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int module_request); 8285f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8286f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kCodeOffset = HeapObject::kHeaderSize; 8287f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kExportsOffset = kCodeOffset + kPointerSize; 8288c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kRegularExportsOffset = kExportsOffset + kPointerSize; 8289c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kRegularImportsOffset = kRegularExportsOffset + kPointerSize; 8290c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kHashOffset = kRegularImportsOffset + kPointerSize; 8291c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kModuleNamespaceOffset = kHashOffset + kPointerSize; 8292c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kRequestedModulesOffset = 8293c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kModuleNamespaceOffset + kPointerSize; 8294c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kRequestedModulesOffset + kPointerSize; 8295f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8296f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 8297f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch enum { kEvaluatedBit }; 8298f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8299c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static void CreateExport(Handle<Module> module, int cell_index, 8300c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<FixedArray> names); 8301f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static void CreateIndirectExport(Handle<Module> module, Handle<String> name, 8302f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ModuleInfoEntry> entry); 8303f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8304c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Get the namespace object for [module]. If it doesn't exist yet, it is 8305c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // created. 8306c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<JSModuleNamespace> GetModuleNamespace(Handle<Module> module); 8307c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8308f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The [must_resolve] argument indicates whether or not an exception should be 8309f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // thrown in case the module does not provide an export named [name] 8310f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // (including when a cycle is detected). An exception is always thrown in the 8311f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // case of conflicting star exports. 8312f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 8313f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // If [must_resolve] is true, a null result indicates an exception. If 8314f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // [must_resolve] is false, a null result may or may not indicate an 8315f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // exception (so check manually!). 8316f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class ResolveSet; 8317f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT MaybeHandle<Cell> ResolveExport( 8318c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Module> module, Handle<String> name, MessageLocation loc, 8319c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch bool must_resolve, ResolveSet* resolve_set); 8320f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT MaybeHandle<Cell> ResolveImport( 8321f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Module> module, Handle<String> name, int module_request, 8322c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MessageLocation loc, bool must_resolve, ResolveSet* resolve_set); 8323f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8324f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Helper for ResolveExport. 8325f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT MaybeHandle<Cell> ResolveExportUsingStarExports( 8326c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Module> module, Handle<String> name, MessageLocation loc, 8327c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch bool must_resolve, ResolveSet* resolve_set); 8328f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8329f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Module); 8330f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 8331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// JSBoundFunction describes a bound function exotic object. 8333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSBoundFunction : public JSObject { 8334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 8335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [bound_target_function]: The wrapped function object. 8336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(bound_target_function, JSReceiver) 8337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [bound_this]: The value that is always passed as the this value when 8339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // calling the wrapped function. 8340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(bound_this, Object) 8341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [bound_arguments]: A list of values whose elements are used as the first 8343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // arguments to any call to the wrapped function. 8344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(bound_arguments, FixedArray) 8345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8346bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static MaybeHandle<String> GetName(Isolate* isolate, 8347bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<JSBoundFunction> function); 8348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Context> GetFunctionRealm( 8349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSBoundFunction> function); 8350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(JSBoundFunction) 8352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 8354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(JSBoundFunction) 8355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(JSBoundFunction) 8356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The bound function's string representation implemented according 8358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to ES6 section 19.2.3.5 Function.prototype.toString ( ). 8359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> ToString(Handle<JSBoundFunction> function); 8360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 8362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBoundTargetFunctionOffset = JSObject::kHeaderSize; 8363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBoundThisOffset = kBoundTargetFunctionOffset + kPointerSize; 8364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBoundArgumentsOffset = kBoundThisOffset + kPointerSize; 8365bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kSize = kBoundArgumentsOffset + kPointerSize; 8366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 8368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSBoundFunction); 8369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 8370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// JSFunction describes JavaScript functions. 8373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSFunction: public JSObject { 8374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [prototype_or_initial_map]: 8376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(prototype_or_initial_map, Object) 8377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8378589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // [shared]: The information about the function that 8379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // can be shared by instances. 8380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(shared, SharedFunctionInfo) 8381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 838213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kLengthDescriptorIndex = 0; 838313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kNameDescriptorIndex = 1; 838413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 8385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [context]: The context for this function. 8386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Context* context(); 8387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_context(Object* context); 8388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline JSObject* global_proxy(); 8389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Context* native_context(); 8390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8391bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static Handle<Object> GetName(Isolate* isolate, Handle<JSFunction> function); 8392bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static MaybeHandle<Smi> GetLength(Isolate* isolate, 8393bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<JSFunction> function); 8394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Context> GetFunctionRealm(Handle<JSFunction> function); 8395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [code]: The generated code object for this function. Executed 8397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // when the function is invoked, e.g. foo() or new foo(). See 8398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [[Call]] and [[Construct]] description in ECMA-262, section 8399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 8.6.2, page 27. 8400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Code* code(); 8401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_code(Code* code); 8402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_code_no_write_barrier(Code* code); 8403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void ReplaceCode(Code* code); 8404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 84053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Get the abstract code associated with the function, which will either be 84063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // a Code object or a BytecodeArray. 84073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline AbstractCode* abstract_code(); 84083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 8409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tells whether this function inlines the given shared function info. 8410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Inlines(SharedFunctionInfo* candidate); 8411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8412c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Tells whether or not this function is interpreted. 8413c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // 8414c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Note: function->IsInterpreted() does not necessarily return the same value 8415c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // as function->shared()->IsInterpreted() because the shared function info 8416c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // could tier up to baseline via a different function closure. The interpreter 8417c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // entry stub will "self-heal" this divergence when the function is executed. 8418c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool IsInterpreted(); 8419c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Tells whether or not this function has been optimized. 8421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline bool IsOptimized(); 8422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8423bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Mark this function for lazy recompilation. The function will be recompiled 8424bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // the next time it is executed. 8425bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch void MarkForBaseline(); 8426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MarkForOptimization(); 8427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void AttemptConcurrentOptimization(); 84283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8429bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Tells whether or not the function is already marked for lazy recompilation. 8430bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline bool IsMarkedForBaseline(); 8431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsMarkedForOptimization(); 8432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsMarkedForConcurrentOptimization(); 8433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tells whether or not the function is on the concurrent recompilation queue. 8435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsInOptimizationQueue(); 8436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Completes inobject slack tracking on initial map if it is active. 8438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void CompleteInobjectSlackTrackingIfActive(); 8439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [literals]: Fixed array holding the materialized literals. 8441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 8442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If the function contains object, regexp or array literals, the 8443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // literals array prefix contains the object, regexp, and array 8444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // function to be used when creating these literals. This is 8445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // necessary so that we do not dynamically lookup the object, regexp 8446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // or array functions. Performing a dynamic lookup, we might end up 8447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // using the functions from a new context that we should not have 8448f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // access to. For API objects we store the boilerplate in the literal array. 8449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(literals, LiteralsArray) 8450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 845113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static void EnsureLiterals(Handle<JSFunction> function); 845213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline TypeFeedbackVector* feedback_vector(); 845313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 845413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Unconditionally clear the type feedback vector (including vector ICs). 845513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void ClearTypeFeedbackInfo(); 845613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 845713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Clear the type feedback vector with a more subtle policy at GC time. 845813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void ClearTypeFeedbackInfoAtGCTime(); 845913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 8460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The initial map for an object created by this constructor. 8461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Map* initial_map(); 8462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetInitialMap(Handle<JSFunction> function, Handle<Map> map, 8463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> prototype); 8464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_initial_map(); 8465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void EnsureHasInitialMap(Handle<JSFunction> function); 8466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Creates a map that matches the constructor's initial map, but with 8468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [[prototype]] being new.target.prototype. Because new.target can be a 8469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // JSProxy, this can call back into JavaScript. 8470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<Map> GetDerivedMap( 8471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSFunction> constructor, 8472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> new_target); 8473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get and set the prototype property on a JSFunction. If the 8475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // function has an initial map the prototype is set on the initial 8476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // map. Otherwise, the prototype is put in the initial map field 8477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // until an initial map is needed. 8478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_prototype(); 8479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_instance_prototype(); 8480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* prototype(); 8481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* instance_prototype(); 8482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetPrototype(Handle<JSFunction> function, 8483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 8484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetInstancePrototype(Handle<JSFunction> function, 8485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 8486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // After prototype is removed, it will not be created when accessed, and 84886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // [[Construct]] from this function will not be allowed. 8489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool RemovePrototype(); 8490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns if this function has been compiled to native code yet. 8492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool is_compiled(); 8493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [next_function_link]: Links functions into various lists, e.g. the list 8495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // of optimized functions hanging off the native_context. The CodeFlusher 8496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // uses this link to chain together flushing candidates. Treated weakly 8497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // by the garbage collector. 8498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DECL_ACCESSORS(next_function_link, Object) 8499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Prints the name of the function using PrintF. 8501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void PrintName(FILE* out = stdout); 8502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSFunction) 8504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Calculate the instance size and in-object properties count. 8506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CalculateInstanceSize(InstanceType instance_type, 8507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int requested_internal_fields, int* instance_size, 8508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int* in_object_properties); 8509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CalculateInstanceSizeForDerivedClass(InstanceType instance_type, 8510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int requested_internal_fields, 8511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int* instance_size, 8512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int* in_object_properties); 85133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static void CalculateInstanceSizeHelper(InstanceType instance_type, 85143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int requested_internal_fields, 85153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int requested_in_object_properties, 85163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int* instance_size, 85173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int* in_object_properties); 8518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visiting policy flags define whether the code entry or next function 8519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // should be visited or not. 8520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum BodyVisitingPolicy { 8521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kVisitCodeEntry = 1 << 0, 8522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kVisitNextFunction = 1 << 1, 8523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSkipCodeEntryAndNextFunction = 0, 8525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kVisitCodeEntryAndNextFunction = kVisitCodeEntry | kVisitNextFunction 8526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 8527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterates the function object according to the visiting policy. 8528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <BodyVisitingPolicy> 8529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptorImpl; 8530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visit the whole object. 8532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kVisitCodeEntryAndNextFunction> BodyDescriptor; 8533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Don't visit next function. 8535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kVisitCodeEntry> BodyDescriptorStrongCode; 8536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kSkipCodeEntryAndNextFunction> 8537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BodyDescriptorWeakCode; 8538791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 8539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSFunction) 8541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSFunction) 8542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The function's name if it is configured, otherwise shared function info 8544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // debug name. 8545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> GetName(Handle<JSFunction> function); 8546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8547109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // ES6 section 9.2.11 SetFunctionName 8548109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Because of the way this abstract operation is used in the spec, 8549109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // it should never fail. 8550109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static void SetName(Handle<JSFunction> function, Handle<Name> name, 8551109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<String> prefix); 8552109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 8553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The function's displayName if it is set, otherwise name if it is 8554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // configured, otherwise shared function info 8555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // debug name. 8556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> GetDebugName(Handle<JSFunction> function); 8557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The function's string representation implemented according to 8559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 19.2.3.5 Function.prototype.toString ( ). 8560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> ToString(Handle<JSFunction> function); 8561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Layout descriptors. The last property (from kNonWeakFieldsEndOffset to 8563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // kSize) is weak and has special handling during garbage collection. 8564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPrototypeOrInitialMapOffset = JSObject::kHeaderSize; 8565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSharedFunctionInfoOffset = 8566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPrototypeOrInitialMapOffset + kPointerSize; 8567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kContextOffset = kSharedFunctionInfoOffset + kPointerSize; 8568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kLiteralsOffset = kContextOffset + kPointerSize; 8569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNonWeakFieldsEndOffset = kLiteralsOffset + kPointerSize; 8570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kCodeEntryOffset = kNonWeakFieldsEndOffset; 8571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNextFunctionLinkOffset = kCodeEntryOffset + kPointerSize; 8572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kSize = kNextFunctionLinkOffset + kPointerSize; 8573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunction); 8576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// JSGlobalProxy's prototype must be a JSGlobalObject or null, 8580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// and the prototype is hidden. JSGlobalProxy always delegates 8581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// property accesses to its prototype if the prototype is not null. 8582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 8583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A JSGlobalProxy can be reinitialized which will preserve its identity. 8584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 8585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Accessing a JSGlobalProxy requires security check. 8586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSGlobalProxy : public JSObject { 8588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [native_context]: the owner native context of this global proxy object. 8590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // It is null value if this object is not used by any context. 8591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(native_context, Object) 8592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [hash]: The hash code property (undefined if not initialized yet). 8594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(hash, Object) 8595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSGlobalProxy) 8597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsDetachedFrom(JSGlobalObject* global) const; 8599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8600c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static int SizeWithInternalFields(int internal_field_count); 8601c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSGlobalProxy) 8604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSGlobalProxy) 8605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 8607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNativeContextOffset = JSObject::kHeaderSize; 8608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHashOffset = kNativeContextOffset + kPointerSize; 8609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kHashOffset + kPointerSize; 8610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalProxy); 8613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// JavaScript global object. 8617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSGlobalObject : public JSObject { 8618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [native context]: the natives corresponding to this global object. 8620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(native_context, Context) 8621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [global proxy]: the global proxy object of the context 8623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(global_proxy, JSObject) 8624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InvalidatePropertyCell(Handle<JSGlobalObject> object, 8627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Name> name); 8628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ensure that the global object has a cell for the given property name. 8629f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<PropertyCell> EnsureEmptyPropertyCell( 8630f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSGlobalObject> global, Handle<Name> name, 8631f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyCellType cell_type, int* entry_out = nullptr); 8632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(JSGlobalObject) 8634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsDetached(); 8636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSGlobalObject) 8639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSGlobalObject) 8640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 8642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNativeContextOffset = JSObject::kHeaderSize; 8643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kGlobalProxyOffset = kNativeContextOffset + kPointerSize; 8644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHeaderSize = kGlobalProxyOffset + kPointerSize; 8645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kHeaderSize; 8646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalObject); 8649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 86523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Representation for JS Wrapper objects, String, Number, Boolean, etc. 8653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSValue: public JSObject { 8654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [value]: the object being wrapped. 8656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(value, Object) 8657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSValue) 8659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSValue) 8662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSValue) 8663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 8665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kValueOffset = JSObject::kHeaderSize; 8666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kValueOffset + kPointerSize; 8667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSValue); 8670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 86721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 86733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass DateCache; 86743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 86753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Representation for JS date objects. 86763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass JSDate: public JSObject { 86773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 8678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<JSDate> New(Handle<JSFunction> constructor, 8679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> new_target, 8680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double tv); 8681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 86823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If one component is NaN, all of them are, indicating a NaN time value. 86833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [value]: the time value. 86843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(value, Object) 86853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [year]: caches year. Either undefined, smi, or NaN. 86863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(year, Object) 86873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [month]: caches month. Either undefined, smi, or NaN. 86883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(month, Object) 86893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [day]: caches day. Either undefined, smi, or NaN. 86903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(day, Object) 86913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [weekday]: caches day of week. Either undefined, smi, or NaN. 86923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(weekday, Object) 86933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [hour]: caches hours. Either undefined, smi, or NaN. 86943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(hour, Object) 86953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [min]: caches minutes. Either undefined, smi, or NaN. 86963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(min, Object) 86973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [sec]: caches seconds. Either undefined, smi, or NaN. 86983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(sec, Object) 86993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [cache stamp]: sample of the date cache stamp at the 8700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // moment when chached fields were cached. 87013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(cache_stamp, Object) 87023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSDate) 87043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the time value (UTC) identifying the current time. 8706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static double CurrentTimeValue(Isolate* isolate); 8707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 87083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns the date field with the specified index. 87093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // See FieldIndex for the list of date fields. 8710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Object* GetField(Object* date, Smi* index); 87113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> SetValue(Handle<JSDate> date, double v); 8713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 87143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void SetValue(Object* value, bool is_value_nan); 87153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 20.3.4.45 Date.prototype [ @@toPrimitive ] 8717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<Object> ToPrimitive( 8718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> receiver, Handle<Object> hint); 87193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Dispatched behavior. 8721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSDate) 8722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSDate) 8723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 87243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The order is important. It must be kept in sync with date macros 87253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // in macros.py. 87263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum FieldIndex { 87273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDateValue, 87283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kYear, 87293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMonth, 87303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDay, 87313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kWeekday, 87323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kHour, 87333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMinute, 87343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kSecond, 87353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kFirstUncachedField, 87363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMillisecond = kFirstUncachedField, 87373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDays, 87383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kTimeInDay, 87393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kFirstUTCField, 87403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kYearUTC = kFirstUTCField, 87413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMonthUTC, 87423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDayUTC, 87433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kWeekdayUTC, 87443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kHourUTC, 87453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMinuteUTC, 87463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kSecondUTC, 87473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMillisecondUTC, 87483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDaysUTC, 87493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kTimeInDayUTC, 87503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kTimezoneOffset 87513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 87523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Layout description. 87543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kValueOffset = JSObject::kHeaderSize; 87553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kYearOffset = kValueOffset + kPointerSize; 87563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMonthOffset = kYearOffset + kPointerSize; 87573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kDayOffset = kMonthOffset + kPointerSize; 87583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kWeekdayOffset = kDayOffset + kPointerSize; 87593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kHourOffset = kWeekdayOffset + kPointerSize; 87603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMinOffset = kHourOffset + kPointerSize; 87613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSecOffset = kMinOffset + kPointerSize; 87623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kCacheStampOffset = kSecOffset + kPointerSize; 87633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSize = kCacheStampOffset + kPointerSize; 87643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 87663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline Object* DoGetField(FieldIndex index); 87673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* GetUTCField(FieldIndex index, double value, DateCache* date_cache); 87693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Computes and caches the cacheable fields of the date. 8771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetCachedFields(int64_t local_time_ms, DateCache* date_cache); 87723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSDate); 87753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 87763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Representation of message objects used for error reporting through 87791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// the API. The messages are formatted in JavaScript so this object is 87801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// a real JavaScript object. The information used for formatting the 87811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// error messages are not directly accessible from JavaScript to 87821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// prevent leaking information to user code called during error 87831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// formatting. 87841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass JSMessageObject: public JSObject { 87851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 87861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [type]: the type of error message. 8787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int type() const; 8788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_type(int value); 87891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 87901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [arguments]: the arguments for formatting the error message. 8791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(argument, Object) 87921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 87931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [script]: the script from which the error message originated. 87941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block DECL_ACCESSORS(script, Object) 87951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 87961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [stack_frames]: an array of stack frames for this error object. 87971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block DECL_ACCESSORS(stack_frames, Object) 87981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 87991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [start_position]: the start position in the script for the error message. 8800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int start_position() const; 88011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block inline void set_start_position(int value); 88021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 88031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [end_position]: the end position in the script for the error message. 8804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int end_position() const; 88051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block inline void set_end_position(int value); 88061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 8807f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int GetLineNumber() const; 8808f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8809f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns the offset of the given position within the containing line. 8810f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int GetColumnNumber() const; 8811f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8812f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns the source code line containing the given source 8813f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // position, or the empty string if the position is invalid. 8814f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<String> GetSourceLine() const; 8815f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSMessageObject) 88171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 88181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Dispatched behavior. 8819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSMessageObject) 8820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSMessageObject) 88211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 88221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Layout description. 88231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kTypeOffset = JSObject::kHeaderSize; 88241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kArgumentsOffset = kTypeOffset + kPointerSize; 88251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kScriptOffset = kArgumentsOffset + kPointerSize; 8826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStackFramesOffset = kScriptOffset + kPointerSize; 88271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kStartPositionOffset = kStackFramesOffset + kPointerSize; 88281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kEndPositionOffset = kStartPositionOffset + kPointerSize; 88291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kSize = kEndPositionOffset + kPointerSize; 88301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 88311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block typedef FixedBodyDescriptor<HeapObject::kMapOffset, 88321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kStackFramesOffset + kPointerSize, 88331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kSize> BodyDescriptor; 88341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 88351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 8836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Regular expressions 8837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The regular expression holds a single reference to a FixedArray in 8838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the kDataOffset field. 8839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The FixedArray contains the following data: 8840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - tag : type of regexp implementation (not compiled yet, atom or irregexp) 8841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - reference to the original source string 8842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - reference to the original flag string 8843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If it is an atom regexp 8844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - a reference to a literal string to search for 8845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If it is an irregexp regexp: 8846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - a reference to code for Latin1 inputs (bytecode or compiled), or a smi 8847257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// used for tracking the last usage (used for code flushing). 8848257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// - a reference to code for UC16 inputs (bytecode or compiled), or a smi 8849257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// used for tracking the last usage (used for code flushing).. 8850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - max number of registers used by irregexp implementations. 8851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - number of capture registers (output values) of the regexp. 8852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSRegExp: public JSObject { 8853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Meaning of Type: 8855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // NOT_COMPILED: Initial value. No data has been stored in the JSRegExp yet. 8856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ATOM: A simple string to match against using an indexOf operation. 8857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // IRREGEXP: Compiled with Irregexp. 8858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum Type { NOT_COMPILED, ATOM, IRREGEXP }; 8859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Flag { 8860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone = 0, 8861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGlobal = 1 << 0, 8862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kIgnoreCase = 1 << 1, 8863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kMultiline = 1 << 2, 8864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSticky = 1 << 3, 8865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUnicode = 1 << 4, 8866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 8867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef base::Flags<Flag> Flags; 8868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(data, Object) 8870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(flags, Object) 8871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(source, Object) 8872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8873f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE static MaybeHandle<JSRegExp> New(Handle<String> source, 8874f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Flags flags); 8875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<JSRegExp> Copy(Handle<JSRegExp> regexp); 8876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<JSRegExp> Initialize(Handle<JSRegExp> regexp, 8878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> source, Flags flags); 8879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<JSRegExp> Initialize(Handle<JSRegExp> regexp, 8880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> source, 8881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> flags_string); 8882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Type TypeTag(); 8884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int CaptureCount(); 8885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Flags GetFlags(); 8886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline String* Pattern(); 8887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* DataAt(int index); 8888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set implementation data after the object has been prepared. 8889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SetDataAt(int index, Object* value); 8890257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8891c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void SetLastIndex(int index); 8892c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline Object* LastIndex(); 8893c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int code_index(bool is_latin1) { 8895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_latin1) { 8896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kIrregexpLatin1CodeIndex; 8897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 8898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return kIrregexpUC16CodeIndex; 8899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int saved_code_index(bool is_latin1) { 8903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_latin1) { 8904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kIrregexpLatin1CodeSavedIndex; 8905257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 8906257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return kIrregexpUC16CodeSavedIndex; 8907257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 8908257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 8909257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSRegExp) 8911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(JSRegExp) 8914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSRegExp) 8915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDataOffset = JSObject::kHeaderSize; 8917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSourceOffset = kDataOffset + kPointerSize; 8918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFlagsOffset = kSourceOffset + kPointerSize; 8919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kFlagsOffset + kPointerSize; 8920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Indices in the data array. 8922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kTagIndex = 0; 8923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSourceIndex = kTagIndex + 1; 8924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kFlagsIndex = kSourceIndex + 1; 8925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDataIndex = kFlagsIndex + 1; 8926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The data fields are used in different ways depending on the 8927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // value of the tag. 8928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Atom regexps (literal strings). 8929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAtomPatternIndex = kDataIndex; 8930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAtomDataSize = kAtomPatternIndex + 1; 8932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Irregexp compiled code or bytecode for Latin1. If compilation 8934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // fails, this fields hold an exception object that should be 8935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // thrown if the regexp is used again. 8936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIrregexpLatin1CodeIndex = kDataIndex; 8937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Irregexp compiled code or bytecode for UC16. If compilation 8938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // fails, this fields hold an exception object that should be 8939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // thrown if the regexp is used again. 8940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kIrregexpUC16CodeIndex = kDataIndex + 1; 8941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Saved instance of Irregexp compiled code or bytecode for Latin1 that 8943257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // is a potential candidate for flushing. 8944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIrregexpLatin1CodeSavedIndex = kDataIndex + 2; 8945257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Saved instance of Irregexp compiled code or bytecode for UC16 that is 8946257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // a potential candidate for flushing. 8947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kIrregexpUC16CodeSavedIndex = kDataIndex + 3; 8948257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximal number of registers used by either Latin1 or UC16. 8950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only used to check that there is enough stack space 8951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kIrregexpMaxRegisterCountIndex = kDataIndex + 4; 8952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Number of captures in the compiled regexp. 8953257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kIrregexpCaptureCountIndex = kDataIndex + 5; 895413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Maps names of named capture groups (at indices 2i) to their corresponding 895513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // capture group indices (at indices 2i + 1). 895613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kIrregexpCaptureNameMapIndex = kDataIndex + 6; 8957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 895813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kIrregexpDataSize = kIrregexpCaptureNameMapIndex + 1; 8959e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 8960e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Offsets directly into the data fixed array. 8961e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kDataTagOffset = 8962e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke FixedArray::kHeaderSize + kTagIndex * kPointerSize; 8963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDataOneByteCodeOffset = 8964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedArray::kHeaderSize + kIrregexpLatin1CodeIndex * kPointerSize; 8965d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke static const int kDataUC16CodeOffset = 8966d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke FixedArray::kHeaderSize + kIrregexpUC16CodeIndex * kPointerSize; 8967e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kIrregexpCaptureCountOffset = 8968e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke FixedArray::kHeaderSize + kIrregexpCaptureCountIndex * kPointerSize; 89696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 89706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // In-object fields. 8971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kLastIndexFieldIndex = 0; 8972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInObjectFieldCount = 1; 8973257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8974257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // The uninitialized value for a regexp code object. 8975257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kUninitializedValue = -1; 8976257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8977257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // The compilation error value for the regexp code object. The real error 8978257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // object is in the saved code field. 8979257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kCompilationErrorValue = -2; 8980257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8981257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // When we store the sweep generation at which we moved the code from the 8982257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // code index to the saved code index we mask it of to be in the [0:255] 8983257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // range. 8984257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kCodeAgeMask = 0xff; 8985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_OPERATORS_FOR_FLAGS(JSRegExp::Flags) 8988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8990c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass CompilationCacheShape : public BaseShape<HashTableKey*> { 8991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool IsMatch(HashTableKey* key, Object* value) { 8993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->IsMatch(value); 8994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline uint32_t Hash(HashTableKey* key) { 8997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->Hash(); 8998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 9001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->HashForObject(object); 9002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 9003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 9005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPrefixSize = 0; 9007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kEntrySize = 2; 9008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 90103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 9011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// This cache is used in two different variants. For regexp caching, it simply 9012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// maps identifying info of the regexp to the cached regexp object. Scripts and 9013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// eval code only gets cached after a second probe for the code object. To do 9014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// so, on first "put" only a hash identifying the source is entered into the 9015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// cache, mapping it to a lifetime count of the hash. On each call to Age all 9016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// such lifetimes get reduced, and removed once they reach zero. If a second put 9017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// is called while such a hash is live in the cache, the hash gets replaced by 9018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// an actual cache entry. Age also removes stale live entries from the cache. 9019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Such entries are identified by SharedFunctionInfos pointing to either the 9020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// recompilation stub, or to "old" code. This avoids memory leaks due to 9021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// premature caching of scripts and eval strings that are never needed later. 9022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CompilationCacheTable: public HashTable<CompilationCacheTable, 9023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CompilationCacheShape, 9024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HashTableKey*> { 9025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Find cached value for a string key, otherwise return null. 9027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> Lookup( 9028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> src, Handle<Context> context, LanguageMode language_mode); 9029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> LookupEval( 9030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> src, Handle<SharedFunctionInfo> shared, 9031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode, int scope_position); 9032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> LookupRegExp(Handle<String> source, JSRegExp::Flags flags); 9033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<CompilationCacheTable> Put( 9034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<CompilationCacheTable> cache, Handle<String> src, 9035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Context> context, LanguageMode language_mode, 9036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value); 9037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<CompilationCacheTable> PutEval( 9038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<CompilationCacheTable> cache, Handle<String> src, 9039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SharedFunctionInfo> context, Handle<SharedFunctionInfo> value, 9040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scope_position); 9041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<CompilationCacheTable> PutRegExp( 9042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<CompilationCacheTable> cache, Handle<String> src, 9043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSRegExp::Flags flags, Handle<FixedArray> value); 9044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void Remove(Object* value); 9045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Age(); 9046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashGenerations = 10; 9047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(CompilationCacheTable) 9049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheTable); 9052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9055c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass CodeCacheHashTableShape : public BaseShape<HashTableKey*> { 90566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 90576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static inline bool IsMatch(HashTableKey* key, Object* value) { 90586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return key->IsMatch(value); 90596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 90606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 90616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static inline uint32_t Hash(HashTableKey* key) { 90626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return key->Hash(); 90636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 90646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 90656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 90666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return key->HashForObject(object); 90676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 90686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 9069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 90706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 90716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kPrefixSize = 0; 9072bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // The both the key (name + flags) and value (code object) can be derived from 9073bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // the fixed array that stores both the name and code. 9074bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // TODO(verwaest): Don't allocate a fixed array but inline name and code. 9075bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Rewrite IsMatch to get table + index as input rather than just the raw key. 9076bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kEntrySize = 1; 90776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 90786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 90796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 9080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeCacheHashTable: public HashTable<CodeCacheHashTable, 9081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeCacheHashTableShape, 90826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block HashTableKey*> { 90836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 9084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<CodeCacheHashTable> Put( 9085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<CodeCacheHashTable> table, 9086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 9087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code); 90886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 9089bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Code* Lookup(Name* name, Code::Flags flags); 90906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 9091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(CodeCacheHashTable) 90926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 90936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 90946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCacheHashTable); 90956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 90966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 90976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 90983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass TypeFeedbackInfo: public Struct { 90993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 91003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline int ic_total_count(); 91013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_ic_total_count(int count); 91023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 91038f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline int ic_with_type_info_count(); 9104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void change_ic_with_type_info_count(int delta); 91053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int ic_generic_count(); 9107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void change_ic_generic_count(int delta); 91083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void initialize_storage(); 9110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void change_own_type_change_checksum(); 9112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int own_type_change_checksum(); 9113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_inlined_type_change_checksum(int checksum); 9115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool matches_inlined_type_change_checksum(int checksum); 91163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(TypeFeedbackInfo) 9118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 9120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(TypeFeedbackInfo) 9121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(TypeFeedbackInfo) 9122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStorage1Offset = HeapObject::kHeaderSize; 9124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStorage2Offset = kStorage1Offset + kPointerSize; 9125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStorage3Offset = kStorage2Offset + kPointerSize; 9126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kStorage3Offset + kPointerSize; 91273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 91283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 9129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTypeChangeChecksumBits = 7; 9130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ICTotalCountField: public BitField<int, 0, 9132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize - kTypeChangeChecksumBits> {}; // NOLINT 9133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OwnTypeChangeChecksum: public BitField<int, 9134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize - kTypeChangeChecksumBits, 9135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTypeChangeChecksumBits> {}; // NOLINT 9136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ICsWithTypeInfoCountField: public BitField<int, 0, 9137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize - kTypeChangeChecksumBits> {}; // NOLINT 9138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class InlinedTypeChangeChecksum: public BitField<int, 9139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize - kTypeChangeChecksumBits, 9140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTypeChangeChecksumBits> {}; // NOLINT 9141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 91423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackInfo); 91433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 91443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 91453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum AllocationSiteMode { 9147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DONT_TRACK_ALLOCATION_SITE, 9148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TRACK_ALLOCATION_SITE, 9149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_ALLOCATION_SITE_MODE = TRACK_ALLOCATION_SITE 9150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSite: public Struct { 91543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 9155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kMaximumArrayBytesToPretransition = 8 * 1024; 9156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const double kPretenureRatio; 9157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPretenureMinimumCreated = 100; 9158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Values for pretenure decision field. 9160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum PretenureDecision { 9161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kUndecided = 0, 9162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDontTenure = 1, 9163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kMaybeTenure = 2, 9164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTenure = 3, 9165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kZombie = 4, 9166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLastPretenureDecisionValue = kZombie 9167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 91683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* PretenureDecisionName(PretenureDecision decision); 91703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(transition_info, Object) 9172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // nested_site threads a list of sites that represent nested literals 9173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // walked in a particular order. So [[1, 2], 1, 2] will have one 9174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // nested_site, but [[1, 2], 3, [4]] will have a list of two. 9175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(nested_site, Object) 9176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(pretenure_data) 9177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(pretenure_create_count) 9178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(dependent_code, DependentCode) 9179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(weak_next, Object) 91803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Initialize(); 91823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This method is expensive, it should only be called for reporting. 9184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsNestedSite(); 9185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // transition_info bitfields, for constructed array transition info. 9187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ElementsKindBits: public BitField<ElementsKind, 0, 15> {}; 9188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class UnusedBits: public BitField<int, 15, 14> {}; 9189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DoNotInlineBit: public BitField<bool, 29, 1> {}; 9190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bitfields for pretenure_data 9192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class MementoFoundCountBits: public BitField<int, 0, 26> {}; 9193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class PretenureDecisionBits: public BitField<PretenureDecision, 26, 3> {}; 9194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DeoptDependentCodeBit: public BitField<bool, 29, 1> {}; 9195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(PretenureDecisionBits::kMax >= kLastPretenureDecisionValue); 9196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Increments the mementos found counter and returns true when the first 9198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // memento was found for a given allocation site. 9199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IncrementMementoFoundCount(int increment = 1); 9200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void IncrementMementoCreateCount(); 9202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag GetPretenureMode(); 9204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ResetPretenureDecision(); 9206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline PretenureDecision pretenure_decision(); 9208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_pretenure_decision(PretenureDecision decision); 9209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool deopt_dependent_code(); 9211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_deopt_dependent_code(bool deopt); 9212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int memento_found_count(); 9214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_memento_found_count(int count); 9215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int memento_create_count(); 9217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_memento_create_count(int count); 9218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The pretenuring decision is made during gc, and the zombie state allows 9220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // us to recognize when an allocation site is just being kept alive because 9221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a later traversal of new space may discover AllocationMementos that point 9222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to this AllocationSite. 9223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsZombie(); 9224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsMaybeTenure(); 9226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void MarkZombie(); 9228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool MakePretenureDecision(PretenureDecision current_decision, 9230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double ratio, 9231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool maximum_size_scavenge); 9232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool DigestPretenuringFeedback(bool maximum_size_scavenge); 9234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ElementsKind GetElementsKind(); 9236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetElementsKind(ElementsKind kind); 9237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool CanInlineCall(); 9239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetDoNotInlineCall(); 9240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool SitePointsToLiteral(); 9242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9243f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch template <AllocationSiteUpdateMode update_or_check = 9244f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AllocationSiteUpdateMode::kUpdate> 9245f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static bool DigestTransitionFeedback(Handle<AllocationSite> site, 9246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind); 9247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AllocationSite) 9249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AllocationSite) 9250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AllocationSite) 9252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline AllocationSiteMode GetMode( 9253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind boilerplate_elements_kind); 9254c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static AllocationSiteMode GetMode(ElementsKind from, ElementsKind to); 9255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool CanTrack(InstanceType type); 9256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTransitionInfoOffset = HeapObject::kHeaderSize; 9258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNestedSiteOffset = kTransitionInfoOffset + kPointerSize; 9259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPretenureDataOffset = kNestedSiteOffset + kPointerSize; 9260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPretenureCreateCountOffset = 9261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPretenureDataOffset + kPointerSize; 9262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDependentCodeOffset = 9263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPretenureCreateCountOffset + kPointerSize; 9264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kWeakNextOffset = kDependentCodeOffset + kPointerSize; 9265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kWeakNextOffset + kPointerSize; 9266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // During mark compact we need to take special care for the dependent code 9268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // field. 9269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPointerFieldsBeginOffset = kTransitionInfoOffset; 9270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPointerFieldsEndOffset = kWeakNextOffset; 9271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9272f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 9273f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kPointerFieldsEndOffset, kSize> 9274f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MarkingBodyDescriptor; 9275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 9276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For other visitors, use the fixed body descriptor below. 9277109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch typedef FixedBodyDescriptor<HeapObject::kHeaderSize, kSize, kSize> 9278109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch BodyDescriptor; 9279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool PretenuringDecisionMade(); 9282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationSite); 92843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 92853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 92863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationMemento: public Struct { 9288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 9289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAllocationSiteOffset = HeapObject::kHeaderSize; 9290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kAllocationSiteOffset + kPointerSize; 9291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(allocation_site, Object) 9293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsValid(); 9295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline AllocationSite* GetAllocationSite(); 9296109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline Address GetAllocationSiteUnchecked(); 9297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AllocationMemento) 9299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AllocationMemento) 9300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AllocationMemento) 9302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationMemento); 9305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Representation of a slow alias as part of a sloppy arguments objects. 9309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// For fast aliases (if HasSloppyArgumentsElements()): 9310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - the parameter map contains an index into the context 9311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - all attributes of the element have default values 9312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// For slow aliases (if HasDictionaryArgumentsElements()): 9313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - the parameter map contains no fast alias mapping (i.e. the hole) 9314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - this struct (in the slow backing store) contains an index into the context 9315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - all attributes are available as part if the property details 9316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AliasedArgumentsEntry: public Struct { 9317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int aliased_context_slot() const; 9319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_aliased_context_slot(int count); 9320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AliasedArgumentsEntry) 9322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 9324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AliasedArgumentsEntry) 9325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AliasedArgumentsEntry) 9326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAliasedContextSlot = HeapObject::kHeaderSize; 9328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kAliasedContextSlot + kPointerSize; 9329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AliasedArgumentsEntry); 9332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 93343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum AllowNullsFlag {ALLOW_NULLS, DISALLOW_NULLS}; 9336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum RobustnessFlag {ROBUST_STRING_TRAVERSAL, FAST_STRING_TRAVERSAL}; 9337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9338f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8_EXPORT_PRIVATE StringHasher { 9339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 9340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit inline StringHasher(int length, uint32_t seed); 9341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <typename schar> 9343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t HashSequentialString(const schar* chars, 9344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length, 9345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t seed); 9346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Reads all the data, even for long strings and computes the utf16 length. 9348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static uint32_t ComputeUtf8Hash(Vector<const char> chars, 9349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t seed, 9350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* utf16_length_out); 9351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 935280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // Calculated hash value for a string consisting of 1 to 935380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // String::kMaxArrayIndexSize digits with no leading zeros (except "0"). 935480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // value is represented decimal value. 93559ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick static uint32_t MakeArrayIndexHash(uint32_t value, int length); 935680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 9357c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // No string is allowed to have a hash of zero. That value is reserved 9358c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // for internal properties. If the hash calculation yields zero then we 9359c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // use 27 instead. 9360c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const int kZeroHash = 27; 9361c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 9362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Reusable parts of the hashing algorithm. 9363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(static uint32_t AddCharacterCore(uint32_t running_hash, uint16_t c)); 9364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(static uint32_t GetHashCore(uint32_t running_hash)); 9365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier INLINE(static uint32_t ComputeRunningHash(uint32_t running_hash, 9366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const uc16* chars, int length)); 9367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier INLINE(static uint32_t ComputeRunningHashOneByte(uint32_t running_hash, 9368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* chars, 9369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int length)); 9370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 9372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the value to store in the hash field of a string with 9373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the given length and contents. 9374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t GetHashField(); 9375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if the hash of this string can be computed without 9376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // looking at the contents. 9377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool has_trivial_hash(); 9378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Adds a block of characters to the hash. 9379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<typename Char> 9380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void AddCharacters(const Char* chars, int len); 9381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Add a character to the hash. 9384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void AddCharacter(uint16_t c); 9385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Update index. Returns true if string is still an index. 9386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool UpdateIndex(uint16_t c); 9387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length_; 9389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t raw_running_hash_; 9390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t array_index_; 9391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_array_index_; 9392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_first_char_; 9393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_COPY_AND_ASSIGN(StringHasher); 9394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass IteratingStringHasher : public StringHasher { 9398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 9399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t Hash(String* string, uint32_t seed); 9400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VisitOneByteString(const uint8_t* chars, int length); 9401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VisitTwoByteString(const uint16_t* chars, int length); 9402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline IteratingStringHasher(int len, uint32_t seed); 9405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void VisitConsString(ConsString* cons_string); 9406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_COPY_AND_ASSIGN(IteratingStringHasher); 9407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 940844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 940944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 9410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The characteristics of a string are stored in its map. Retrieving these 9411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// few bits of information is moderately expensive, involving two memory 9412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// loads where the second is dependent on the first. To improve efficiency 9413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the shape of the string is given its own class so that it can be retrieved 9414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// once and used for several string operations. A StringShape is small enough 9415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// to be passed by value and is immutable, but be aware that flattening a 9416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// string can potentially alter its shape. Also be aware that a GC caused by 9417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// something else can alter the shape of a string due to ConsString 9418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// shortcutting. Keeping these restrictions in mind has proven to be error- 9419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// prone and so we no longer put StringShapes in variables unless there is a 9420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// concrete performance benefit at that particular point in the code. 9421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass StringShape BASE_EMBEDDED { 9422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline explicit StringShape(const String* s); 9424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline explicit StringShape(Map* s); 9425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline explicit StringShape(InstanceType t); 9426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsSequential(); 9427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsExternal(); 9428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsCons(); 942969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline bool IsSliced(); 943069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline bool IsIndirect(); 9431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsExternalOneByte(); 9432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsExternalTwoByte(); 9433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsSequentialOneByte(); 9434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsSequentialTwoByte(); 9435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsInternalized(); 9436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline StringRepresentationTag representation_tag(); 943769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline uint32_t encoding_tag(); 9438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint32_t full_representation_tag(); 9439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint32_t size_tag(); 9440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 9441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint32_t type() { return type_; } 9442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void invalidate() { valid_ = false; } 9443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool valid() { return valid_; } 9444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 9445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void invalidate() { } 9446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 94473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type_; 9450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 9451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_valid() { valid_ = true; } 9452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool valid_; 9453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 9454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_valid() { } 9455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The Name abstract class captures anything that can be used as a property 9460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// name, i.e., strings and symbols. All names store a hash value. 9461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Name: public HeapObject { 9462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 9463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get and set the hash field of the name. 9464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint32_t hash_field(); 9465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_hash_field(uint32_t value); 9466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tells whether the hash code has been computed. 9468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasHashCode(); 9469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a hash value used for the property table 9471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint32_t Hash(); 9472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Equality operations. 9474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool Equals(Name* other); 9475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static bool Equals(Handle<Name> one, Handle<Name> two); 9476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conversion. 9478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool AsArrayIndex(uint32_t* index); 9479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the name is private, it can only name own properties. 9481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsPrivate(); 9482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9483109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool IsUniqueName() const; 9484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Return a string version of this name that is converted according to the 9486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // rules described in ES6 section 9.2.11. 9487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<String> ToFunctionName(Handle<Name> name); 948813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch MUST_USE_RESULT static MaybeHandle<String> ToFunctionName( 948913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<Name> name, Handle<String> prefix); 9490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Name) 9492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Name) 9494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 9495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void NameShortPrint(); 9496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int NameShortPrint(Vector<char> str); 9497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 9498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description. 9500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashFieldSlot = HeapObject::kHeaderSize; 9501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT 9502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashFieldOffset = kHashFieldSlot; 9503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 9504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashFieldOffset = kHashFieldSlot + kIntSize; 9505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 9506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kSize = kHashFieldSlot + kPointerSize; 9507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Mask constant for checking if a name has a computed hash code 9509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and if it is a string that is an array index. The least significant bit 9510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // indicates whether a hash code has been computed. If the hash code has 9511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // been computed the 2nd bit tells whether the string can be used as an 9512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // array index. 9513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHashNotComputedMask = 1; 9514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIsNotArrayIndexMask = 1 << 1; 9515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNofHashBitFields = 2; 9516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shift constant retrieving hash code from hash field. 9518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHashShift = kNofHashBitFields; 9519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only these bits are relevant in the hash, since the top two are shifted 9521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // out. 9522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kHashBitMask = 0xffffffffu >> kHashShift; 9523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Array index strings this short can keep their index in the hash field. 9525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxCachedArrayIndexLength = 7; 9526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 952713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Maximum number of characters to consider when trying to convert a string 952813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // value into an array index. 952913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kMaxArrayIndexSize = 10; 953013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 9531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For strings which are array indexes the hash value has the string length 9532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // mixed into the hash, mainly to avoid a hash value of zero which would be 9533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the case for the string '0'. 24 bits are used for the array index value. 9534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kArrayIndexValueBits = 24; 9535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kArrayIndexLengthBits = 9536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields; 9537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 953813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch STATIC_ASSERT(kArrayIndexLengthBits > 0); 953913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch STATIC_ASSERT(kMaxArrayIndexSize < (1 << kArrayIndexLengthBits)); 9540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ArrayIndexValueBits : public BitField<unsigned int, kNofHashBitFields, 9542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayIndexValueBits> {}; // NOLINT 9543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ArrayIndexLengthBits : public BitField<unsigned int, 9544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNofHashBitFields + kArrayIndexValueBits, 9545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayIndexLengthBits> {}; // NOLINT 9546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that kMaxCachedArrayIndexLength + 1 is a power of two so we 9548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // could use a mask to test if the length of string is less than or equal to 9549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kMaxCachedArrayIndexLength. 9550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(IS_POWER_OF_TWO(kMaxCachedArrayIndexLength + 1)); 9551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const unsigned int kContainsCachedArrayIndexMask = 9553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (~static_cast<unsigned>(kMaxCachedArrayIndexLength) 9554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch << ArrayIndexLengthBits::kShift) | 9555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsNotArrayIndexMask; 9556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Value of empty hash field indicating that the hash is not computed. 9558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEmptyHashField = 9559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsNotArrayIndexMask | kHashNotComputedMask; 9560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 9562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsHashFieldComputed(uint32_t field); 9563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Name); 9566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ES6 symbols. 9570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Symbol: public Name { 9571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 9572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [name]: The print name of a symbol, or undefined if none. 9573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(name, Object) 9574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(flags) 9576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [is_private]: Whether this is a private symbol. Private symbols can only 9578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // be used to designate own properties of objects. 9579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(is_private) 9580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [is_well_known_symbol]: Whether this is a spec-defined well-known symbol, 9582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or not. Well-known symbols do not throw when an access check fails during 9583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // a load. 9584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_well_known_symbol) 9585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Symbol) 9587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 9589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Symbol) 9590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Symbol) 9591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description. 9593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNameOffset = Name::kSize; 9594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFlagsOffset = kNameOffset + kPointerSize; 9595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kFlagsOffset + kPointerSize; 9596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef FixedBodyDescriptor<kNameOffset, kFlagsOffset, kSize> BodyDescriptor; 9598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SymbolShortPrint(std::ostream& os); 9600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrivateBit = 0; 9603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kWellKnownSymbolBit = 1; 9604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* PrivateSymbolToName() const; 9606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 9608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier friend class Name; // For PrivateSymbolToName. 9609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 9610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Symbol); 9612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ConsString; 9616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The String abstract class captures JavaScript string values: 9618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 9619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Ecma-262: 9620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 4.3.16 String Value 9621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A string value is a member of the type String and is a finite 9622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ordered sequence of zero or more 16-bit unsigned integer values. 9623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 9624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All string values have a length field. 9625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass String: public Name { 9626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Encoding { ONE_BYTE_ENCODING, TWO_BYTE_ENCODING }; 9628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class SubStringRange { 9630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 9631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit inline SubStringRange(String* string, int first = 0, 9632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = -1); 9633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class iterator; 9634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline iterator begin(); 9635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline iterator end(); 9636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 9638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch String* string_; 9639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int first_; 9640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length_; 9641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 9642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 964369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Representation of the flat content of a String. 964469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // A non-flat string doesn't have flat content. 964569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // A flat string has content that's encoded as a sequence of either 9646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // one-byte chars or two-byte UC16. 964769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returned by String::GetFlatContent(). 964869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch class FlatContent { 964969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 965069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returns true if the string is flat and this structure contains content. 9651bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsFlat() const { return state_ != NON_FLAT; } 9652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if the structure contains one-byte content. 9653bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsOneByte() const { return state_ == ONE_BYTE; } 965469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returns true if the structure contains two-byte content. 9655bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsTwoByte() const { return state_ == TWO_BYTE; } 965669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return the one byte content of the string. Only use if IsOneByte() 9658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // returns true. 9659bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Vector<const uint8_t> ToOneByteVector() const { 9660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(ONE_BYTE, state_); 9661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Vector<const uint8_t>(onebyte_start, length_); 966269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 966369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Return the two-byte content of the string. Only use if IsTwoByte() 966469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // returns true. 9665bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Vector<const uc16> ToUC16Vector() const { 9666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(TWO_BYTE, state_); 9667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Vector<const uc16>(twobyte_start, length_); 9668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9670bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch uc16 Get(int i) const { 9671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(i < length_); 9672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(state_ != NON_FLAT); 9673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (state_ == ONE_BYTE) return onebyte_start[i]; 9674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return twobyte_start[i]; 967569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 967669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool UsesSameString(const FlatContent& other) const { 9678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return onebyte_start == other.onebyte_start; 9679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 9680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 968169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 9682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum State { NON_FLAT, ONE_BYTE, TWO_BYTE }; 968369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 968469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Constructors only used by String::GetFlatContent(). 9685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit FlatContent(const uint8_t* start, int length) 9686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : onebyte_start(start), length_(length), state_(ONE_BYTE) {} 9687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit FlatContent(const uc16* start, int length) 9688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : twobyte_start(start), length_(length), state_(TWO_BYTE) { } 9689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FlatContent() : onebyte_start(NULL), length_(0), state_(NON_FLAT) { } 9690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch union { 9692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* onebyte_start; 9693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uc16* twobyte_start; 9694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 9695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length_; 969669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch State state_; 969769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 969869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch friend class String; 9699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class IterableSubString; 970069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch }; 970169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier template <typename Char> 9703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier INLINE(Vector<const Char> GetCharVector()); 9704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get and set the length of the string. 9706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int length() const; 9707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_length(int value); 9708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get and set the length of the string using acquire loads and release 9710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // stores. 9711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int synchronized_length() const; 9712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_length(int value); 9713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns whether this string has only one-byte chars, i.e. all of them can 9715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // be one-byte encoded. This might be the case even if the string is 971669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // two-byte. Such strings may appear when the embedder prefers 9717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // two-byte external representations even for one-byte data. 9718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsOneByteRepresentation() const; 9719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsTwoByteRepresentation() const; 9720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 972169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Cons and slices have an encoding flag that may not represent the actual 972269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // encoding of the underlying string. This is taken into account here. 972369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Requires: this->IsFlat() 9724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsOneByteRepresentationUnderneath(); 972569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline bool IsTwoByteRepresentationUnderneath(); 972669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 97279dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen // NOTE: this should be considered only a hint. False negatives are 97289dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen // possible. 9729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasOnlyOneByteChars(); 97306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 9731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get and set individual two byte chars in the string. 9732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void Set(int index, uint16_t value); 9733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get individual two byte char in the string. Repeated calls 9734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to this method are not efficient unless the string is flat. 9735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(uint16_t Get(int index)); 9736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.3.1 ToNumber Applied to the String Type 9738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> ToNumber(Handle<String> subject); 9739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Flattens the string. Checks first inline to see if it is 9741f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // necessary. Does nothing if the string is not a cons string. 9742f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // Flattening allocates a sequential string with the same data as 9743f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // the given string and mutates the cons string to a degenerate 9744f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // form, where the first component is the new sequential string and 9745f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // the second component is the empty string. If allocation fails, 9746f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // this function returns a failure. If flattening succeeds, this 9747f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // function returns the sequential string that is now the first 9748f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // component of the cons string. 9749f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // 9750f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // Degenerate cons strings are handled specially by the garbage 9751f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // collector (see IsShortcutCandidate). 9752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<String> Flatten(Handle<String> string, 9754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure = NOT_TENURED); 9755f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 975669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Tries to return the content of a flat string as a structure holding either 975769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // a flat vector of char or of uc16. 975869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // If the string isn't flat, and therefore doesn't have flat content, the 975969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // returned structure will report so, and can't provide a vector of either 976069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // kind. 976169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch FlatContent GetFlatContent(); 976269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 976369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returns the parent of a sliced string or first part of a flat cons string. 976469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Requires: StringShape(this).IsIndirect() && this->IsFlat() 976569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline String* GetUnderlying(); 9766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // String relational comparison, implemented according to ES6 section 7.2.11 9768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Abstract Relational Comparison (step 5): The comparison of Strings uses a 9769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // simple lexicographic ordering on sequences of code unit values. There is no 9770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // attempt to use the more complex, semantically oriented definitions of 9771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // character or string equality and collating order defined in the Unicode 9772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // specification. Therefore String values that are canonically equal according 9773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to the Unicode standard could test as unequal. In effect this algorithm 9774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // assumes that both Strings are already in normalized form. Also, note that 9775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // for strings containing supplementary characters, lexicographic ordering on 9776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // sequences of UTF-16 code unit values differs from that on sequences of code 9777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // point values. 9778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static ComparisonResult Compare(Handle<String> x, 9779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> y); 9780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9781c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Perform ES6 21.1.3.8, including checking arguments. 9782c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Object* IndexOf(Isolate* isolate, Handle<Object> receiver, 9783c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> search, Handle<Object> position); 9784f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Perform string match of pattern on subject, starting at start index. 9785c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Caller must ensure that 0 <= start_index <= sub->length(), as this does not 9786c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // check any arguments. 9787c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static int IndexOf(Isolate* isolate, Handle<String> receiver, 9788c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<String> search, int start_index); 9789f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 9790f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Object* LastIndexOf(Isolate* isolate, Handle<Object> receiver, 9791f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> search, Handle<Object> position); 9792f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 9793c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Encapsulates logic related to a match and its capture groups as required 9794c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // by GetSubstitution. 9795c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch class Match { 9796c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 9797c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual Handle<String> GetMatch() = 0; 9798c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual MaybeHandle<String> GetCapture(int i, bool* capture_exists) = 0; 9799c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual Handle<String> GetPrefix() = 0; 9800c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual Handle<String> GetSuffix() = 0; 9801c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual int CaptureCount() = 0; 9802c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual ~Match() {} 9803c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch }; 9804c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 9805c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // ES#sec-getsubstitution 9806c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // GetSubstitution(matched, str, position, captures, replacement) 9807c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Expand the $-expressions in the string and return a new string with 9808c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // the result. 9809c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MUST_USE_RESULT static MaybeHandle<String> GetSubstitution( 9810c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Isolate* isolate, Match* match, Handle<String> replacement); 9811c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 9812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // String equality operations. 9813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool Equals(String* other); 9814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static bool Equals(Handle<String> one, Handle<String> two); 9815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUtf8EqualTo(Vector<const char> str, bool allow_prefix_match = false); 9816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsOneByteEqualTo(Vector<const uint8_t> str); 98179fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block bool IsTwoByteEqualTo(Vector<const uc16> str); 9818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Return a UTF8 representation of the string. The string is null 9820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // terminated but may optionally contain nulls. Length is returned 9821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // in length_output if length_output is not a null pointer The string 9822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // should be nearly flat, otherwise the performance of this method may 9823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // be very slow (quadratic in the length). Setting robustness_flag to 9824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ROBUST_STRING_TRAVERSAL invokes behaviour that is robust This means it 9825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // handles unexpected data without causing assert failures and it does not 9826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // do any heap allocations. This is useful when printing stack traces. 9827f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::unique_ptr<char[]> ToCString(AllowNullsFlag allow_nulls, 9828f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RobustnessFlag robustness_flag, int offset, 9829f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int length, int* length_output = 0); 9830f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::unique_ptr<char[]> ToCString( 9831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block AllowNullsFlag allow_nulls = DISALLOW_NULLS, 9832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RobustnessFlag robustness_flag = FAST_STRING_TRAVERSAL, 9833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int* length_output = 0); 9834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ComputeArrayIndex(uint32_t* index); 9836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Externalization. 9838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool MakeExternal(v8::String::ExternalStringResource* resource); 9839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MakeExternal(v8::String::ExternalOneByteStringResource* resource); 9840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Conversion. 9842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool AsArrayIndex(uint32_t* index); 9843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 984413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Trimming. 984513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch enum TrimMode { kTrim, kTrimLeft, kTrimRight }; 984613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Handle<String> Trim(Handle<String> string, TrimMode mode); 984713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 9848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(String) 9849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void PrintOn(FILE* out); 9851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // For use during stack traces. Performs rudimentary sanity check. 9853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool LooksValid(); 9854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 985613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void StringShortPrint(StringStream* accumulator, bool show_details = true); 9857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintUC16(std::ostream& os, int start = 0, int end = -1); // NOLINT 9858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if defined(DEBUG) || defined(OBJECT_PRINT) 985969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch char* ToAsciiArray(); 9860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 9861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(String) 9862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(String) 9863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsFlat(); 9865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 9867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLengthOffset = Name::kSize; 9868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kLengthOffset + kPointerSize; 9869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Max char codes. 9871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int32_t kMaxOneByteCharCode = unibrow::Latin1::kMaxChar; 9872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kMaxOneByteCharCodeU = unibrow::Latin1::kMaxChar; 98733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMaxUtf16CodeUnit = 0xffff; 9874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kMaxUtf16CodeUnitU = kMaxUtf16CodeUnit; 9875109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const uc32 kMaxCodePoint = 0x10ffff; 9876d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 9877d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Maximal string length. 9878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxLength = (1 << 28) - 16; 9879d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 9880d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Max length for computing hash. For strings longer than this limit the 9881d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // string length is used as the hash value. 9882d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block static const int kMaxHashCalcLength = 16383; 9883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Limit for truncation in short printing. 9885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxShortPrintLength = 1024; 9886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Support for regular expressions. 9888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const uc16* GetTwoByteData(unsigned start); 9889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Helper function for flattening strings. 9891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block template <typename sinkchar> 9892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void WriteToFlat(String* source, 9893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block sinkchar* sink, 9894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int from, 9895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int to); 9896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The return value may point to the first aligned word containing the first 9898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // non-one-byte character, rather than directly to the non-one-byte character. 9899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If the return value is >= the passed length, the entire string was 9900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // one-byte. 9901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int NonAsciiStart(const char* chars, int length) { 9902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* start = chars; 99039fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block const char* limit = chars + length; 9904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length >= kIntptrSize) { 9906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check unaligned bytes. 9907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (!IsAligned(reinterpret_cast<intptr_t>(chars), sizeof(uintptr_t))) { 9908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) { 9909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 9910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ++chars; 9912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check aligned words. 9914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(unibrow::Utf8::kMaxOneByteChar == 0x7F); 9915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uintptr_t non_one_byte_mask = kUintptrAllBitsSet / 0xFF * 0x80; 9916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (chars + sizeof(uintptr_t) <= limit) { 9917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (*reinterpret_cast<const uintptr_t*>(chars) & non_one_byte_mask) { 9918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 9919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chars += sizeof(uintptr_t); 99219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 99229fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 9923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check remaining unaligned bytes. 99249fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block while (chars < limit) { 9925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) { 9926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 9927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 99289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block ++chars; 99299fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 9930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 99329fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 99339fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 9934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsAscii(const char* chars, int length) { 9935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NonAsciiStart(chars, length) >= length; 9936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsAscii(const uint8_t* chars, int length) { 9939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 9940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NonAsciiStart(reinterpret_cast<const char*>(chars), length) >= length; 9941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int NonOneByteStart(const uc16* chars, int length) { 99449fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block const uc16* limit = chars + length; 9945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uc16* start = chars; 99469fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block while (chars < limit) { 9947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (*chars > kMaxOneByteCharCodeU) return static_cast<int>(chars - start); 99489fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block ++chars; 99499fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 9950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 99519fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 99529fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 9953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsOneByte(const uc16* chars, int length) { 9954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NonOneByteStart(chars, length) >= length; 9955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class Visitor> 9958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline ConsString* VisitFlat(Visitor* visitor, 9959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* string, 9960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = 0); 9961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<FixedArray> CalculateLineEnds(Handle<String> string, 9963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool include_ending_line); 9964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use the hash field to forward to the canonical internalized string 9966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // when deserializing an internalized string. 9967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetForwardedInternalizedString(String* string); 9968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline String* GetForwardedInternalizedString(); 9969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Name; 9972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class StringTableInsertionKey; 9973f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 9974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<String> SlowFlatten(Handle<ConsString> cons, 9975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag tenure); 99767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 9977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Slow case of String::Equals. This implementation works on any strings 9978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // but it is most efficient on strings that are almost flat. 9979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool SlowEquals(String* other); 9980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool SlowEquals(Handle<String> one, Handle<String> two); 9982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Slow case of AsArrayIndex. 9984f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE bool SlowAsArrayIndex(uint32_t* index); 9985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Compute and set the hash code. 9987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t ComputeAndSetHash(); 9988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(String); 9990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The SeqString abstract class captures sequential string values. 9994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass SeqString: public String { 9995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SeqString) 9997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 99983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Layout description. 99993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kHeaderSize = String::kSize; 100003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Truncate the string in-place if possible and return the result. 10002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // In case of new_length == 0, the empty string is returned without 10003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // truncating the original string. 10004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<String> Truncate(Handle<SeqString> string, 10005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int new_length); 10006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(SeqString); 10008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The OneByteString class captures sequential one-byte string objects. 10012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Each character in the OneByteString is an one-byte character. 10013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SeqOneByteString: public SeqString { 10014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kHasOneByteEncoding = true; 10016ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 10017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 10018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint16_t SeqOneByteStringGet(int index); 10019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SeqOneByteStringSet(int index, uint16_t value); 10020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the address of the characters in this string. 10022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Address GetCharsAddress(); 10023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint8_t* GetChars(); 10025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SeqOneByteString) 10027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. This method is called by the 10029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // garbage collector to compute the actual size of an OneByteString 10030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instance. 10031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int SeqOneByteStringSize(InstanceType instance_type); 10032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Computes the size for an OneByteString instance of a given length. 10034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int SizeFor(int length) { 100357f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return OBJECT_POINTER_ALIGN(kHeaderSize + length * kCharSize); 10036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 10037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximal memory usage for a single sequential one-byte string. 100393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMaxSize = 512 * MB - 1; 10040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT((kMaxSize - kHeaderSize) >= String::kMaxLength); 10041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(SeqOneByteString); 10044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The TwoByteString class captures sequential unicode string objects. 10048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Each character in the TwoByteString is a two-byte uint16_t. 10049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass SeqTwoByteString: public SeqString { 10050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kHasOneByteEncoding = false; 10052ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 10053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 10054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint16_t SeqTwoByteStringGet(int index); 10055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SeqTwoByteStringSet(int index, uint16_t value); 10056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the address of the characters in this string. 10058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Address GetCharsAddress(); 10059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uc16* GetChars(); 10061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // For regexp code. 10063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const uint16_t* SeqTwoByteStringGetData(unsigned start); 10064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SeqTwoByteString) 10066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. This method is called by the 10068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // garbage collector to compute the actual size of a TwoByteString 10069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instance. 10070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int SeqTwoByteStringSize(InstanceType instance_type); 10071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Computes the size for a TwoByteString instance of a given length. 10073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int SizeFor(int length) { 100747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return OBJECT_POINTER_ALIGN(kHeaderSize + length * kShortSize); 10075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 10076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10077e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Maximal memory usage for a single sequential two-byte string. 100783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMaxSize = 512 * MB - 1; 10079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(static_cast<int>((kMaxSize - kHeaderSize)/sizeof(uint16_t)) >= 10080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::kMaxLength); 10081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(SeqTwoByteString); 10084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The ConsString class describes string values built by using the 10088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// addition operator on strings. A ConsString is a pair where the 10089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// first and second components are pointers to other string values. 10090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// One or both components of a ConsString can be pointers to other 10091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ConsStrings, creating a binary tree of ConsStrings where the leaves 10092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// are non-ConsString string values. The string value represented by 10093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// a ConsString can be obtained by concatenating the leaf string 10094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// values in a left-to-right depth-first traversal of the tree. 10095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ConsString: public String { 10096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // First string of the cons cell. 10098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline String* first(); 10099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Doesn't check that the result is a string, even in debug mode. This is 10100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // useful during GC where the mark bits confuse the checks. 10101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* unchecked_first(); 10102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_first(String* first, 10103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 10104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Second string of the cons cell. 10106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline String* second(); 10107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Doesn't check that the result is a string, even in debug mode. This is 10108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // useful during GC where the mark bits confuse the checks. 10109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* unchecked_second(); 10110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_second(String* second, 10111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 10112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 10114c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE uint16_t ConsStringGet(int index); 10115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ConsString) 10117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 10119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kFirstOffset = POINTER_SIZE_ALIGN(String::kSize); 10120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSecondOffset = kFirstOffset + kPointerSize; 10121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kSecondOffset + kPointerSize; 10122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Minimum length for a cons string. 10124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMinLength = 13; 10125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10126756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> 10127756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick BodyDescriptor; 10128756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 10129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(ConsString) 1013069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); 10133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1013669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// The Sliced String class describes strings that are substrings of another 1013769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// sequential string. The motivation is to save time and memory when creating 1013869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// a substring. A Sliced String is described as a pointer to the parent, 1013969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// the offset from the start of the parent string and the length. Using 1014069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// a Sliced String therefore requires unpacking of the parent string and 1014169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// adding the offset to the start address. A substring of a Sliced String 1014269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// are not nested since the double indirection is simplified when creating 1014369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// such a substring. 1014469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Currently missing features are: 1014569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - handling externalized parent strings 1014669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - external strings as parent 1014769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - truncating sliced string to enable otherwise unneeded parent to be GC'ed. 1014869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass SlicedString: public String { 1014969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 1015069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline String* parent(); 10151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_parent(String* parent, 10152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 10153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int offset() const; 1015469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline void set_offset(int offset); 1015569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1015669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Dispatched behavior. 10157c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE uint16_t SlicedStringGet(int index); 1015869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SlicedString) 1016069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1016169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Layout description. 1016269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize); 1016369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kOffsetOffset = kParentOffset + kPointerSize; 1016469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kSize = kOffsetOffset + kPointerSize; 1016569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1016669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Minimum length for a sliced string. 1016769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kMinLength = 13; 1016869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1016969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch typedef FixedBodyDescriptor<kParentOffset, 1017069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kOffsetOffset + kPointerSize, kSize> 1017169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch BodyDescriptor; 1017269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(SlicedString) 1017469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1017569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 1017669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString); 1017769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 1017869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1017969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The ExternalString class describes string values that are backed by 10181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// a string resource that lies outside the V8 heap. ExternalStrings 10182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// consist of the length field common to all strings, a pointer to the 10183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// external resource. It is important to ensure (externally) that the 10184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// resource is not deallocated while the ExternalString is live in the 10185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// V8 heap. 10186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 10187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The API expects that all ExternalStrings are created through the 10188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// API. Therefore, ExternalStrings should not be used internally. 10189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ExternalString: public String { 10190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ExternalString) 10192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 10194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kResourceOffset = POINTER_SIZE_ALIGN(String::kSize); 101953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kShortSize = kResourceOffset + kPointerSize; 101963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kResourceDataOffset = kResourceOffset + kPointerSize; 101973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSize = kResourceDataOffset + kPointerSize; 101983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 101993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return whether external string is short (data pointer is not cached). 102003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline bool is_short(); 10201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kResourceOffset == Internals::kStringResourceOffset); 10203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalString); 10206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The ExternalOneByteString class is an external string backed by an 10210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// one-byte string. 10211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExternalOneByteString : public ExternalString { 10212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kHasOneByteEncoding = true; 10214ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 10215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef v8::String::ExternalOneByteStringResource Resource; 10216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The underlying resource. 102183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline const Resource* resource(); 102193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_resource(const Resource* buffer); 102203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 102213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Update the pointer cache to the external character array. 102223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The cached pointer is always valid, as the external character array does = 102233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // not move during lifetime. Deserialization is the only exception, after 102243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // which the pointer cache has to be refreshed. 102253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void update_data_cache(); 102263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline const uint8_t* GetChars(); 10228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 10230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint16_t ExternalOneByteStringGet(int index); 10231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ExternalOneByteString) 10233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 10235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalOneByteString); 10238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The ExternalTwoByteString class is an external string backed by a UTF-16 10242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// encoded string. 10243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ExternalTwoByteString: public ExternalString { 10244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kHasOneByteEncoding = false; 10246ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 10247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block typedef v8::String::ExternalStringResource Resource; 10248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The underlying string resource. 102503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline const Resource* resource(); 102513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_resource(const Resource* buffer); 102523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 102533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Update the pointer cache to the external character array. 102543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The cached pointer is always valid, as the external character array does = 102553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // not move during lifetime. Deserialization is the only exception, after 102563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // which the pointer cache has to be refreshed. 102573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void update_data_cache(); 102583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 102593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline const uint16_t* GetChars(); 10260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 102623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline uint16_t ExternalTwoByteStringGet(int index); 10263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // For regexp code. 102653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline const uint16_t* ExternalTwoByteStringGetData(unsigned start); 10266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ExternalTwoByteString) 10268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 10270756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 10271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); 10273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Utility superclass for stack-allocated objects that must be updated 10277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// on gc. It provides two ways for the gc to update instances, either 10278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// iterating or updating after gc. 10279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Relocatable BASE_EMBEDDED { 10280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1028144f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit inline Relocatable(Isolate* isolate); 1028244f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline virtual ~Relocatable(); 10283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void IterateInstance(ObjectVisitor* v) { } 10284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void PostGarbageCollection() { } 10285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void PostGarbageCollectionProcessing(Isolate* isolate); 10287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int ArchiveSpacePerThread(); 10288257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static char* ArchiveState(Isolate* isolate, char* to); 10289257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static char* RestoreState(Isolate* isolate, char* from); 10290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Iterate(Isolate* isolate, ObjectVisitor* v); 10291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void Iterate(ObjectVisitor* v, Relocatable* top); 10292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* Iterate(ObjectVisitor* v, char* t); 10293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1029544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 10296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Relocatable* prev_; 10297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A flat string reader provides random access to the contents of a 10301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// string independent of the character width of the string. The handle 10302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// must be valid as long as the reader is being used. 10303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass FlatStringReader : public Relocatable { 10304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1030544f0eee88ff00398ff7f715fab053374d808c90dSteve Block FlatStringReader(Isolate* isolate, Handle<String> str); 1030644f0eee88ff00398ff7f715fab053374d808c90dSteve Block FlatStringReader(Isolate* isolate, Vector<const char> input); 10307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void PostGarbageCollection(); 10308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uc32 Get(int index); 10309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier template <typename Char> 10310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Char Get(int index); 10311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length() { return length_; } 10312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String** str_; 10314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_one_byte_; 10315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length_; 10316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const void* start_; 10317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This maintains an off-stack representation of the stack frames required 10321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// to traverse a ConsString, allowing an entirely iterative and restartable 10322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// traversal of the entire string 10323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass ConsStringIterator { 10324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline ConsStringIterator() {} 10326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline explicit ConsStringIterator(ConsString* cons_string, int offset = 0) { 10327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Reset(cons_string, offset); 10328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Reset(ConsString* cons_string, int offset = 0) { 10330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch depth_ = 0; 10331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Next will always return NULL. 10332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cons_string == NULL) return; 10333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Initialize(cons_string, offset); 10334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns NULL when complete. 10336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline String* Next(int* offset_out) { 10337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *offset_out = 0; 10338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (depth_ == 0) return NULL; 10339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Continue(offset_out); 10340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStackSize = 32; 10344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use a mask instead of doing modulo operations for stack wrapping. 10345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDepthMask = kStackSize-1; 10346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(IS_POWER_OF_TWO(kStackSize)); 10347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int OffsetForDepth(int depth); 10348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void PushLeft(ConsString* string); 10350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void PushRight(ConsString* string); 10351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void AdjustMaximumDepth(); 10352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Pop(); 10353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool StackBlown() { return maximum_depth_ - depth_ == kStackSize; } 10354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Initialize(ConsString* cons_string, int offset); 10355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* Continue(int* offset_out); 10356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* NextLeaf(bool* blew_stack); 10357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* Search(int* offset_out); 10358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stack must always contain only frames for which right traversal 10360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // has not yet been performed. 10361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConsString* frames_[kStackSize]; 10362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConsString* root_; 10363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int depth_; 10364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int maximum_depth_; 10365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int consumed_; 10366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DISALLOW_COPY_AND_ASSIGN(ConsStringIterator); 10367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StringCharacterStream { 10371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline StringCharacterStream(String* string, 10373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = 0); 10374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint16_t GetNext(); 10375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasMore(); 10376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Reset(String* string, int offset = 0); 10377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VisitOneByteString(const uint8_t* chars, int length); 10378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VisitTwoByteString(const uint16_t* chars, int length); 10379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ConsStringIterator iter_; 10382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_one_byte_; 10383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch union { 10384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* buffer8_; 10385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint16_t* buffer16_; 10386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 10387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* end_; 10388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_COPY_AND_ASSIGN(StringCharacterStream); 10389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename T> 10393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass VectorIterator { 10394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block VectorIterator(T* d, int l) : data_(Vector<const T>(d, l)), index_(0) { } 10396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit VectorIterator(Vector<const T> data) : data_(data), index_(0) { } 10397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block T GetNext() { return data_[index_++]; } 10398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool has_more() { return index_ < data_.length(); } 10399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Vector<const T> data_; 10401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int index_; 10402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The Oddball describes objects null, undefined, true, and false. 10406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Oddball: public HeapObject { 10407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10408bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // [to_number_raw]: Cached raw to_number computed at startup. 10409bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline double to_number_raw() const; 10410bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline void set_to_number_raw(double value); 10411bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 10412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [to_string]: Cached to_string computed at startup. 10413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(to_string, String) 10414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [to_number]: Cached to_number computed at startup. 10416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(to_number, Object) 10417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [typeof]: Cached type_of computed at startup. 10419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(type_of, String) 10420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline byte kind() const; 1042244f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void set_kind(byte kind); 1042344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 10424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.3 ToNumber for Boolean, Null, Undefined. 10425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Handle<Object> ToNumber(Handle<Oddball> input); 10426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Oddball) 10428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 10430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Oddball) 10431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Initialize the fields. 10433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Initialize(Isolate* isolate, Handle<Oddball> oddball, 10434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* to_string, Handle<Object> to_number, 10435f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const char* type_of, byte kind); 10436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 10438bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kToNumberRawOffset = HeapObject::kHeaderSize; 10439bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kToStringOffset = kToNumberRawOffset + kDoubleSize; 10440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kToNumberOffset = kToStringOffset + kPointerSize; 10441f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kTypeOfOffset = kToNumberOffset + kPointerSize; 10442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kKindOffset = kTypeOfOffset + kPointerSize; 1044344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kSize = kKindOffset + kPointerSize; 1044444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1044544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kFalse = 0; 1044644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kTrue = 1; 1044744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kNotBooleanMask = ~1; 1044844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kTheHole = 2; 1044944f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kNull = 3; 10450109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const byte kArgumentsMarker = 4; 1045144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kUndefined = 5; 10452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const byte kUninitialized = 6; 10453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const byte kOther = 7; 10454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const byte kException = 8; 104553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const byte kOptimizedOut = 9; 10456bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const byte kStaleRegister = 10; 10457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef FixedBodyDescriptor<kToStringOffset, kTypeOfOffset + kPointerSize, 10459756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kSize> BodyDescriptor; 10460756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 10461bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch STATIC_ASSERT(kToNumberRawOffset == HeapNumber::kValueOffset); 10462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kKindOffset == Internals::kOddballKindOffset); 10463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kNull == Internals::kNullOddballKind); 10464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kUndefined == Internals::kUndefinedOddballKind); 10465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Oddball); 10468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Cell: public HeapObject { 10472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [value]: value of the cell. 10474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(value, Object) 10475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Cell) 10477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Cell* FromValueAddress(Address value) { 10479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* result = FromAddress(value - kValueOffset); 10480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Cell*>(result); 10481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Address ValueAddress() { 10484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return address() + kValueOffset; 10485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 10486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Cell) 10489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Cell) 10490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 10492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kValueOffset = HeapObject::kHeaderSize; 10493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kValueOffset + kPointerSize; 10494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10495756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef FixedBodyDescriptor<kValueOffset, 10496756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kValueOffset + kPointerSize, 10497756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kSize> BodyDescriptor; 10498756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 10499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Cell); 10501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PropertyCell : public HeapObject { 10505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [property_details]: details of the global property. 10507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(property_details_raw, Object) 10508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [value]: value of the global property. 10509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(value, Object) 10510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [dependent_code]: dependent code that depends on the type of the global 10511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // property. 10512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(dependent_code, DependentCode) 10513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline PropertyDetails property_details(); 10515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_property_details(PropertyDetails details); 10516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyCellConstantType GetConstantType(); 10518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Computes the new type of the cell's contents for the given value, but 10520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // without actually modifying the details. 10521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static PropertyCellType UpdatedType(Handle<PropertyCell> cell, 10522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 10523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDetails details); 10524f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Prepares property cell at given entry for receiving given value. 10525f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // As a result the old cell could be invalidated and/or dependent code could 10526f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // be deoptimized. Returns the prepared property cell. 10527f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<PropertyCell> PrepareForValue( 10528f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<GlobalDictionary> dictionary, int entry, Handle<Object> value, 10529f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyDetails details); 10530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<PropertyCell> InvalidateEntry( 10532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<GlobalDictionary> dictionary, int entry); 10533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetValueWithInvalidation(Handle<PropertyCell> cell, 10535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> new_value); 10536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(PropertyCell) 10538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(PropertyCell) 10541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(PropertyCell) 10542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description. 10544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kDetailsOffset = HeapObject::kHeaderSize; 10545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kValueOffset = kDetailsOffset + kPointerSize; 10546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kDependentCodeOffset = kValueOffset + kPointerSize; 10547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kDependentCodeOffset + kPointerSize; 10548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef FixedBodyDescriptor<kValueOffset, 10550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize, 10551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize> BodyDescriptor; 10552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PropertyCell); 10555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass WeakCell : public HeapObject { 10559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 10560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Object* value() const; 10561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // This should not be called by anyone except GC. 10563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void clear(); 10564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // This should not be called by anyone except allocator. 10566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void initialize(HeapObject* value); 10567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool cleared() const; 10569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_ACCESSORS(next, Object) 10571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_next(Object* the_hole_value); 10573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool next_cleared(); 10575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CAST(WeakCell) 10577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_PRINTER(WeakCell) 10579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_VERIFIER(WeakCell) 10580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Layout description. 10582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kValueOffset = HeapObject::kHeaderSize; 10583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNextOffset = kValueOffset + kPointerSize; 10584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kSize = kNextOffset + kPointerSize; 10585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier typedef FixedBodyDescriptor<kValueOffset, kSize, kSize> BodyDescriptor; 10587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 10589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DISALLOW_IMPLICIT_CONSTRUCTORS(WeakCell); 10590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 10591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10593257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// The JSProxy describes EcmaScript Harmony proxies 105943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass JSProxy: public JSReceiver { 10595257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 10596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<JSProxy> New(Isolate* isolate, 10597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object>, 10598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object>); 10599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // [handler]: The handler property. 10601257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECL_ACCESSORS(handler, Object) 10602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [target]: The target property. 10603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(target, JSReceiver) 106043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [hash]: The hash code property (undefined if not initialized yet). 106053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(hash, Object) 106063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Context> GetFunctionRealm(Handle<JSProxy> proxy); 106083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(JSProxy) 106103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch INLINE(bool IsRevoked() const); 10612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Revoke(Handle<JSProxy> proxy); 10613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.1 10615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Object> GetPrototype(Handle<JSProxy> receiver); 10616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.2 10618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPrototype(Handle<JSProxy> proxy, 10619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 10620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool from_javascript, 10621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 10622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.3 10623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> IsExtensible(Handle<JSProxy> proxy); 10624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.4 (when passed DONT_THROW) 10626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> PreventExtensions( 10627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSProxy> proxy, ShouldThrow should_throw); 10628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.5 10630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> GetOwnPropertyDescriptor( 10631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSProxy> proxy, Handle<Name> name, 10632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc); 10633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.6 10635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnProperty( 10636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSProxy> object, Handle<Object> key, 10637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 10638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.7 10640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> HasProperty(Isolate* isolate, 10641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSProxy> proxy, 10642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> name); 10643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.8 10645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetProperty( 10646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSProxy> proxy, Handle<Name> name, 106473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> receiver, bool* was_found); 106483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.9 10650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetProperty(Handle<JSProxy> proxy, 10651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> name, 10652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 10653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> receiver, 10654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode); 10655257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 10656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.10 (when passed SLOPPY) 10657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeletePropertyOrElement( 10658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSProxy> proxy, Handle<Name> name, LanguageMode language_mode); 106593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.12 10661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> OwnPropertyKeys( 10662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSReceiver> receiver, Handle<JSProxy> proxy, 10663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyFilter filter, KeyAccumulator* accumulator); 10664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 10665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes( 10666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it); 10667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 10669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(JSProxy) 10670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(JSProxy) 10671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 10673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kTargetOffset = JSReceiver::kHeaderSize; 10674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHandlerOffset = kTargetOffset + kPointerSize; 10675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHashOffset = kHandlerOffset + kPointerSize; 10676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kHashOffset + kPointerSize; 10677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef FixedBodyDescriptor<JSReceiver::kPropertiesOffset, kSize, kSize> 10679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BodyDescriptor; 10680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1068113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Object* GetIdentityHash(Handle<JSProxy> receiver); 10682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1068313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Smi* GetOrCreateIdentityHash(Isolate* isolate, Handle<JSProxy> proxy); 10684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10685109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static Maybe<bool> SetPrivateProperty(Isolate* isolate, Handle<JSProxy> proxy, 10686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Symbol> private_name, 10687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, 10688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 10689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10690109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 10691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy); 10692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSCollection : public JSObject { 10696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [table]: the backing hash table 10698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(table, Object) 10699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTableOffset = JSObject::kHeaderSize; 10701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kTableOffset + kPointerSize; 10702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSCollection); 10705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JSSet describes EcmaScript Harmony sets 10709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSSet : public JSCollection { 10710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSSet) 10712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Initialize(Handle<JSSet> set, Isolate* isolate); 10714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Clear(Handle<JSSet> set); 10715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSSet) 10718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSSet) 10719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSSet); 10722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JSMap describes EcmaScript Harmony maps 10726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSMap : public JSCollection { 10727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSMap) 10729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Initialize(Handle<JSMap> map, Isolate* isolate); 10731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Clear(Handle<JSMap> map); 10732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSMap) 10735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSMap) 10736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSMap); 10739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10741c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass JSArrayIterator : public JSObject { 10742c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 10743c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(JSArrayIterator) 10744c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(JSArrayIterator) 10745c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10746c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(JSArrayIterator) 10747c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10748c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [object]: the [[IteratedObject]] internal field. 10749c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(object, Object) 10750c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10751c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [index]: The [[ArrayIteratorNextIndex]] internal field. 10752c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(index, Object) 10753c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10754c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [map]: The Map of the [[IteratedObject]] field at the time the iterator is 10755c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // allocated. 10756c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(object_map, Object) 10757c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10758c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Return the ElementsKind that a JSArrayIterator's [[IteratedObject]] is 10759c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // expected to have, based on its instance type. 10760c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static ElementsKind ElementsKindForInstanceType(InstanceType instance_type); 10761c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10762c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIteratedObjectOffset = JSObject::kHeaderSize; 10763c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNextIndexOffset = kIteratedObjectOffset + kPointerSize; 10764c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIteratedObjectMapOffset = kNextIndexOffset + kPointerSize; 10765c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kIteratedObjectMapOffset + kPointerSize; 10766c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10767c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 10768c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayIterator); 10769c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 10770c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10771f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass JSStringIterator : public JSObject { 10772f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 10773f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Dispatched behavior. 10774f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_PRINTER(JSStringIterator) 10775f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_VERIFIER(JSStringIterator) 10776f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10777f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_CAST(JSStringIterator) 10778f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10779f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // [string]: the [[IteratedString]] internal field. 10780f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(string, String) 10781f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10782f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // [index]: The [[StringIteratorNextIndex]] internal field. 10783f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline int index() const; 10784f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline void set_index(int value); 10785f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10786f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kStringOffset = JSObject::kHeaderSize; 10787f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kNextIndexOffset = kStringOffset + kPointerSize; 10788f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kSize = kNextIndexOffset + kPointerSize; 10789f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10790f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 10791f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSStringIterator); 10792f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 10793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10794c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// A JS iterator over the elements of a FixedArray. 10795c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// This corresponds to ListIterator in ecma262/#sec-createlistiterator. 10796c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass JSFixedArrayIterator : public JSObject { 10797c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 10798c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(JSFixedArrayIterator) 10799c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(JSFixedArrayIterator) 10800c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(JSFixedArrayIterator) 10801c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10802c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The array over which the iterator iterates. 10803c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(array, FixedArray) 10804c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10805c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The index of the array element that will be returned next. 10806c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_INT_ACCESSORS(index) 10807c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10808c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The initial value of the object's "next" property. 10809c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(initial_next, JSFunction) 10810c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10811c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kArrayOffset = JSObject::kHeaderSize; 10812c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIndexOffset = kArrayOffset + kPointerSize; 10813c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNextOffset = kIndexOffset + kPointerSize; 10814c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kHeaderSize = kNextOffset + kPointerSize; 10815c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10816c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch enum InObjectPropertyIndex { 10817c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kNextIndex, 10818c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kInObjectPropertyCount // Dummy. 10819c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch }; 10820c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10821c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 10822c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSFixedArrayIterator); 10823c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 10824c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OrderedHashTableIterator is an iterator that iterates over the keys and 10826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// values of an OrderedHashTable. 10827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 10828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The iterator has a reference to the underlying OrderedHashTable data, 10829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [table], as well as the current [index] the iterator is at. 10830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 10831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When the OrderedHashTable is rehashed it adds a reference from the old table 10832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// to the new table as well as storing enough data about the changes so that the 10833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// iterator [index] can be adjusted accordingly. 10834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 10835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When the [Next] result from the iterator is requested, the iterator checks if 10836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// there is a newer table that it needs to transition to. 10837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Derived, class TableType> 10838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OrderedHashTableIterator: public JSObject { 10839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [table]: the backing hash table mapping keys to values. 10841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(table, Object) 10842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [index]: The index into the data table. 10844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(index, Object) 10845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [kind]: The kind of iteration this is. One of the [Kind] enum values. 10847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(kind, Object) 10848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef OBJECT_PRINT 10850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void OrderedHashTableIteratorPrint(std::ostream& os); // NOLINT 10851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 10852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTableOffset = JSObject::kHeaderSize; 10854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIndexOffset = kTableOffset + kPointerSize; 10855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kKindOffset = kIndexOffset + kPointerSize; 10856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kKindOffset + kPointerSize; 10857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Kind { 10859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kKindKeys = 1, 10860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kKindValues = 2, 10861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kKindEntries = 3 10862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 10863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Whether the iterator has more elements. This needs to be called before 10865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // calling |CurrentKey| and/or |CurrentValue|. 10866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasMore(); 10867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Move the index forward one. 10869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MoveNext() { 10870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_index(Smi::FromInt(Smi::cast(index())->value() + 1)); 10871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Populates the array with the next key and value and then moves the iterator 10874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // forward. 10875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This returns the |kind| or 0 if the iterator is already at the end. 10876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Smi* Next(JSArray* value_array); 10877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the current key of the iterator. This should only be called when 10879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // |HasMore| returns true. 10880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* CurrentKey(); 10881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Transitions the iterator to the non obsolete backing store. This is a NOP 10884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // if the [table] is not obsolete. 10885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Transition(); 10886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(OrderedHashTableIterator); 10888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSSetIterator: public OrderedHashTableIterator<JSSetIterator, 10892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OrderedHashSet> { 10893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSSetIterator) 10896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSSetIterator) 10897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSSetIterator) 10899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Called by |Next| to populate the array. This allows the subclasses to 10901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // populate the array differently. 10902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void PopulateValueArray(FixedArray* array); 10903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSSetIterator); 10906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSMapIterator: public OrderedHashTableIterator<JSMapIterator, 10910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OrderedHashMap> { 10911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSMapIterator) 10914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSMapIterator) 10915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSMapIterator) 10917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Called by |Next| to populate the array. This allows the subclasses to 10919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // populate the array differently. 10920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void PopulateValueArray(FixedArray* array); 10921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the current value of the iterator. This should only be called when 10924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // |HasMore| returns true. 10925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* CurrentValue(); 10926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSMapIterator); 10928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Base class for both JSWeakMap and JSWeakSet 10932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSWeakCollection: public JSObject { 10933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10934f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(JSWeakCollection) 10935f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 10936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [table]: the backing hash table mapping keys to values. 10937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(table, Object) 10938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [next]: linked list of encountered weak maps during GC. 10940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(next, Object) 10941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Initialize(Handle<JSWeakCollection> collection, Isolate* isolate); 10943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Set(Handle<JSWeakCollection> collection, Handle<Object> key, 10944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, int32_t hash); 10945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool Delete(Handle<JSWeakCollection> collection, Handle<Object> key, 10946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t hash); 10947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTableOffset = JSObject::kHeaderSize; 10949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNextOffset = kTableOffset + kPointerSize; 10950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kNextOffset + kPointerSize; 10951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visiting policy defines whether the table and next collection fields 10953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // should be visited or not. 10954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum BodyVisitingPolicy { kVisitStrong, kVisitWeak }; 10955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterates the function object according to the visiting policy. 10957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <BodyVisitingPolicy> 10958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptorImpl; 10959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visit the whole object. 10961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kVisitStrong> BodyDescriptor; 10962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Don't visit table and next collection fields. 10964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kVisitWeak> BodyDescriptorWeak; 10965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection); 10968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JSWeakMap describes EcmaScript Harmony weak maps 10972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSWeakMap: public JSWeakCollection { 10973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSWeakMap) 10975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSWeakMap) 10978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSWeakMap) 10979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakMap); 10982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JSWeakSet describes EcmaScript Harmony weak sets 10986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSWeakSet: public JSWeakCollection { 10987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSWeakSet) 10989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSWeakSet) 10992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSWeakSet) 10993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakSet); 10996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Whether a JSArrayBuffer is a SharedArrayBuffer or not. 11000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class SharedFlag { kNotShared, kShared }; 11001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSArrayBuffer: public JSObject { 11004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 11005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [backing_store]: backing memory for this array 11006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(backing_store, void) 11007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [byte_length]: length in bytes 11009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(byte_length, Object) 11010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t bit_field() const; 11012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_bit_field(uint32_t bits); 11013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_external(); 11015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_is_external(bool value); 11016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool is_neuterable(); 11018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_is_neuterable(bool value); 11019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 11020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool was_neutered(); 11021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_was_neutered(bool value); 11022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_shared(); 11024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_is_shared(bool value); 11025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSArrayBuffer) 11027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Neuter(); 11029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11030c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE static void Setup( 11031c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSArrayBuffer> array_buffer, Isolate* isolate, bool is_external, 11032c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void* data, size_t allocated_length, 11033c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch SharedFlag shared = SharedFlag::kNotShared); 11034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool SetupAllocatingData(Handle<JSArrayBuffer> array_buffer, 11036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, size_t allocated_length, 11037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool initialize = true, 11038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SharedFlag shared = SharedFlag::kNotShared); 11039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSArrayBuffer) 11042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSArrayBuffer) 11043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kByteLengthOffset = JSObject::kHeaderSize; 11045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBackingStoreOffset = kByteLengthOffset + kPointerSize; 11046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBitFieldSlot = kBackingStoreOffset + kPointerSize; 11047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT 11048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBitFieldOffset = kBitFieldSlot; 11049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#else 11050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBitFieldOffset = kBitFieldSlot + kIntSize; 11051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 11052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kBitFieldSlot + kPointerSize; 11053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSizeWithInternalFields = 11055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize; 11056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterates all fields in the object including internal ones except 11058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // kBackingStoreOffset and kBitFieldSlot. 11059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 11060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class IsExternal : public BitField<bool, 1, 1> {}; 11062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class IsNeuterable : public BitField<bool, 2, 1> {}; 11063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class WasNeutered : public BitField<bool, 3, 1> {}; 11064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class IsShared : public BitField<bool, 4, 1> {}; 11065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 11067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer); 110683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 110693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11070257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 11071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSArrayBufferView: public JSObject { 110723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 11073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [buffer]: ArrayBuffer that this typed array views. 11074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(buffer, Object) 110753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [byte_offset]: offset of typed array in bytes. 11077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(byte_offset, Object) 110783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [byte_length]: length of typed array in bytes. 11080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(byte_length, Object) 110813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSArrayBufferView) 11083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSArrayBufferView) 11085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool WasNeutered() const; 11087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBufferOffset = JSObject::kHeaderSize; 11089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kByteOffsetOffset = kBufferOffset + kPointerSize; 11090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kByteLengthOffset = kByteOffsetOffset + kPointerSize; 11091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kViewSize = kByteLengthOffset + kPointerSize; 110923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 110933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 11094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP 11095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(raw_byte_offset, Object) 11096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(raw_byte_length, Object) 11097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 11098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBufferView); 111003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 111013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 111023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSTypedArray: public JSArrayBufferView { 111043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 11105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [length]: length of typed array in elements. 11106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(length, Object) 11107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t length_value() const; 111083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSTypedArray) 111103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalArrayType type(); 11112c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE size_t element_size(); 11113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSArrayBuffer> GetBuffer(); 11115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSTypedArray) 11118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSTypedArray) 11119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLengthOffset = kViewSize + kPointerSize; 11121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kLengthOffset + kPointerSize; 11122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSizeWithInternalFields = 11124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize + v8::ArrayBufferView::kInternalFieldCount * kPointerSize; 111253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 111263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 11127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<JSArrayBuffer> MaterializeArrayBuffer( 11128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSTypedArray> typed_array); 11129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP 11130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(raw_length, Object) 11131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 11132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSTypedArray); 111343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 111353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 111363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSDataView: public JSArrayBufferView { 1113869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 11139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSDataView) 1114069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 11141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSDataView) 11143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSDataView) 1114469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 11145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kViewSize; 1114669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 11147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSizeWithInternalFields = 11148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize + v8::ArrayBufferView::kInternalFieldCount * kPointerSize; 1114969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1115069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 11151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSDataView); 1115269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 1115369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1115469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 11155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Foreign describes objects pointing from JavaScript to C structures. 11156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass Foreign: public HeapObject { 11157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // [address]: field containing the address. 111593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline Address foreign_address(); 111603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_foreign_address(Address value); 11161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Foreign) 11163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 11165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Foreign) 11166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Foreign) 11167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 11169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 111703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kForeignAddressOffset = HeapObject::kHeaderSize; 111713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSize = kForeignAddressOffset + kPointerSize; 11172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kForeignAddressOffset == Internals::kForeignAddressOffset); 11174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 11176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Foreign); 11179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The JSArray describes JavaScript Arrays 11183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Such an array can be in one of two modes: 11184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - fast, backing storage is a FixedArray and length <= elements.length(); 11185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Please note: push and pop can be used to grow and shrink the array. 11186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - slow, backing storage is a HashTable with numbers as keys. 11187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSArray: public JSObject { 11188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [length]: The length property. 11190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(length, Object) 11191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 111924515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // Overload the length setter to skip write barrier when the length 111934515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // is set to a smi. This matches the set function on FixedArray. 111944515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke inline void set_length(Smi* length); 111954515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 11196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static bool HasReadOnlyLength(Handle<JSArray> array); 11197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool WouldChangeReadOnlyLength(Handle<JSArray> array, uint32_t index); 11198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 11199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Initialize the array with the given capacity. The function may 11200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // fail due to out-of-memory situations, but only if the requested 11201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // capacity is non-zero. 11202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Initialize(Handle<JSArray> array, int capacity, int length = 0); 11203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the JSArray has fast elements, and new_length would result in 11205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // normalization, returns true. 11206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool SetLengthWouldNormalize(uint32_t new_length); 11207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline bool SetLengthWouldNormalize(Heap* heap, uint32_t new_length); 11208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 112093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Initializes the array to a certain length. 11210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool AllowsSetLength(); 11211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetLength(Handle<JSArray> array, uint32_t length); 112133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set the content of the array to the content of storage. 11215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void SetContent(Handle<JSArray> array, 11216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArrayBase> storage); 11217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.4.2.1 11219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnProperty( 11220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSArray> o, Handle<Object> name, 11221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 11222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool AnythingToArrayLength(Isolate* isolate, 11224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> length_object, 11225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t* output); 11226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> ArraySetLength(Isolate* isolate, 11227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSArray> a, 11228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, 11229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 11230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Checks whether the Array has the current realm's Array.prototype as its 112323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // prototype. This function is best-effort and only gives a conservative 112333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // approximation, erring on the side of false, in particular with respect 112343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // to Proxies and objects with a hidden prototype. 112353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool HasArrayPrototype(Isolate* isolate); 112363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(JSArray) 11238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 11240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSArray) 11241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSArray) 11242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Number of element slots to pre-allocate for an empty array. 11244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPreallocatedArrayElements = 4; 11245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 11247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kLengthOffset = JSObject::kHeaderSize; 11248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kLengthOffset + kPointerSize; 11249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInitialMaxFastElementArray = 11251f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch (kMaxRegularHeapObjectSize - FixedArray::kHeaderSize - kSize - 11252f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AllocationMemento::kSize) / 11253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kPointerSize; 11254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSArray); 11257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> CacheInitialJSArrayMaps(Handle<Context> native_context, 11261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> initial_map); 11262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// JSRegExpResult is just a JSArray with a specific initial map. 112656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// This initial map adds in-object properties for "index" and "input" 112666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// properties, as assigned by RegExp.prototype.exec, which allows 112676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// faster creation of RegExp exec results. 112686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// This class just holds constants used when creating the result. 112696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// After creation the result must be treated as a JSArray in all regards. 112706ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass JSRegExpResult: public JSArray { 112716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 112726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Offsets of object fields. 112736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kIndexOffset = JSArray::kSize; 112746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kInputOffset = kIndexOffset + kPointerSize; 112756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kSize = kInputOffset + kPointerSize; 112766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Indices of in-object properties. 112776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kIndexIndex = 0; 112786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kInputIndex = 1; 112796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 112806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSRegExpResult); 112816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 112826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 112836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 11284109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// An accessor must have a getter, but can have no setter. 11285109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// 11286109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// When setting a property, V8 searches accessors in prototypes. 11287109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// If an accessor was found and it does not have a setter, 11288109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// the request is ignored. 11289109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// 11290109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// If the accessor in the prototype has the READ_ONLY property attribute, then 11291109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// a new value is added to the derived object when the property is set. 11292109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This shadows the accessor in the prototype. 11293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass AccessorInfo: public Struct { 11294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(name, Object) 11296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(flag) 11297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(expected_receiver_type, Object) 11298bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // This directly points at a foreign C function to be used from the runtime. 11299109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(getter, Object) 11300109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(setter, Object) 11301bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // This either points at the same as above, or a trampoline in case we are 11302bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // running with the simulator. Use these entries from generated code. 11303bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECL_ACCESSORS(js_getter, Object) 11304109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(data, Object) 11305109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11306bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static Address redirect(Isolate* isolate, Address address, 11307bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch AccessorComponent component); 11308bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Address redirected_getter() const; 11309bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 11310109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Dispatched behavior. 11311109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECLARE_PRINTER(AccessorInfo) 11312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool all_can_read(); 11314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_all_can_read(bool value); 11315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool all_can_write(); 11317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_all_can_write(bool value); 11318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_special_data_property(); 11320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_is_special_data_property(bool value); 11321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11322c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool replace_on_access(); 11323c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void set_replace_on_access(bool value); 11324c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 113253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool is_sloppy(); 113263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_is_sloppy(bool value); 113273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline PropertyAttributes property_attributes(); 11329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_property_attributes(PropertyAttributes attributes); 11330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Checks whether the given receiver is compatible with this accessor. 11332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsCompatibleReceiverMap(Isolate* isolate, 11333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<AccessorInfo> info, 11334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map); 11335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsCompatibleReceiver(Object* receiver); 11336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AccessorInfo) 11338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AccessorInfo) 11341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Append all descriptors to the array that are not already there. 11343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return number added. 11344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int AppendUnique(Handle<Object> descriptors, 11345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array, 11346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int valid_descriptors); 11347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNameOffset = HeapObject::kHeaderSize; 11349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kFlagOffset = kNameOffset + kPointerSize; 11350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kExpectedReceiverTypeOffset = kFlagOffset + kPointerSize; 11351bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kSetterOffset = kExpectedReceiverTypeOffset + kPointerSize; 11352bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kGetterOffset = kSetterOffset + kPointerSize; 11353bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kJsGetterOffset = kGetterOffset + kPointerSize; 11354bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kDataOffset = kJsGetterOffset + kPointerSize; 11355109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kDataOffset + kPointerSize; 11356109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasExpectedReceiverType(); 11360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions in flag. 11362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAllCanReadBit = 0; 11363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAllCanWriteBit = 1; 11364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSpecialDataProperty = 2; 113653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kIsSloppy = 3; 11366c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kReplaceOnAccess = 4; 11367c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch class AttributesField : public BitField<PropertyAttributes, 5, 3> {}; 11368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorInfo); 11370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 113733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Support for JavaScript accessors: A pair of a getter and a setter. Each 113743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// accessor can either be 113753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * a pointer to a JavaScript function or proxy: a real accessor 113763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * undefined: considered an accessor by the spec, too, strangely enough 113773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * the hole: an accessor which has not been set 113783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * a pointer to a map: a transition used to ensure map sharing 113793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass AccessorPair: public Struct { 113803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 113813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(getter, Object) 113823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(setter, Object) 113833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AccessorPair) 11385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<AccessorPair> Copy(Handle<AccessorPair> pair); 11387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* get(AccessorComponent component); 11389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set(AccessorComponent component, Object* value); 113903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 113913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Note: Returns undefined instead in case of a hole. 11392109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static Handle<Object> GetComponent(Handle<AccessorPair> accessor_pair, 11393109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch AccessorComponent component); 113943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 113953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Set both components, skipping arguments which are a JavaScript null. 11396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetComponents(Object* getter, Object* setter); 113973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool Equals(AccessorPair* pair); 11399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool Equals(Object* getter_value, Object* setter_value); 11400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool ContainsAccessor(); 114023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AccessorPair) 11405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AccessorPair) 114063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 114073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kGetterOffset = HeapObject::kHeaderSize; 114083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSetterOffset = kGetterOffset + kPointerSize; 114093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSize = kSetterOffset + kPointerSize; 114103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 114113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 114123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Strangely enough, in addition to functions and harmony proxies, the spec 114133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // requires us to consider undefined as a kind of accessor, too: 114143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // var obj = {}; 114153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Object.defineProperty(obj, "foo", {get: undefined}); 114163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // assertTrue("foo" in obj); 11417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSAccessor(Object* obj); 114183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 114193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorPair); 114203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 114213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 114223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass AccessCheckInfo: public Struct { 11424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(callback, Object) 1142613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(named_interceptor, Object) 1142713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(indexed_interceptor, Object) 11428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(data, Object) 11429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AccessCheckInfo) 11431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AccessCheckInfo) 11434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AccessCheckInfo) 11435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1143613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static AccessCheckInfo* Get(Isolate* isolate, Handle<JSObject> receiver); 1143713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 1143813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kCallbackOffset = HeapObject::kHeaderSize; 1143913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kNamedInterceptorOffset = kCallbackOffset + kPointerSize; 1144013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kIndexedInterceptorOffset = 1144113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kNamedInterceptorOffset + kPointerSize; 1144213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kDataOffset = kIndexedInterceptorOffset + kPointerSize; 11443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kDataOffset + kPointerSize; 11444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(AccessCheckInfo); 11447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass InterceptorInfo: public Struct { 11451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(getter, Object) 11453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(setter, Object) 11454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(query, Object) 11455f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(descriptor, Object) 11456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(deleter, Object) 11457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(enumerator, Object) 11458f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(definer, Object) 11459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(data, Object) 11460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_BOOLEAN_ACCESSORS(can_intercept_symbols) 11461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_BOOLEAN_ACCESSORS(all_can_read) 11462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(non_masking) 11463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 11464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline int flags() const; 11465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_flags(int flags); 11466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(InterceptorInfo) 11468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(InterceptorInfo) 11471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(InterceptorInfo) 11472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kGetterOffset = HeapObject::kHeaderSize; 11474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSetterOffset = kGetterOffset + kPointerSize; 11475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kQueryOffset = kSetterOffset + kPointerSize; 11476f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kDescriptorOffset = kQueryOffset + kPointerSize; 11477f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kDeleterOffset = kDescriptorOffset + kPointerSize; 11478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kEnumeratorOffset = kDeleterOffset + kPointerSize; 11479f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kDefinerOffset = kEnumeratorOffset + kPointerSize; 11480f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kDataOffset = kDefinerOffset + kPointerSize; 11481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kFlagsOffset = kDataOffset + kPointerSize; 11482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kSize = kFlagsOffset + kPointerSize; 11483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 11484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kCanInterceptSymbolsBit = 0; 11485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kAllCanReadBit = 1; 11486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNonMasking = 2; 11487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(InterceptorInfo); 11490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CallHandlerInfo: public Struct { 11494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(callback, Object) 11496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(data, Object) 11497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(fast_handler, Object) 11498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(CallHandlerInfo) 11500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(CallHandlerInfo) 11503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(CallHandlerInfo) 11504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kCallbackOffset = HeapObject::kHeaderSize; 11506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDataOffset = kCallbackOffset + kPointerSize; 11507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFastHandlerOffset = kDataOffset + kPointerSize; 11508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kFastHandlerOffset + kPointerSize; 11509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(CallHandlerInfo); 11512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass TemplateInfo: public Struct { 11516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(tag, Object) 11518109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(serial_number, Object) 11519109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_INT_ACCESSORS(number_of_properties) 11520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(property_list, Object) 11521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(property_accessors, Object) 11522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(TemplateInfo) 11524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11525f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(TemplateInfo) 11526f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTagOffset = HeapObject::kHeaderSize; 11528109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSerialNumberOffset = kTagOffset + kPointerSize; 11529109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kNumberOfProperties = kSerialNumberOffset + kPointerSize; 11530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPropertyListOffset = kNumberOfProperties + kPointerSize; 11531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPropertyAccessorsOffset = 11532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPropertyListOffset + kPointerSize; 11533c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kHeaderSize = kPropertyAccessorsOffset + kPointerSize; 115343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kFastTemplateInstantiationsCacheSize = 1 * KB; 11536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 115373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 11538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(TemplateInfo); 11539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass FunctionTemplateInfo: public TemplateInfo { 11543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(call_code, Object) 11545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(prototype_template, Object) 11546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(parent_template, Object) 11547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(named_property_handler, Object) 11548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(indexed_property_handler, Object) 11549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(instance_template, Object) 11550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(class_name, Object) 11551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(signature, Object) 11552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(instance_call_handler, Object) 11553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(access_check_info, Object) 1155413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(shared_function_info, Object) 11555f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_ACCESSORS(js_function, Object) 11556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(flag) 11557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int length() const; 11559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_length(int value); 11560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Following properties use flag bits. 11562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_BOOLEAN_ACCESSORS(hidden_prototype) 11563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_BOOLEAN_ACCESSORS(undetectable) 11564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If the bit is set, object instances created by this function 11565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // requires access check. 11566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_BOOLEAN_ACCESSORS(needs_access_check) 1156769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DECL_BOOLEAN_ACCESSORS(read_only_prototype) 11568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(remove_prototype) 11569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(do_not_cache) 11570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(accept_any_receiver) 11571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11572c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(cached_property_name, Object) 11573c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 11574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FunctionTemplateInfo) 11575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(FunctionTemplateInfo) 11578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(FunctionTemplateInfo) 11579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11580109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kCallCodeOffset = TemplateInfo::kHeaderSize; 11581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPrototypeTemplateOffset = 11582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kCallCodeOffset + kPointerSize; 11583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kParentTemplateOffset = 11584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPrototypeTemplateOffset + kPointerSize; 11585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNamedPropertyHandlerOffset = 11586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kParentTemplateOffset + kPointerSize; 11587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kIndexedPropertyHandlerOffset = 11588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kNamedPropertyHandlerOffset + kPointerSize; 11589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceTemplateOffset = 11590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIndexedPropertyHandlerOffset + kPointerSize; 11591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kClassNameOffset = kInstanceTemplateOffset + kPointerSize; 11592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSignatureOffset = kClassNameOffset + kPointerSize; 11593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceCallHandlerOffset = kSignatureOffset + kPointerSize; 11594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAccessCheckInfoOffset = 11595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceCallHandlerOffset + kPointerSize; 1159613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kSharedFunctionInfoOffset = 1159713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kAccessCheckInfoOffset + kPointerSize; 1159813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kFlagOffset = kSharedFunctionInfoOffset + kPointerSize; 11599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLengthOffset = kFlagOffset + kPointerSize; 11600c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kCachedPropertyNameOffset = kLengthOffset + kPointerSize; 11601c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kCachedPropertyNameOffset + kPointerSize; 11602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1160313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Handle<SharedFunctionInfo> GetOrCreateSharedFunctionInfo( 1160413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* isolate, Handle<FunctionTemplateInfo> info); 11605f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns parent function template or null. 11606f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline FunctionTemplateInfo* GetParent(Isolate* isolate); 11607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if |object| is an instance of this function template. 1160813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool IsTemplateFor(JSObject* object); 11609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsTemplateFor(Map* map); 1161013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool instantiated(); 11611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11612c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Helper function for cached accessors. 11613c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static MaybeHandle<Name> TryGetCachedPropertyName(Isolate* isolate, 11614c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> getter); 11615c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 11616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit position in the flag, from least significant bit position. 11618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHiddenPrototypeBit = 0; 11619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kUndetectableBit = 1; 11620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNeedsAccessCheckBit = 2; 1162169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kReadOnlyPrototypeBit = 3; 11622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kRemovePrototypeBit = 4; 11623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDoNotCacheBit = 5; 1162413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kAcceptAnyReceiver = 6; 11625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(FunctionTemplateInfo); 11627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ObjectTemplateInfo: public TemplateInfo { 11631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(constructor, Object) 11633f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_ACCESSORS(data, Object) 11634f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_INT_ACCESSORS(internal_field_count) 11635f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_BOOLEAN_ACCESSORS(immutable_proto) 11636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ObjectTemplateInfo) 11638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(ObjectTemplateInfo) 11641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(ObjectTemplateInfo) 11642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kConstructorOffset = TemplateInfo::kHeaderSize; 11644f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // LSB is for immutable_proto, higher bits for internal_field_count 11645f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kDataOffset = kConstructorOffset + kPointerSize; 11646f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kSize = kDataOffset + kPointerSize; 11647f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11648f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Starting from given object template's constructor walk up the inheritance 11649f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // chain till a function template that has an instance template is found. 11650f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline ObjectTemplateInfo* GetParent(Isolate* isolate); 11651f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11652f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 11653f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class IsImmutablePrototype : public BitField<bool, 0, 1> {}; 11654f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class InternalFieldCount 11655f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : public BitField<int, IsImmutablePrototype::kNext, 29> {}; 11656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The DebugInfo class holds additional information for a function being 11660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// debugged. 11661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass DebugInfo: public Struct { 11662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The shared function info for the source being debugged. 11664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(shared, SharedFunctionInfo) 11665f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11666f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_ACCESSORS(debug_bytecode_array, Object) 11667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Fixed array holding status information for each active break point. 11668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(break_points, FixedArray) 11669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11670f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Check if there is a break point at a source position. 11671f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool HasBreakPoint(int source_position); 11672f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Attempt to clear a break point. Return true if successful. 11673f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static bool ClearBreakPoint(Handle<DebugInfo> debug_info, 11674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set a break point. 11676f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void SetBreakPoint(Handle<DebugInfo> debug_info, int source_position, 11677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11678f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Get the break point objects for a source position. 11679f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> GetBreakPointObjects(int source_position); 11680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Find the break point info holding this break point object. 11681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> FindBreakPointInfo(Handle<DebugInfo> debug_info, 11682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> break_point_object); 11683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the number of break points for this function. 11684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int GetBreakPointCount(); 11685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11686c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Smi* uninitialized() { return Smi::kZero; } 11687109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11688f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool HasDebugBytecodeArray(); 11689f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool HasDebugCode(); 11690f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11691f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline BytecodeArray* OriginalBytecodeArray(); 11692f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline BytecodeArray* DebugBytecodeArray(); 11693f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline Code* DebugCode(); 11694109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DebugInfo) 11696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(DebugInfo) 11699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(DebugInfo) 11700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSharedFunctionInfoIndex = Struct::kHeaderSize; 11702f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kDebugBytecodeArrayIndex = 11703f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSharedFunctionInfoIndex + kPointerSize; 11704f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kBreakPointsStateIndex = 11705f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kDebugBytecodeArrayIndex + kPointerSize; 11706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kBreakPointsStateIndex + kPointerSize; 11707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11708f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kEstimatedNofBreakPointsInFunction = 4; 11709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11711f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Get the break point info object for a source position. 11712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Object* GetBreakPointInfo(int source_position); 11713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(DebugInfo); 11715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The BreakPointInfo class holds information for break points set in a 11719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// function. The DebugInfo object holds a BreakPointInfo object for each code 11720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// position with one or more break points. 11721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass BreakPointInfo: public Struct { 11722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The position in the source for the break position. 11724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(source_position) 11725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // List of related JavaScript break points. 11726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(break_point_objects, Object) 11727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Removes a break point. 11729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void ClearBreakPoint(Handle<BreakPointInfo> info, 11730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set a break point. 11732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void SetBreakPoint(Handle<BreakPointInfo> info, 11733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check if break point info has this break point object. 11735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool HasBreakPointObject(Handle<BreakPointInfo> info, 11736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11737109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Get the number of break points for this code offset. 11738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int GetBreakPointCount(); 11739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11740f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int GetStatementPosition(Handle<DebugInfo> debug_info); 11741f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(BreakPointInfo) 11743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(BreakPointInfo) 11746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(BreakPointInfo) 11747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11748f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kSourcePositionIndex = Struct::kHeaderSize; 11749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kBreakPointObjectsIndex = 11750f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSourcePositionIndex + kPointerSize; 11751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kBreakPointObjectsIndex + kPointerSize; 11752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(BreakPointInfo); 11755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DECL_BOOLEAN_ACCESSORS 11759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DECL_ACCESSORS 11760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_CAST 11761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_VERIFIER 11762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define VISITOR_SYNCHRONIZATION_TAGS_LIST(V) \ 11764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kStringTable, "string_table", "(Internalized strings)") \ 117653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(kExternalStringsTable, "external_strings_table", "(External strings)") \ 11766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kStrongRootList, "strong_root_list", "(Strong roots)") \ 11767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kSmiRootList, "smi_root_list", "(Smi roots)") \ 11768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kBootstrapper, "bootstrapper", "(Bootstrapper)") \ 11769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kTop, "top", "(Isolate)") \ 11770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kRelocatable, "relocatable", "(Relocatable)") \ 11771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kDebug, "debug", "(Debugger)") \ 11772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kCompilationCache, "compilationcache", "(Compilation cache)") \ 11773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kHandleScope, "handlescope", "(Handle scope)") \ 11774109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(kDispatchTable, "dispatchtable", "(Dispatch table)") \ 11775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kBuiltins, "builtins", "(Builtins)") \ 11776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kGlobalHandles, "globalhandles", "(Global handles)") \ 11777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kEternalHandles, "eternalhandles", "(Eternal handles)") \ 11778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kThreadManager, "threadmanager", "(Thread manager)") \ 11779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kStrongRoots, "strong roots", "(Strong roots)") \ 117803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(kExtensions, "Extensions", "(Extensions)") 117813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 117823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass VisitorSynchronization : public AllStatic { 117833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 117843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECLARE_ENUM(enum_item, ignore1, ignore2) enum_item, 117853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum SyncTag { 117863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISITOR_SYNCHRONIZATION_TAGS_LIST(DECLARE_ENUM) 117873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kNumberOfSyncTags 117883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 117893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_ENUM 117903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 117913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const char* const kTags[kNumberOfSyncTags]; 117923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const char* const kTagNames[kNumberOfSyncTags]; 117933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 11794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Abstract base class for visiting, and optionally modifying, the 11796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// pointers contained in Objects. Used in GC and serialization/deserialization. 11797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ObjectVisitor BASE_EMBEDDED { 11798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~ObjectVisitor() {} 11800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Visits a contiguous arrays of pointers in the half-open range 11802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [start, end). Any or all of the values may be modified on return. 11803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitPointers(Object** start, Object** end) = 0; 11804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Handy shorthand for visiting a single pointer. 11806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); } 11807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Visit weak next_code_link in Code object. 11809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitNextCodeLink(Object** p) { VisitPointers(p, p + 1); } 11810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // To allow lazy clearing of inline caches the visitor has 11812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // a rich interface for iterating over Code objects.. 11813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Visits a code target in the instruction stream. 11815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitCodeTarget(RelocInfo* rinfo); 11816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11817791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // Visits a code entry in a JS function. 11818791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block virtual void VisitCodeEntry(Address entry_address); 11819791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 11820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Visits a global property cell reference in the instruction stream. 11821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitCell(RelocInfo* rinfo); 11822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 11823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Visits a runtime entry in the instruction stream. 11824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitRuntimeEntry(RelocInfo* rinfo) {} 11825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Visits the resource of an one-byte or two-byte string. 11827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitExternalOneByteString( 11828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::String::ExternalOneByteStringResource** resource) {} 11829d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block virtual void VisitExternalTwoByteString( 11830d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block v8::String::ExternalStringResource** resource) {} 11831d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 11832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Visits a debug call target in the instruction stream. 11833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitDebugTarget(RelocInfo* rinfo); 11834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Visits the byte sequence in a function's prologue that contains information 11836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // about the code's age. 11837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitCodeAgeSequence(RelocInfo* rinfo); 11838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 118393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Visit pointer embedded into a code object. 118403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void VisitEmbeddedPointer(RelocInfo* rinfo); 118413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Visits an external reference embedded into a code object. 118433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void VisitExternalReference(RelocInfo* rinfo); 118443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visits an external reference. 11846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitExternalReference(Address* p) {} 11847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visits an (encoded) internal reference. 11849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch virtual void VisitInternalReference(RelocInfo* rinfo) {} 11850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1185144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Visits a handle that has an embedder-assigned class ID. 1185244f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual void VisitEmbedderReference(Object** p, uint16_t class_id) {} 1185344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 11854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Intended for serialization/deserialization checking: insert, or 11855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // check for the presence of, a tag at this position in the stream. 118563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Also used for marking up GC roots in heap snapshots. 118573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void Synchronize(VisitorSynchronization::SyncTag tag) {} 11858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// BooleanBit is a helper class for setting and getting a bit in an integer. 11862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass BooleanBit : public AllStatic { 11863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool get(int value, int bit_position) { 11865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (value & (1 << bit_position)) != 0; 11866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 11867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline int set(int value, int bit_position, bool v) { 11869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (v) { 11870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value |= (1 << bit_position); 11871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 11872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value &= ~(1 << bit_position); 11873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 11874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return value; 11875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 11876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // NOLINT, false-positive due to second-order macros. 11880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // NOLINT, false-positive due to second-order macros. 11881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_OBJECTS_H_ 11883