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 4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// Has to be the last include (doesn't have include guards): 4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/object-macros.h" 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 4550ef84f5fad2def87d3fbc737bec4a32711fdef4Kristian Monsen// Most object types in the V8 JavaScript are described in this file. 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Inheritance hierarchy: 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Object 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Smi (immediate small integer) 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - HeapObject (superclass for everything allocated in the heap) 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSReceiver (suitable for property access) 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSObject 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSArray 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSArrayBuffer 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSArrayBufferView 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSTypedArray 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSDataView 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - JSBoundFunction 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSCollection 603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// - JSSet 613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// - JSMap 62f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// - JSStringIterator 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSSetIterator 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSMapIterator 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSWeakCollection 6669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - JSWeakMap 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSWeakSet 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSRegExp 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSFunction 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSGeneratorObject 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - JSGlobalObject 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSGlobalProxy 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSValue 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSDate 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSMessageObject 76c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - JSModuleNamespace 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - JSProxy 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - FixedArrayBase 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ByteArray 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - BytecodeArray 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - FixedArray 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - DescriptorArray 83f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// - FrameArray 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 9562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// - FeedbackMetadata 9662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// - FeedbackVector 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 11162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// - ThinString 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - ExternalString 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ExternalOneByteString 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - ExternalTwoByteString 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - InternalizedString 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SeqInternalizedString 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SeqOneByteInternalizedString 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SeqTwoByteInternalizedString 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ConsInternalizedString 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ExternalInternalizedString 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ExternalOneByteInternalizedString 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ExternalTwoByteInternalizedString 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Symbol 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - HeapNumber 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Cell 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - PropertyCell 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Code 128109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// - AbstractCode, a wrapper around Code or BytecodeArray 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Map 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Oddball 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Foreign 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - SharedFunctionInfo 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Struct 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - AccessorInfo 135c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - PromiseResolveThenableJobInfo 136c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - PromiseReactionJobInfo 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - AccessorPair 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - AccessCheckInfo 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - InterceptorInfo 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - CallHandlerInfo 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - TemplateInfo 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - FunctionTemplateInfo 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - ObjectTemplateInfo 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - Script 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - DebugInfo 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - BreakPointInfo 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - CodeCache 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// - PrototypeInfo 149f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// - Module 150c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - ModuleInfoEntry 151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// - WeakCell 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Formats of Object*: 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Smi: [31 bit signed int] 0 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HeapObject: [32 bit direct pointer] (4 byte aligned) | 01 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 160c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstruct InliningPosition; 161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum KeyedAccessStoreMode { 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STANDARD_STORE, 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STORE_TRANSITION_TO_OBJECT, 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STORE_TRANSITION_TO_DOUBLE, 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STORE_AND_GROW_NO_TRANSITION, 167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STORE_AND_GROW_TRANSITION_TO_OBJECT, 168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STORE_AND_GROW_TRANSITION_TO_DOUBLE, 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS, 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STORE_NO_TRANSITION_HANDLE_COW 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum MutableMode { 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUTABLE, 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IMMUTABLE 176589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}; 177589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 17885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline bool IsTransitionStoreMode(KeyedAccessStoreMode store_mode) { 180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return store_mode == STORE_TRANSITION_TO_OBJECT || 181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store_mode == STORE_TRANSITION_TO_DOUBLE || 182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store_mode == STORE_AND_GROW_TRANSITION_TO_OBJECT || 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store_mode == STORE_AND_GROW_TRANSITION_TO_DOUBLE; 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline KeyedAccessStoreMode GetNonTransitioningStoreMode( 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch KeyedAccessStoreMode store_mode) { 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (store_mode >= STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) { 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return store_mode; 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (store_mode >= STORE_AND_GROW_NO_TRANSITION) { 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return STORE_AND_GROW_NO_TRANSITION; 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return STANDARD_STORE; 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 19785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 19885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline bool IsGrowStoreMode(KeyedAccessStoreMode store_mode) { 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return store_mode >= STORE_AND_GROW_NO_TRANSITION && 201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store_mode <= STORE_AND_GROW_TRANSITION_TO_DOUBLE; 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierenum IcCheckType { ELEMENT, PROPERTY }; 206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// SKIP_WRITE_BARRIER skips the write barrier. 209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// UPDATE_WEAK_WRITE_BARRIER skips the marking part of the write barrier and 210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// only performs the generational part. 211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// UPDATE_WRITE_BARRIER is doing the full barrier, marking and generational. 212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum WriteBarrierMode { 213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SKIP_WRITE_BARRIER, 214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UPDATE_WEAK_WRITE_BARRIER, 215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UPDATE_WRITE_BARRIER 216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// PropertyNormalizationMode is used to specify whether to keep 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// inobject properties when normalizing properties of a JSObject. 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum PropertyNormalizationMode { 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CLEAR_INOBJECT_PROPERTIES, 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block KEEP_INOBJECT_PROPERTIES 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates how aggressively the prototype should be optimized. FAST_PROTOTYPE 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// will give the fastest result by tailoring the map to the prototype, but that 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// will cause polymorphism with other objects. REGULAR_PROTOTYPE is to be used 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// (at least for now) when dynamically modifying the prototype chain of an 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// object using __proto__ or Object.setPrototypeOf. 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum PrototypeOptimizationMode { REGULAR_PROTOTYPE, FAST_PROTOTYPE }; 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether transitions can be added to a source map or not. 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum TransitionFlag { 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INSERT_TRANSITION, 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OMIT_TRANSITION 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether the transition is simple: the target map of the transition 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// either extends the current map with a new property, or it modifies the 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// property that was added last to the current map. 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SimpleTransitionFlag { 246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SIMPLE_PROPERTY_TRANSITION, 247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PROPERTY_TRANSITION, 248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SPECIAL_TRANSITION 2493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 2503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether we are only interested in the descriptors of a particular 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// map, or in all descriptors in the descriptor array. 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum DescriptorFlag { 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALL_DESCRIPTORS, 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OWN_DESCRIPTORS 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ICs store extra state in a Code object. The default extra state is 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// kNoExtraICState. 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef int ExtraICState; 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const ExtraICState kNoExtraICState = 0; 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 264791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block// Instance size sentinel for objects of variable size. 2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kVariableSizeSentinel = 0; 266791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// We may store the unsigned bit field as signed Smi value and do not 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// use the sign bit. 269bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochconst int kStubMajorKeyBits = 8; 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1; 271791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All Maps have a field instance_type containing a InstanceType. 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// It describes the type of the instances. 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// As an example, a JavaScript object is a heap object and its map 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// instance_type is JS_OBJECT_TYPE. 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The names of the string instance types are intended to systematically 279e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// mirror their encoding in the instance_type field of the map. The default 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// encoding is considered TWO_BYTE. It is not mentioned in the name. ONE_BYTE 281e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// encoding is mentioned explicitly in the name. Likewise, the default 282e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke// representation is considered sequential. It is not mentioned in the 2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// name. The other representations (e.g. CONS, EXTERNAL) are explicitly 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// mentioned. Finally, the string is either a STRING_TYPE (if it is a normal 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// string) or a INTERNALIZED_STRING_TYPE (if it is a internalized string). 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// NOTE: The following things are some that depend on the string types having 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// instance_types that are less than those of all other types: 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HeapObject::Size, HeapObject::IterateBody, the typeof operator, and 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Object::IsString. 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// NOTE: Everything following JS_VALUE_TYPE is considered a 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// JSObject for GC purposes. The first four entries here have typeof 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 'object', whereas JS_FUNCTION_TYPE has typeof 'function'. 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define INSTANCE_TYPE_LIST(V) \ 29662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(INTERNALIZED_STRING_TYPE) \ 29762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(EXTERNAL_INTERNALIZED_STRING_TYPE) \ 29862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 29962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 30062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 30162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE) \ 30262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE) \ 30362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(STRING_TYPE) \ 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CONS_STRING_TYPE) \ 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_STRING_TYPE) \ 30762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(SLICED_STRING_TYPE) \ 30862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(THIN_STRING_TYPE) \ 30962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(ONE_BYTE_STRING_TYPE) \ 31062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(CONS_ONE_BYTE_STRING_TYPE) \ 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_ONE_BYTE_STRING_TYPE) \ 31262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(SLICED_ONE_BYTE_STRING_TYPE) \ 31362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(THIN_ONE_BYTE_STRING_TYPE) \ 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_STRING_TYPE) \ 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE) \ 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE) \ 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SYMBOL_TYPE) \ 32062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(HEAP_NUMBER_TYPE) \ 32162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(ODDBALL_TYPE) \ 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(MAP_TYPE) \ 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CODE_TYPE) \ 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(MUTABLE_HEAP_NUMBER_TYPE) \ 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FOREIGN_TYPE) \ 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BYTE_ARRAY_TYPE) \ 328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(BYTECODE_ARRAY_TYPE) \ 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FREE_SPACE_TYPE) \ 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_INT8_ARRAY_TYPE) \ 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_UINT8_ARRAY_TYPE) \ 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_INT16_ARRAY_TYPE) \ 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_UINT16_ARRAY_TYPE) \ 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_INT32_ARRAY_TYPE) \ 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_UINT32_ARRAY_TYPE) \ 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_FLOAT32_ARRAY_TYPE) \ 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_FLOAT64_ARRAY_TYPE) \ 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_UINT8_CLAMPED_ARRAY_TYPE) \ 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 34162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(FIXED_DOUBLE_ARRAY_TYPE) \ 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FILLER_TYPE) \ 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 344109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(ACCESSOR_INFO_TYPE) \ 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ACCESSOR_PAIR_TYPE) \ 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ACCESS_CHECK_INFO_TYPE) \ 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(INTERCEPTOR_INFO_TYPE) \ 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CALL_HANDLER_INFO_TYPE) \ 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FUNCTION_TEMPLATE_INFO_TYPE) \ 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(OBJECT_TEMPLATE_INFO_TYPE) \ 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ALLOCATION_SITE_TYPE) \ 35262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(ALLOCATION_MEMENTO_TYPE) \ 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SCRIPT_TYPE) \ 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TYPE_FEEDBACK_INFO_TYPE) \ 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ALIASED_ARGUMENTS_ENTRY_TYPE) \ 356c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(PROMISE_RESOLVE_THENABLE_JOB_INFO_TYPE) \ 357c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(PROMISE_REACTION_JOB_INFO_TYPE) \ 35862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(DEBUG_INFO_TYPE) \ 35962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(BREAK_POINT_INFO_TYPE) \ 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(PROTOTYPE_INFO_TYPE) \ 36162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(TUPLE2_TYPE) \ 362c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(TUPLE3_TYPE) \ 363f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(CONTEXT_EXTENSION_TYPE) \ 36462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(CONSTANT_ELEMENTS_PAIR_TYPE) \ 365f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(MODULE_TYPE) \ 366c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(MODULE_INFO_ENTRY_TYPE) \ 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FIXED_ARRAY_TYPE) \ 36862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(TRANSITION_ARRAY_TYPE) \ 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHARED_FUNCTION_INFO_TYPE) \ 37062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(CELL_TYPE) \ 371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(WEAK_CELL_TYPE) \ 37262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(PROPERTY_CELL_TYPE) \ 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 37462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_PROXY_TYPE) \ 37562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_GLOBAL_OBJECT_TYPE) \ 37662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_GLOBAL_PROXY_TYPE) \ 37762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_SPECIAL_API_OBJECT_TYPE) \ 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_VALUE_TYPE) \ 37962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_MESSAGE_OBJECT_TYPE) \ 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_DATE_TYPE) \ 38162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_API_OBJECT_TYPE) \ 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_OBJECT_TYPE) \ 38313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JS_ARGUMENTS_TYPE) \ 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_CONTEXT_EXTENSION_OBJECT_TYPE) \ 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_GENERATOR_OBJECT_TYPE) \ 386c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_MODULE_NAMESPACE_TYPE) \ 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_ARRAY_TYPE) \ 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_ARRAY_BUFFER_TYPE) \ 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_TYPED_ARRAY_TYPE) \ 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_DATA_VIEW_TYPE) \ 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_SET_TYPE) \ 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_MAP_TYPE) \ 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_SET_ITERATOR_TYPE) \ 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_MAP_ITERATOR_TYPE) \ 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_WEAK_MAP_TYPE) \ 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_WEAK_SET_TYPE) \ 39762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_PROMISE_CAPABILITY_TYPE) \ 398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(JS_PROMISE_TYPE) \ 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(JS_REGEXP_TYPE) \ 40013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JS_ERROR_TYPE) \ 40162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_ASYNC_FROM_SYNC_ITERATOR_TYPE) \ 402f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(JS_STRING_ITERATOR_TYPE) \ 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 404c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_TYPED_ARRAY_KEY_ITERATOR_TYPE) \ 405c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_ARRAY_KEY_ITERATOR_TYPE) \ 406c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE) \ 407c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 408c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT8_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 40962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_INT8_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 410c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT16_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 41162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_INT16_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 412c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT32_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 41362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_INT32_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 414c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FLOAT32_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 415c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FLOAT64_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 416c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT8_CLAMPED_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 417c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 418c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 419c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 420c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 421c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 422c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 423c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 424c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_GENERIC_ARRAY_KEY_VALUE_ITERATOR_TYPE) \ 425c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 426c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT8_ARRAY_VALUE_ITERATOR_TYPE) \ 42762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_INT8_ARRAY_VALUE_ITERATOR_TYPE) \ 428c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT16_ARRAY_VALUE_ITERATOR_TYPE) \ 42962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_INT16_ARRAY_VALUE_ITERATOR_TYPE) \ 430c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT32_ARRAY_VALUE_ITERATOR_TYPE) \ 43162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_INT32_ARRAY_VALUE_ITERATOR_TYPE) \ 432c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FLOAT32_ARRAY_VALUE_ITERATOR_TYPE) \ 433c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FLOAT64_ARRAY_VALUE_ITERATOR_TYPE) \ 434c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_UINT8_CLAMPED_ARRAY_VALUE_ITERATOR_TYPE) \ 435c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 436c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_SMI_ARRAY_VALUE_ITERATOR_TYPE) \ 437c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_SMI_ARRAY_VALUE_ITERATOR_TYPE) \ 438c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_ARRAY_VALUE_ITERATOR_TYPE) \ 439c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_ARRAY_VALUE_ITERATOR_TYPE) \ 440c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE) \ 441c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_FAST_HOLEY_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE) \ 442c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JS_GENERIC_ARRAY_VALUE_ITERATOR_TYPE) \ 443c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch \ 444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(JS_BOUND_FUNCTION_TYPE) \ 44562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_FUNCTION_TYPE) 446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Since string types are not consecutive, this macro is used to 448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// iterate over them. 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define STRING_TYPE_LIST(V) \ 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(STRING_TYPE, kVariableSizeSentinel, string, String) \ 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ONE_BYTE_STRING_TYPE, kVariableSizeSentinel, one_byte_string, \ 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OneByteString) \ 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CONS_STRING_TYPE, ConsString::kSize, cons_string, ConsString) \ 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CONS_ONE_BYTE_STRING_TYPE, ConsString::kSize, cons_one_byte_string, \ 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConsOneByteString) \ 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SLICED_STRING_TYPE, SlicedString::kSize, sliced_string, SlicedString) \ 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SLICED_ONE_BYTE_STRING_TYPE, SlicedString::kSize, sliced_one_byte_string, \ 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SlicedOneByteString) \ 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_STRING_TYPE, ExternalTwoByteString::kSize, external_string, \ 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalString) \ 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_ONE_BYTE_STRING_TYPE, ExternalOneByteString::kSize, \ 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_one_byte_string, ExternalOneByteString) \ 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE, ExternalTwoByteString::kSize, \ 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_string_with_one_byte_data, ExternalStringWithOneByteData) \ 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_STRING_TYPE, ExternalTwoByteString::kShortSize, \ 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_string, ShortExternalString) \ 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE, ExternalOneByteString::kShortSize, \ 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_one_byte_string, ShortExternalOneByteString) \ 469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalTwoByteString::kShortSize, \ 471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_string_with_one_byte_data, \ 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ShortExternalStringWithOneByteData) \ 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(INTERNALIZED_STRING_TYPE, kVariableSizeSentinel, internalized_string, \ 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InternalizedString) \ 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ONE_BYTE_INTERNALIZED_STRING_TYPE, kVariableSizeSentinel, \ 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch one_byte_internalized_string, OneByteInternalizedString) \ 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_INTERNALIZED_STRING_TYPE, ExternalTwoByteString::kSize, \ 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_internalized_string, ExternalInternalizedString) \ 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, ExternalOneByteString::kSize, \ 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_one_byte_internalized_string, ExternalOneByteInternalizedString) \ 482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalTwoByteString::kSize, \ 484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_internalized_string_with_one_byte_data, \ 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalInternalizedStringWithOneByteData) \ 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE, \ 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalTwoByteString::kShortSize, short_external_internalized_string, \ 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ShortExternalInternalizedString) \ 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE, \ 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalOneByteString::kShortSize, \ 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_one_byte_internalized_string, \ 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ShortExternalOneByteInternalizedString) \ 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE, \ 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalTwoByteString::kShortSize, \ 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch short_external_internalized_string_with_one_byte_data, \ 49662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ShortExternalInternalizedStringWithOneByteData) \ 49762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(THIN_STRING_TYPE, ThinString::kSize, thin_string, ThinString) \ 49862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(THIN_ONE_BYTE_STRING_TYPE, ThinString::kSize, thin_one_byte_string, \ 49962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ThinOneByteString) 500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A struct is a simple object a set of object-valued fields. Including an 502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// object type in this causes the compiler to generate most of the boilerplate 503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// code for the class including allocation and garbage collection routines, 504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// casts and predicates. All you need to define is the class, methods and 505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// object verification routines. Easy, no? 506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Note that for subtle reasons related to the ordering or numerical values of 508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST 509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// manually. 510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define STRUCT_LIST(V) \ 511109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(ACCESSOR_INFO, AccessorInfo, accessor_info) \ 512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \ 513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ 514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ 515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \ 516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \ 517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \ 518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ALLOCATION_SITE, AllocationSite, allocation_site) \ 519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ALLOCATION_MEMENTO, AllocationMemento, allocation_memento) \ 52062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(SCRIPT, Script, script) \ 521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(TYPE_FEEDBACK_INFO, TypeFeedbackInfo, type_feedback_info) \ 522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \ 52362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(PROMISE_RESOLVE_THENABLE_JOB_INFO, PromiseResolveThenableJobInfo, \ 52462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch promise_resolve_thenable_job_info) \ 52562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(PROMISE_REACTION_JOB_INFO, PromiseReactionJobInfo, \ 52662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch promise_reaction_job_info) \ 527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(DEBUG_INFO, DebugInfo, debug_info) \ 528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(BREAK_POINT_INFO, BreakPointInfo, break_point_info) \ 529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(PROTOTYPE_INFO, PrototypeInfo, prototype_info) \ 53062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(TUPLE2, Tuple2, tuple2) \ 531c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(TUPLE3, Tuple3, tuple3) \ 53262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(CONTEXT_EXTENSION, ContextExtension, context_extension) \ 53362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(CONSTANT_ELEMENTS_PAIR, ConstantElementsPair, constant_elements_pair) \ 534f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(MODULE, Module, module) \ 53562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(MODULE_INFO_ENTRY, ModuleInfoEntry, module_info_entry) 536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// We use the full 8 bits of the instance_type field to encode heap object 538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// instance types. The high-order bit (bit 7) is set if the object is not a 539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// string, and cleared if it is a string. 540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kIsNotStringMask = 0x80; 541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kStringTag = 0x0; 542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kNotStringTag = 0x80; 543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Bit 6 indicates that the object is an internalized string (if set) or not. 545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Bit 7 has to be clear as well. 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kIsNotInternalizedMask = 0x40; 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kNotInternalizedTag = 0x40; 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kInternalizedTag = 0x0; 549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 55062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// If bit 7 is clear then bit 3 indicates whether the string consists of 551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// two-byte characters or one-byte characters. 55262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst uint32_t kStringEncodingMask = 0x8; 553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kTwoByteStringTag = 0x0; 55462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst uint32_t kOneByteStringTag = 0x8; 555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 55662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// If bit 7 is clear, the low-order 3 bits indicate the representation 557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// of the string. 55862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst uint32_t kStringRepresentationMask = 0x07; 559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum StringRepresentationTag { 560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kSeqStringTag = 0x0, 561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kConsStringTag = 0x1, 56269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kExternalStringTag = 0x2, 56362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kSlicedStringTag = 0x3, 56462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kThinStringTag = 0x5 565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 56669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochconst uint32_t kIsIndirectStringMask = 0x1; 56769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochconst uint32_t kIsIndirectStringTag = 0x1; 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0); // NOLINT 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0); // NOLINT 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT((kConsStringTag & 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT((kSlicedStringTag & 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsIndirectStringMask) == kIsIndirectStringTag); // NOLINT 57462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochSTATIC_ASSERT((kThinStringTag & kIsIndirectStringMask) == kIsIndirectStringTag); 57569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 57662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// If bit 7 is clear, then bit 4 indicates whether this two-byte 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// string actually contains one byte data. 57862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst uint32_t kOneByteDataHintMask = 0x10; 57962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst uint32_t kOneByteDataHintTag = 0x10; 5809dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 5813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// If bit 7 is clear and string representation indicates an external string, 58262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// then bit 5 indicates whether the data pointer is cached. 58362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst uint32_t kShortExternalStringMask = 0x20; 58462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochconst uint32_t kShortExternalStringTag = 0x20; 585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A ConsString with an empty string as the right side is a candidate 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// for being shortcut by the garbage collector. We don't allocate any 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// non-flat internalized strings, so we do not shortcut them thereby 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// avoiding turning internalized strings into strings. The bit-masks 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// below contain the internalized bit as additional safety. 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// See heap.cc, mark-compact.cc and objects-visiting.cc. 592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockconst uint32_t kShortcutTypeMask = 593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIsNotStringMask | 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsNotInternalizedMask | 595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kStringRepresentationMask; 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst uint32_t kShortcutTypeTag = kConsStringTag | kNotInternalizedTag; 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline bool IsShortcutCandidate(int type) { 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ((type & kShortcutTypeMask) == kShortcutTypeTag); 600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum InstanceType { 603e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // String types. 604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch INTERNALIZED_STRING_TYPE = kTwoByteStringTag | kSeqStringTag | 605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInternalizedTag, // FIRST_PRIMITIVE_TYPE 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ONE_BYTE_INTERNALIZED_STRING_TYPE = 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOneByteStringTag | kSeqStringTag | kInternalizedTag, 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_TYPE = 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTwoByteStringTag | kExternalStringTag | kInternalizedTag, 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE = 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOneByteStringTag | kExternalStringTag | kInternalizedTag, 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE = 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_TYPE | kOneByteDataHintTag | 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInternalizedTag, 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE = EXTERNAL_INTERNALIZED_STRING_TYPE | 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kShortExternalStringTag | 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInternalizedTag, 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE = 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kShortExternalStringTag | 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInternalizedTag, 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE = 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kShortExternalStringTag | kInternalizedTag, 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STRING_TYPE = INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ONE_BYTE_STRING_TYPE = 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag | kNotInternalizedTag, 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CONS_ONE_BYTE_STRING_TYPE = 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOneByteStringTag | kConsStringTag | kNotInternalizedTag, 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SLICED_STRING_TYPE = 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTwoByteStringTag | kSlicedStringTag | kNotInternalizedTag, 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SLICED_ONE_BYTE_STRING_TYPE = 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOneByteStringTag | kSlicedStringTag | kNotInternalizedTag, 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_STRING_TYPE = 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_ONE_BYTE_STRING_TYPE = 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNotInternalizedTag, 6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SHORT_EXTERNAL_STRING_TYPE = 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE = 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE | kNotInternalizedTag, 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE = 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SHORT_EXTERNAL_INTERNALIZED_STRING_WITH_ONE_BYTE_DATA_TYPE | 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNotInternalizedTag, 64862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch THIN_STRING_TYPE = kTwoByteStringTag | kThinStringTag | kNotInternalizedTag, 64962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch THIN_ONE_BYTE_STRING_TYPE = 65062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kOneByteStringTag | kThinStringTag | kNotInternalizedTag, 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Non-string names 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SYMBOL_TYPE = kNotStringTag, // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE 654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Other primitives (cannot contain non-map-word pointers to heap objects). 656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HEAP_NUMBER_TYPE, 657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ODDBALL_TYPE, // LAST_PRIMITIVE_TYPE 658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 659e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Objects allocated in their own spaces (never in new space). 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MAP_TYPE, 661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CODE_TYPE, 662e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 663e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // "Data", objects that cannot contain non-map-word pointers to heap 664e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // objects. 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUTABLE_HEAP_NUMBER_TYPE, 666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch FOREIGN_TYPE, 667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block BYTE_ARRAY_TYPE, 668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BYTECODE_ARRAY_TYPE, 6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FREE_SPACE_TYPE, 670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FIXED_INT8_ARRAY_TYPE, // FIRST_FIXED_TYPED_ARRAY_TYPE 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_UINT8_ARRAY_TYPE, 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_INT16_ARRAY_TYPE, 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_UINT16_ARRAY_TYPE, 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_INT32_ARRAY_TYPE, 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_UINT32_ARRAY_TYPE, 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_FLOAT32_ARRAY_TYPE, 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_FLOAT64_ARRAY_TYPE, 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_UINT8_CLAMPED_ARRAY_TYPE, // LAST_FIXED_TYPED_ARRAY_TYPE 6793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch FIXED_DOUBLE_ARRAY_TYPE, 680e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke FILLER_TYPE, // LAST_DATA_TYPE 681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 682e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Structs. 683109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ACCESSOR_INFO_TYPE, 6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ACCESSOR_PAIR_TYPE, 685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ACCESS_CHECK_INFO_TYPE, 686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block INTERCEPTOR_INFO_TYPE, 687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CALL_HANDLER_INFO_TYPE, 688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FUNCTION_TEMPLATE_INFO_TYPE, 689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block OBJECT_TEMPLATE_INFO_TYPE, 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOCATION_SITE_TYPE, 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOCATION_MEMENTO_TYPE, 692e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke SCRIPT_TYPE, 6933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch TYPE_FEEDBACK_INFO_TYPE, 6943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ALIASED_ARGUMENTS_ENTRY_TYPE, 695c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PROMISE_RESOLVE_THENABLE_JOB_INFO_TYPE, 696c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PROMISE_REACTION_JOB_INFO_TYPE, 697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DEBUG_INFO_TYPE, 698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block BREAK_POINT_INFO_TYPE, 699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PROTOTYPE_INFO_TYPE, 70062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch TUPLE2_TYPE, 701c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch TUPLE3_TYPE, 702f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch CONTEXT_EXTENSION_TYPE, 70362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CONSTANT_ELEMENTS_PAIR_TYPE, 704f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MODULE_TYPE, 705c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MODULE_INFO_ENTRY_TYPE, 70662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FIXED_ARRAY_TYPE, 70762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch TRANSITION_ARRAY_TYPE, 70862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SHARED_FUNCTION_INFO_TYPE, 70962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CELL_TYPE, 71062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch WEAK_CELL_TYPE, 71162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PROPERTY_CELL_TYPE, 712e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // All the following types are subtypes of JSReceiver, which corresponds to 7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // objects in the JS sense. The first and the last type in this range are 7153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the two forms of function. This organization enables using the same 716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // compares for checking the JS_RECEIVER and the NONCALLABLE_JS_OBJECT range. 7173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_PROXY_TYPE, // FIRST_JS_RECEIVER_TYPE 7183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_GLOBAL_OBJECT_TYPE, // FIRST_JS_OBJECT_TYPE 7193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_GLOBAL_PROXY_TYPE, 720bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Like JS_API_OBJECT_TYPE, but requires access checks and/or has 721bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // interceptors. 7223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_SPECIAL_API_OBJECT_TYPE, // LAST_SPECIAL_RECEIVER_TYPE 7233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JS_VALUE_TYPE, // LAST_CUSTOM_ELEMENTS_RECEIVER 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_MESSAGE_OBJECT_TYPE, 7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_DATE_TYPE, 726bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Like JS_OBJECT_TYPE, but created from API function. 727bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch JS_API_OBJECT_TYPE, 728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_OBJECT_TYPE, 72913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch JS_ARGUMENTS_TYPE, 730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_CONTEXT_EXTENSION_OBJECT_TYPE, 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_GENERATOR_OBJECT_TYPE, 732c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_MODULE_NAMESPACE_TYPE, 733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_ARRAY_TYPE, 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_ARRAY_BUFFER_TYPE, 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_TYPED_ARRAY_TYPE, 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_DATA_VIEW_TYPE, 7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_SET_TYPE, 7383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_MAP_TYPE, 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_SET_ITERATOR_TYPE, 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_MAP_ITERATOR_TYPE, 74169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch JS_WEAK_MAP_TYPE, 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JS_WEAK_SET_TYPE, 74362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch JS_PROMISE_CAPABILITY_TYPE, 744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JS_PROMISE_TYPE, 7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_REGEXP_TYPE, 74613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch JS_ERROR_TYPE, 74762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch JS_ASYNC_FROM_SYNC_ITERATOR_TYPE, 748f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch JS_STRING_ITERATOR_TYPE, 749c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 750c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_TYPED_ARRAY_KEY_ITERATOR_TYPE, 751c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_ARRAY_KEY_ITERATOR_TYPE, 752c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE, 753c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 754c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT8_ARRAY_KEY_VALUE_ITERATOR_TYPE, 755c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT8_ARRAY_KEY_VALUE_ITERATOR_TYPE, 756c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT16_ARRAY_KEY_VALUE_ITERATOR_TYPE, 757c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT16_ARRAY_KEY_VALUE_ITERATOR_TYPE, 758c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT32_ARRAY_KEY_VALUE_ITERATOR_TYPE, 759c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT32_ARRAY_KEY_VALUE_ITERATOR_TYPE, 760c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FLOAT32_ARRAY_KEY_VALUE_ITERATOR_TYPE, 761c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FLOAT64_ARRAY_KEY_VALUE_ITERATOR_TYPE, 762c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT8_CLAMPED_ARRAY_KEY_VALUE_ITERATOR_TYPE, 763c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 764c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE, 765c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_SMI_ARRAY_KEY_VALUE_ITERATOR_TYPE, 766c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_ARRAY_KEY_VALUE_ITERATOR_TYPE, 767c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_ARRAY_KEY_VALUE_ITERATOR_TYPE, 768c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE, 769c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_DOUBLE_ARRAY_KEY_VALUE_ITERATOR_TYPE, 770c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_GENERIC_ARRAY_KEY_VALUE_ITERATOR_TYPE, 771c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 772c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT8_ARRAY_VALUE_ITERATOR_TYPE, 773c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT8_ARRAY_VALUE_ITERATOR_TYPE, 774c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT16_ARRAY_VALUE_ITERATOR_TYPE, 775c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT16_ARRAY_VALUE_ITERATOR_TYPE, 776c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT32_ARRAY_VALUE_ITERATOR_TYPE, 777c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_INT32_ARRAY_VALUE_ITERATOR_TYPE, 778c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FLOAT32_ARRAY_VALUE_ITERATOR_TYPE, 779c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FLOAT64_ARRAY_VALUE_ITERATOR_TYPE, 780c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_UINT8_CLAMPED_ARRAY_VALUE_ITERATOR_TYPE, 781c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 782c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_SMI_ARRAY_VALUE_ITERATOR_TYPE, 783c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_SMI_ARRAY_VALUE_ITERATOR_TYPE, 784c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_ARRAY_VALUE_ITERATOR_TYPE, 785c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_ARRAY_VALUE_ITERATOR_TYPE, 786c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE, 787c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_FAST_HOLEY_DOUBLE_ARRAY_VALUE_ITERATOR_TYPE, 788c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JS_GENERIC_ARRAY_VALUE_ITERATOR_TYPE, 789c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JS_BOUND_FUNCTION_TYPE, 7913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JS_FUNCTION_TYPE, // LAST_JS_OBJECT_TYPE, LAST_JS_RECEIVER_TYPE 792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Pseudo-types 794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FIRST_TYPE = 0x0, 7953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAST_TYPE = JS_FUNCTION_TYPE, 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIRST_NAME_TYPE = FIRST_TYPE, 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_NAME_TYPE = SYMBOL_TYPE, 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIRST_UNIQUE_NAME_TYPE = INTERNALIZED_STRING_TYPE, 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_UNIQUE_NAME_TYPE = SYMBOL_TYPE, 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIRST_NONSTRING_TYPE = SYMBOL_TYPE, 801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FIRST_PRIMITIVE_TYPE = FIRST_NAME_TYPE, 802014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LAST_PRIMITIVE_TYPE = ODDBALL_TYPE, 803014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FIRST_FUNCTION_TYPE = JS_BOUND_FUNCTION_TYPE, 804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LAST_FUNCTION_TYPE = JS_FUNCTION_TYPE, 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Boundaries for testing for a fixed typed array. 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIRST_FIXED_TYPED_ARRAY_TYPE = FIXED_INT8_ARRAY_TYPE, 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_FIXED_TYPED_ARRAY_TYPE = FIXED_UINT8_CLAMPED_ARRAY_TYPE, 808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Boundary for promotion to old space. 809e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke LAST_DATA_TYPE = FILLER_TYPE, 8103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy). 8113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Note that there is no range for JSObject or JSProxy, since their subtypes 8123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // are not continuous in this enum! The enum ranges instead reflect the 8133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // external class names, where proxies are treated as either ordinary objects, 8143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // or functions. 815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FIRST_JS_RECEIVER_TYPE = JS_PROXY_TYPE, 8163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch LAST_JS_RECEIVER_TYPE = LAST_TYPE, 8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Boundaries for testing the types represented as JSObject 8183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch FIRST_JS_OBJECT_TYPE = JS_GLOBAL_OBJECT_TYPE, 8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch LAST_JS_OBJECT_TYPE = LAST_TYPE, 8203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Boundary for testing JSReceivers that need special property lookup handling 8213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LAST_SPECIAL_RECEIVER_TYPE = JS_SPECIAL_API_OBJECT_TYPE, 8223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Boundary case for testing JSReceivers that may have elements while having 8233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // an empty fixed array as elements backing store. This is true for string 8243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // wrappers. 8253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LAST_CUSTOM_ELEMENTS_RECEIVER = JS_VALUE_TYPE, 826c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 827c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FIRST_ARRAY_KEY_ITERATOR_TYPE = JS_TYPED_ARRAY_KEY_ITERATOR_TYPE, 828c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LAST_ARRAY_KEY_ITERATOR_TYPE = JS_GENERIC_ARRAY_KEY_ITERATOR_TYPE, 829c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 830c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FIRST_ARRAY_KEY_VALUE_ITERATOR_TYPE = JS_UINT8_ARRAY_KEY_VALUE_ITERATOR_TYPE, 831c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LAST_ARRAY_KEY_VALUE_ITERATOR_TYPE = JS_GENERIC_ARRAY_KEY_VALUE_ITERATOR_TYPE, 832c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 833c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FIRST_ARRAY_VALUE_ITERATOR_TYPE = JS_UINT8_ARRAY_VALUE_ITERATOR_TYPE, 834c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LAST_ARRAY_VALUE_ITERATOR_TYPE = JS_GENERIC_ARRAY_VALUE_ITERATOR_TYPE, 835c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 836c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FIRST_ARRAY_ITERATOR_TYPE = FIRST_ARRAY_KEY_ITERATOR_TYPE, 837c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch LAST_ARRAY_ITERATOR_TYPE = LAST_ARRAY_VALUE_ITERATOR_TYPE, 838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(JS_OBJECT_TYPE == Internals::kJSObjectType); 841bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochSTATIC_ASSERT(JS_API_OBJECT_TYPE == Internals::kJSApiObjectType); 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(FIRST_NONSTRING_TYPE == Internals::kFirstNonstringType); 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(ODDBALL_TYPE == Internals::kOddballType); 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochSTATIC_ASSERT(FOREIGN_TYPE == Internals::kForeignType); 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 846c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, 847c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch InstanceType instance_type); 848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 849f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#define FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(V) \ 850f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(BYTECODE_ARRAY_CONSTANT_POOL_SUB_TYPE) \ 851f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(BYTECODE_ARRAY_HANDLER_TABLE_SUB_TYPE) \ 852f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(CODE_STUBS_TABLE_SUB_TYPE) \ 853f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(COMPILATION_CACHE_TABLE_SUB_TYPE) \ 854f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(CONTEXT_SUB_TYPE) \ 855f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(COPY_ON_WRITE_SUB_TYPE) \ 856f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DEOPTIMIZATION_DATA_SUB_TYPE) \ 857f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DESCRIPTOR_ARRAY_SUB_TYPE) \ 858f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(EMBEDDED_OBJECT_SUB_TYPE) \ 859f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(ENUM_CACHE_SUB_TYPE) \ 860f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(ENUM_INDICES_CACHE_SUB_TYPE) \ 861f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DEPENDENT_CODE_SUB_TYPE) \ 862f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DICTIONARY_ELEMENTS_SUB_TYPE) \ 863f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(DICTIONARY_PROPERTIES_SUB_TYPE) \ 864f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(EMPTY_PROPERTIES_DICTIONARY_SUB_TYPE) \ 865f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(FAST_ELEMENTS_SUB_TYPE) \ 866f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(FAST_PROPERTIES_SUB_TYPE) \ 867f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(FAST_TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE) \ 868f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(HANDLER_TABLE_SUB_TYPE) \ 869f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(JS_COLLECTION_SUB_TYPE) \ 870f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(JS_WEAK_COLLECTION_SUB_TYPE) \ 871f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(MAP_CODE_CACHE_SUB_TYPE) \ 872f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(NOSCRIPT_SHARED_FUNCTION_INFOS_SUB_TYPE) \ 873f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(NUMBER_STRING_CACHE_SUB_TYPE) \ 874f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(OBJECT_TO_CODE_SUB_TYPE) \ 875f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(OPTIMIZED_CODE_LITERALS_SUB_TYPE) \ 876f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(OPTIMIZED_CODE_MAP_SUB_TYPE) \ 877f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(PROTOTYPE_USERS_SUB_TYPE) \ 878f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(REGEXP_MULTIPLE_CACHE_SUB_TYPE) \ 879f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(RETAINED_MAPS_SUB_TYPE) \ 880f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SCOPE_INFO_SUB_TYPE) \ 881f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SCRIPT_LIST_SUB_TYPE) \ 882f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SERIALIZED_TEMPLATES_SUB_TYPE) \ 883f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SHARED_FUNCTION_INFOS_SUB_TYPE) \ 884f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SINGLE_CHARACTER_STRING_CACHE_SUB_TYPE) \ 885f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(SLOW_TEMPLATE_INSTANTIATIONS_CACHE_SUB_TYPE) \ 886f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(STRING_SPLIT_CACHE_SUB_TYPE) \ 887f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(STRING_TABLE_SUB_TYPE) \ 888f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(TEMPLATE_INFO_SUB_TYPE) \ 88962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(FEEDBACK_VECTOR_SUB_TYPE) \ 89062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(FEEDBACK_METADATA_SUB_TYPE) \ 891f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE) 892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum FixedArraySubInstanceType { 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE(name) name, 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE) 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DEFINE_FIXED_ARRAY_SUB_INSTANCE_TYPE 897f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch LAST_FIXED_ARRAY_SUB_TYPE = WEAK_NEW_SPACE_OBJECT_TO_CODE_SUB_TYPE 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 8999dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 9009dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen 901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(bmeurer): Remove this in favor of the ComparisonResult below. 902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockenum CompareResult { 903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LESS = -1, 904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block EQUAL = 0, 905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block GREATER = 1, 906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NOT_EQUAL = GREATER 908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Result of an abstract relational comparison of x and y, implemented according 912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// to ES6 section 7.2.11 Abstract Relational Comparison. 913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class ComparisonResult { 914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kLessThan, // x < y 915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kEqual, // x = y 916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGreaterThan, // x > y 917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUndefined // at least one of x or y was undefined or NaN 918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 921f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass AbstractCode; 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AccessorPair; 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSite; 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSiteCreationContext; 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSiteUsageContext; 926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Cell; 927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass ConsString; 92869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass ElementsAccessor; 92962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass FindAndReplacePattern; 93069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass FixedArrayBase; 931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FunctionLiteral; 932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSGlobalObject; 933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass KeyAccumulator; 934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LayoutDescriptor; 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass LookupIterator; 936109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass FieldType; 937c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass Module; 938f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ModuleDescriptor; 939f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ModuleInfoEntry; 940f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ModuleInfo; 941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ObjectHashTable; 942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass ObjectVisitor; 943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PropertyCell; 944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PropertyDescriptor; 945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass SafepointEntry; 946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass SharedFunctionInfo; 94769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass StringStream; 948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass TypeFeedbackInfo; 94962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass FeedbackMetadata; 95062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass FeedbackVector; 951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass WeakCell; 952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass TransitionArray; 953f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass TemplateList; 954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A template-ized version of the IsXXX functions. 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class C> inline bool Is(Object* obj); 9575913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef OBJECT_PRINT 959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_PRINTER(Name) void Name##Print(std::ostream& os); // NOLINT 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_PRINTER(Name) 9625913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck#endif 963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define OBJECT_TYPE_LIST(V) \ 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Smi) \ 966109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(LayoutDescriptor) \ 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HeapObject) \ 968109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(Primitive) \ 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Number) 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 97113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define HEAP_OBJECT_TYPE_LIST(V) \ 97213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(HeapNumber) \ 97313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(MutableHeapNumber) \ 97413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Name) \ 97513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(UniqueName) \ 97613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(String) \ 97713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SeqString) \ 97813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ExternalString) \ 97913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ConsString) \ 98013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SlicedString) \ 98113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ExternalTwoByteString) \ 98213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ExternalOneByteString) \ 98313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SeqTwoByteString) \ 98413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SeqOneByteString) \ 98513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(InternalizedString) \ 98662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(ThinString) \ 98713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Symbol) \ 98813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch \ 98913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedTypedArrayBase) \ 99013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedUint8Array) \ 99113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedInt8Array) \ 99213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedUint16Array) \ 99313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedInt16Array) \ 99413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedUint32Array) \ 99513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedInt32Array) \ 99613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedFloat32Array) \ 99713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedFloat64Array) \ 99813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedUint8ClampedArray) \ 99913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ByteArray) \ 100013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(BytecodeArray) \ 100113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FreeSpace) \ 100213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSReceiver) \ 100313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSObject) \ 100462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JSArgumentsObject) \ 100513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSContextExtensionObject) \ 100613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSGeneratorObject) \ 1007c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JSModuleNamespace) \ 100813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Map) \ 100913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DescriptorArray) \ 1010f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(FrameArray) \ 101113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(TransitionArray) \ 101262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(FeedbackMetadata) \ 101362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(FeedbackVector) \ 101413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DeoptimizationInputData) \ 101513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DeoptimizationOutputData) \ 101613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DependentCode) \ 101713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(HandlerTable) \ 101813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedArray) \ 101962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(BoilerplateDescription) \ 102013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedDoubleArray) \ 102113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(WeakFixedArray) \ 102213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ArrayList) \ 1023c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(RegExpMatchInfo) \ 102413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Context) \ 102513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ScriptContextTable) \ 102613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(NativeContext) \ 102713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ScopeInfo) \ 1028f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(ModuleInfo) \ 102913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSBoundFunction) \ 103013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSFunction) \ 103113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Code) \ 103213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(AbstractCode) \ 103313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Oddball) \ 103413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(SharedFunctionInfo) \ 103513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSValue) \ 103613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSDate) \ 103713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSMessageObject) \ 103813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(StringWrapper) \ 103913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Foreign) \ 104013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Boolean) \ 104113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSArray) \ 104213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSArrayBuffer) \ 104313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSArrayBufferView) \ 104462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JSAsyncFromSyncIterator) \ 1045f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(JSCollection) \ 104613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSTypedArray) \ 1047c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(JSArrayIterator) \ 104813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSDataView) \ 104913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSProxy) \ 105013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSError) \ 105162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JSPromiseCapability) \ 105213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSPromise) \ 1053f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(JSStringIterator) \ 105413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSSet) \ 105513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSMap) \ 105613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSSetIterator) \ 105713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSMapIterator) \ 105813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSWeakCollection) \ 105913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSWeakMap) \ 106013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSWeakSet) \ 106113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSRegExp) \ 106213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(HashTable) \ 106313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Dictionary) \ 1064f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(UnseededNumberDictionary) \ 106513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(StringTable) \ 106613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(StringSet) \ 106713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(NormalizedMapCache) \ 106813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(CompilationCacheTable) \ 106913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(CodeCacheHashTable) \ 107013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(MapCache) \ 107113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSGlobalObject) \ 107213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(JSGlobalProxy) \ 107313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Undetectable) \ 107413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(AccessCheckNeeded) \ 107513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Callable) \ 107613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Function) \ 107713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Constructor) \ 107813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(TemplateInfo) \ 107913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Filler) \ 108013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FixedArrayBase) \ 108113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(External) \ 108213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Struct) \ 108313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Cell) \ 1084f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(TemplateList) \ 108513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(PropertyCell) \ 108613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(WeakCell) \ 108713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ObjectHashTable) \ 1088f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(ObjectHashSet) \ 108913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(WeakHashTable) \ 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(OrderedHashTable) 10913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 109213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define ODDBALL_LIST(V) \ 109313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Undefined, undefined_value) \ 109413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Null, null_value) \ 109513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(TheHole, the_hole_value) \ 109613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Exception, exception) \ 109713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Uninitialized, uninitialized_value) \ 109813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(True, true_value) \ 109913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(False, false_value) \ 110013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ArgumentsMarker, arguments_marker) \ 110113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(OptimizedOut, optimized_out) \ 110213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(StaleRegister, stale_register) 1103109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The element types selection for CreateListFromArrayLike. 1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class ElementTypes { kAll, kStringAndSymbol }; 1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Object is the abstract superclass for all classes in the 1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// object hierarchy. 1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Object does not use any virtual functions to avoid the 1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// allocation of the C++ vtable. 1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Since both Smi and HeapObject are subclasses of Object no 1112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// data members can be present in Object. 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Object { 1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Type testing. 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsObject() const { return true; } 11173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 111813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DECL(Type) INLINE(bool Is##Type() const); 1119b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 1120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 112113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef IS_TYPE_FUNCTION_DECL 112262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 112313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DECL(Type, Value) \ 112413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch INLINE(bool Is##Type(Isolate* isolate) const); 1125109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ODDBALL_LIST(IS_TYPE_FUNCTION_DECL) 1126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef IS_TYPE_FUNCTION_DECL 1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 112862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch INLINE(bool IsNullOrUndefined(Isolate* isolate) const); 112962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A non-keyed store is of the form a.x = foo or a["x"] = foo whereas 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a keyed store is of the form a[expression] = foo. 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum StoreFromKeyed { 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MAY_BE_STORE_FROM_KEYED, 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CERTAINLY_NOT_STORE_FROM_KEYED 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 11363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum ShouldThrow { THROW_ON_ERROR, DONT_THROW }; 1138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define RETURN_FAILURE(isolate, should_throw, call) \ 1140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 1141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if ((should_throw) == DONT_THROW) { \ 1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Just(false); \ 1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { \ 1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate->Throw(*isolate->factory()->call); \ 1145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Nothing<bool>(); \ 1146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } \ 1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } while (false) 1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAYBE_RETURN(call, value) \ 1150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 1151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if ((call).IsNothing()) return value; \ 1152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } while (false) 1153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define MAYBE_RETURN_NULL(call) MAYBE_RETURN(call, MaybeHandle<Object>()) 1155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_STRUCT_PREDICATE(NAME, Name, name) \ 1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool Is##Name() const); 1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STRUCT_LIST(DECLARE_STRUCT_PREDICATE) 1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DECLARE_STRUCT_PREDICATE 1160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6, section 7.2.2 IsArray. NOT to be confused with %_IsArray. 1162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> IsArray(Handle<Object> object); 1163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsNameDictionary() const); 1165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch INLINE(bool IsGlobalDictionary() const); 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsSeededNumberDictionary() const); 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsOrderedHashSet() const); 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsOrderedHashMap() const); 116969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Extract the number. 1171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline double Number() const; 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsNaN() const); 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(bool IsMinusZero() const); 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ToInt32(int32_t* value); 11753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool ToUint32(uint32_t* value); 1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Representation OptimalRepresentation(); 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ElementsKind OptimalElementsKind(); 1180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool FitsRepresentation(Representation representation); 1182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Checks whether two valid primitive encodings of a property name resolve to 1184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the same logical property. E.g., the smi 1, the string "1" and the double 1185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 1 all refer to the same property, so this helper will return true. 1186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool KeyEquals(Object* other); 1187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool FilterKey(PropertyFilter filter); 1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1190109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<FieldType> OptimalType(Isolate* isolate, 1191109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Representation representation); 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static Handle<Object> NewStorageFor(Isolate* isolate, 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> object, 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation); 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static Handle<Object> WrapForRead(Isolate* isolate, 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> object, 1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation); 1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Returns true if the object is of the correct type to be used as a 12023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // implementation of a JSObject's elements. 12033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline bool HasValidElements(); 12043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasSpecificClassOf(String* name); 1206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool BooleanValue(); // ECMA-262 9.2. 1208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.2.11 Abstract Relational Comparison 1210109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static Maybe<ComparisonResult> Compare(Handle<Object> x, 1211109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> y); 1212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.2.12 Abstract Equality Comparison 1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> Equals(Handle<Object> x, Handle<Object> y); 1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.2.13 Strict Equality Comparison 1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool StrictEquals(Object* that); 1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert to a JSObject if needed. 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // native_context is used when creating wrapper object. 1221109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<JSReceiver> ToObject( 1222109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, Handle<Object> object); 1223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<JSReceiver> ToObject( 1224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object, Handle<Context> context); 1225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 12263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // ES6 section 9.2.1.2, OrdinaryCallBindThis for sloppy callee. 12273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static MaybeHandle<JSReceiver> ConvertReceiver( 12283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate, Handle<Object> object); 12293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.14 ToPropertyKey 12313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Name> ToName(Isolate* isolate, 12323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> input); 1233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.1 ToPrimitive 1235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> ToPrimitive( 1236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> input, ToPrimitiveHint hint = ToPrimitiveHint::kDefault); 1237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.3 ToNumber 123962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> ToNumber( 124062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> input); 1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.4 ToInteger 124362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> ToInteger( 124462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 1245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.5 ToInt32 124762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> ToInt32( 124862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 1249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.6 ToUint32 125162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT inline static MaybeHandle<Object> ToUint32( 125262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 1253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.12 ToString 125562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<String> ToString( 125662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 1257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<String> NoSideEffectsToString(Isolate* isolate, 1259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> input); 1260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1261bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // ES6 section 7.1.14 ToPropertyKey 126262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> ToPropertyKey( 1263bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate, Handle<Object> value); 1264bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.15 ToLength 126662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> ToLength( 126762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 1268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ES6 section 7.1.17 ToIndex 127062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> ToIndex( 1271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate, Handle<Object> input, 1272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MessageTemplate::Template error_index); 1273f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.3.9 GetMethod 1275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetMethod( 1276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> receiver, Handle<Name> name); 1277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.3.17 CreateListFromArrayLike 1279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<FixedArray> CreateListFromArrayLike( 1280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object, ElementTypes element_types); 1281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 128213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Get length property and apply ToLength. 128313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetLengthFromArrayLike( 128413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* isolate, Handle<Object> object); 1285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.5.6 The typeof Operator 1287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> TypeOf(Isolate* isolate, Handle<Object> object); 1288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.6 Multiplicative Operators 1290109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Multiply(Isolate* isolate, 1291109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1292109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1293109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Divide(Isolate* isolate, 1294109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1295109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1296109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Modulus(Isolate* isolate, 1297109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1298109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.7 Additive Operators 1301109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Add(Isolate* isolate, 1302109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1303109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1304109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> Subtract(Isolate* isolate, 1305109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1306109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.8 Bitwise Shift Operators 1309109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ShiftLeft(Isolate* isolate, 1310109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1311109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1312109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ShiftRight(Isolate* isolate, 1313109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1314109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ShiftRightLogical( 1316109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, Handle<Object> lhs, Handle<Object> rhs); 1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.9 Relational Operators 1319109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> GreaterThan(Handle<Object> x, 1320109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> y); 1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> GreaterThanOrEqual( 1322109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> x, Handle<Object> y); 1323109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> LessThan(Handle<Object> x, 1324109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> y); 1325109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> LessThanOrEqual(Handle<Object> x, 1326109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> y); 1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 12.11 Binary Bitwise Operators 1329109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> BitwiseAnd(Isolate* isolate, 1330109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1331109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1332109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> BitwiseOr(Isolate* isolate, 1333109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1334109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1335109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> BitwiseXor(Isolate* isolate, 1336109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> lhs, 1337109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> rhs); 1338109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1339bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // ES6 section 7.3.19 OrdinaryHasInstance (C, O). 1340bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> OrdinaryHasInstance( 1341bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate, Handle<Object> callable, Handle<Object> object); 1342bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1343bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // ES6 section 12.10.4 Runtime Semantics: InstanceofOperator(O, C) 1344bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> InstanceOf( 1345bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate, Handle<Object> object, Handle<Object> callable); 1346bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1347f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE MUST_USE_RESULT static MaybeHandle<Object> GetProperty( 1348f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch LookupIterator* it); 1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 [[Set]] (when passed DONT_THROW) 1351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Invariants for this and related functions (unless stated otherwise): 1352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 1) When the result is Nothing, an exception is pending. 1353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 2) When passed THROW_ON_ERROR, the result is never Just(false). 1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // In some cases, an exception is thrown regardless of the ShouldThrow 1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // argument. These cases are either in accordance with the spec or not 1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // covered by it (eg., concerning API callbacks). 1357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetProperty(LookupIterator* it, 1358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 1359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode, 1360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StoreFromKeyed store_mode); 1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> SetProperty( 1362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> object, Handle<Name> name, Handle<Object> value, 1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode, 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED); 13653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> SetPropertyOrElement( 13663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> object, Handle<Name> name, Handle<Object> value, 13673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LanguageMode language_mode, 13683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED); 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetSuperProperty( 1371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, LanguageMode language_mode, 1372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StoreFromKeyed store_mode); 1373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> CannotCreateProperty( 1375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> receiver, Handle<Object> name, 1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, ShouldThrow should_throw); 1377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> WriteToReadOnlyProperty( 1378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, ShouldThrow should_throw); 1379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> WriteToReadOnlyProperty( 1380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> receiver, Handle<Object> name, 1381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, ShouldThrow should_throw); 1382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> RedefineIncompatibleProperty( 1383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> name, Handle<Object> value, 1384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 1385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetDataProperty(LookupIterator* it, 1386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value); 1387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> AddDataProperty( 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, 1389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw, StoreFromKeyed store_mode); 1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement( 1391109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> object, Handle<Name> name); 1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetPropertyOrElement( 1393109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> receiver, Handle<Name> name, Handle<JSReceiver> holder); 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( 1395109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> object, Handle<Name> name); 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithAccessor( 1398109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch LookupIterator* it); 1399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyWithAccessor( 1400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, ShouldThrow should_throw); 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithDefinedGetter( 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> receiver, 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> getter); 1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyWithDefinedSetter( 1406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> receiver, Handle<JSReceiver> setter, Handle<Object> value, 1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 1408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetElement( 1410109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, Handle<Object> object, uint32_t index); 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> SetElement( 1413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object, uint32_t index, 1414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, LanguageMode language_mode); 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the permanent hash code associated with this object. May return 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // undefined if not yet created. 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* GetHash(); 1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 14203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns the permanent hash code associated with this object depending on 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the actual object type. May create and store a hash code if needed and none 1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // exists. 142313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Smi* GetOrCreateHash(Isolate* isolate, Handle<Object> object); 14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Checks whether this object has the same value as the given one. This 14263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // function is implemented according to ES5, section 9.12 and can be used 14273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // to implement the Harmony "egal" function. 1428c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE bool SameValue(Object* other); 14293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Checks whether this object has the same value as the given one. 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // +0 and -0 are treated equal. Everything else is the same as SameValue. 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This function is implemented according to ES6, section 7.2.4 and is used 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // by ES6 Map and Set. 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool SameValueZero(Object* other); 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 9.4.2.3 ArraySpeciesCreate (part of it) 1437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ArraySpeciesConstructor( 1438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> original_array); 1439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tries to convert an object to an array length. Returns true and sets the 1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // output parameter if it succeeds. 1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool ToArrayLength(uint32_t* index); 1443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tries to convert an object to an array index. Returns true and sets the 1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // output parameter if it succeeds. Equivalent to ToArrayLength, but does not 1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // allow kMaxUInt32. 14477f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch inline bool ToArrayIndex(uint32_t* index); 14487f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 144962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Returns true if the result of iterating over the object is the same 145062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // (including observable effects) as simply accessing the properties between 0 145162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // and length. 145262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IterationHasObservableEffects(); 145362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Object) 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 1456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Verify a pointer is a valid object pointer. 1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void VerifyPointer(Object* p); 1458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 1459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VerifyApiCallResultType(); 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Prints this object without details. 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ShortPrint(FILE* out = stdout); 1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Prints this object without details to a message accumulator. 1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void ShortPrint(StringStream* accumulator); 1467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void ShortPrint(std::ostream& os); // NOLINT 1469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Object) 1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeaderSize = 0; // Object does not take up any space. 1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef OBJECT_PRINT 1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For our gdb macros, we should perhaps change these in the future. 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Print(); 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Prints this object with details. 1480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print(std::ostream& os); // NOLINT 1481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 1482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print() { ShortPrint(); } 1483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print(std::ostream& os) { ShortPrint(os); } // NOLINT 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class LookupIterator; 1488109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch friend class StringStream; 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return the map of the root of object's prototype chain. 1491c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Map* GetPrototypeChainRootMap(Isolate* isolate); 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Helper for SetProperty and SetSuperProperty. 1494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Return value is only meaningful if [found] is set to true on return. 1495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyInternal( 1496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, LanguageMode language_mode, 1497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StoreFromKeyed store_mode, bool* found); 1498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 14993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static MaybeHandle<Name> ConvertToName(Isolate* isolate, 15003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> input); 150162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> ConvertToPropertyKey( 150262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> value); 150362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static MaybeHandle<String> ConvertToString( 150462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 150562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> ConvertToNumber( 150662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 150762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> ConvertToInteger( 150862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 150962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> ConvertToInt32( 151062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 151162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> ConvertToUint32( 151262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 151362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> ConvertToLength( 151462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input); 151562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> ConvertToIndex( 151662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<Object> input, 151762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MessageTemplate::Template error_index); 15183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Object); 1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// In objects.h to be usable without objects-inl.h inclusion. 1524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Object::IsSmi() const { return HAS_SMI_TAG(this); } 1525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Object::IsHeapObject() const { return Internals::HasHeapObjectTag(this); } 1526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct Brief { 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit Brief(const Object* const v) : value(v) {} 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Object* value; 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1533c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochV8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, const Brief& v); 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Smi represents integer Numbers that can be stored in 31 bits. 1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Smis are immediate which means they are NOT allocated in the heap. 1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The this pointer has the following format: [31 bit signed int] 0 15383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// For long smis it has the following format: 15393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// [32 bit signed int] [31 bits zero padding] 0 15403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Smi stands for small integer. 1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Smi: public Object { 1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the integer value. 1544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int value() const { return Internals::SmiValue(this); } 154562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline Smi* ToUint32Smi() { 154662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (value() <= 0) return Smi::kZero; 154762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return Smi::FromInt(static_cast<uint32_t>(value())); 154862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert a value to a Smi object. 1551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Smi* FromInt(int value) { 1552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(Smi::IsValid(value)); 1553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<Smi*>(Internals::IntToSmi(value)); 1554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Smi* FromIntptr(intptr_t value) { 1557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(Smi::IsValid(value)); 1558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int smi_shift_bits = kSmiTagSize + kSmiShiftSize; 1559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag); 1560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns whether value can be represented in a Smi. 1563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline bool IsValid(intptr_t value) { 1564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool result = Internals::IsValidSmi(value); 1565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(result, value >= kMinValue && value <= kMaxValue); 1566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return result; 1567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Smi) 1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 1572c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE void SmiPrint(std::ostream& os) const; // NOLINT 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Smi) 1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 157562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static constexpr Smi* const kZero = nullptr; 15763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMinValue = 15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (static_cast<unsigned int>(-1)) << (kSmiValueSize - 1); 15783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block static const int kMaxValue = -(kMinValue + 1); 1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Smi); 1582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Heap objects typically have a map pointer in their first word. However, 15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// during GC other data (e.g. mark bits, forwarding addresses) is sometimes 1587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// encoded in the first word. The class MapWord is an abstraction of the 1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// value in a heap object's first word. 1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass MapWord BASE_EMBEDDED { 1590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Normal state: the map word contains a map pointer. 1592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create a map word from a map pointer. 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline MapWord FromMap(const Map* map); 1595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // View this map word as a map pointer. 1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Map* ToMap(); 1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Scavenge collection: the map word of live objects in the from space 1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // contains a forwarding address (a heap object pointer in the to space). 1602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // True if this map word is a forwarding address for a scavenge 1604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // collection. Only valid during a scavenge collection (specifically, 16053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // when all map words are heap object pointers, i.e. not during a full GC). 1606bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline bool IsForwardingAddress() const; 1607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create a map word from a forwarding address. 1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline MapWord FromForwardingAddress(HeapObject* object); 1610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // View this map word as a forwarding address. 1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline HeapObject* ToForwardingAddress(); 1613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static inline MapWord FromRawValue(uintptr_t value) { 16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return MapWord(value); 16163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 161785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 16183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline uintptr_t ToRawValue() { 16193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return value_; 16203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // HeapObject calls the private constructor and directly reads the value. 1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class HeapObject; 1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit MapWord(uintptr_t value) : value_(value) {} 1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uintptr_t value_; 1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HeapObject is the superclass for all classes describing heap allocated 1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// objects. 1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass HeapObject: public Object { 1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [map]: Contains a map which contains the object's reflective 1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // information. 1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Map* map() const; 1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_map(Map* value); 16403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The no-write-barrier version. This is OK if the object is white and in 16413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // new space, or if the value is an immortal immutable object, like the maps 16423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // of primitive (non-JS) objects like strings, heap numbers etc. 16433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_map_no_write_barrier(Map* value); 1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get the map using acquire load. 1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Map* synchronized_map(); 1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline MapWord synchronized_map_word() const; 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the map using release store 1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_map(Map* value); 1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_map_no_write_barrier(Map* value); 1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_map_word(MapWord map_word); 1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // During garbage collection, the map word of a heap object does not 1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // necessarily contain a map pointer. 1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline MapWord map_word() const; 1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_map_word(MapWord map_word); 1658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 165944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The Heap the object was allocated in. Used also to access Isolate. 1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Heap* GetHeap() const; 16613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Convenience method to get current isolate. 1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Isolate* GetIsolate() const; 166444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 166513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DECL(Type) INLINE(bool Is##Type() const); 1666109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch HEAP_OBJECT_TYPE_LIST(IS_TYPE_FUNCTION_DECL) 166713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#undef IS_TYPE_FUNCTION_DECL 166813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 166913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define IS_TYPE_FUNCTION_DECL(Type, Value) \ 167013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch INLINE(bool Is##Type(Isolate* isolate) const); 1671109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ODDBALL_LIST(IS_TYPE_FUNCTION_DECL) 1672109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef IS_TYPE_FUNCTION_DECL 167313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 167462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch INLINE(bool IsNullOrUndefined(Isolate* isolate) const); 167562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1676109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define DECLARE_STRUCT_PREDICATE(NAME, Name, name) \ 1677109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch INLINE(bool Is##Name() const); 1678109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch STRUCT_LIST(DECLARE_STRUCT_PREDICATE) 1679109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#undef DECLARE_STRUCT_PREDICATE 1680109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Converts an address to a HeapObject pointer. 1682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline HeapObject* FromAddress(Address address) { 1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_TAG_ALIGNED(address); 1684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); 1685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the address of this HeapObject. 1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Address address() { 1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return reinterpret_cast<Address>(this) - kHeapObjectTag; 1690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterates over pointers contained in the object (including the Map). 1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If it's not performance critical iteration use the non-templatized 1694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // version. 1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Iterate(ObjectVisitor* v); 1696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 1698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void IterateFast(ObjectVisitor* v); 1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Iterates over all pointers contained in the object except the 1701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // first map pointer. The object type is given in the first 1702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // parameter. This function does not access the map pointer in the 1703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // object, and so is safe to call while the map pointer is modified. 1704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If it's not performance critical iteration use the non-templatized 1705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // version. 1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IterateBody(ObjectVisitor* v); 1707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void IterateBody(InstanceType type, int object_size, ObjectVisitor* v); 1708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 1710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void IterateBodyFast(ObjectVisitor* v); 1711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename ObjectVisitor> 1713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void IterateBodyFast(InstanceType type, int object_size, 1714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ObjectVisitor* v); 1715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if the object contains a tagged value at given offset. 1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // It is used for invalid slots filtering. If the offset points outside 1718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // of the object or to the map word, the result is UNDEFINED (!!!). 1719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsValidSlot(int offset); 1720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the heap object's size in bytes 1722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int Size(); 1723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Given a heap object's map pointer, returns the heap size in bytes 1725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Useful when the map pointer field is used for other purposes. 1726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // GC internal. 1727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int SizeFromMap(Map* map); 1728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the field at offset in obj, as a read/write Object* reference. 1730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Does no checking, and is safe to use during GC, while maps are invalid. 17317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Does not invoke write barrier, so should only be assigned to 1732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // during marking GC. 1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Object** RawField(HeapObject* obj, int offset); 1734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Adds the |code| object related to |name| to the code cache of this map. If 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // this map is a dictionary map that is shared, the map copied and installed 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // onto the object. 1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void UpdateMapCodeCache(Handle<HeapObject> object, 1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code); 1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(HeapObject) 1743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17444515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // Return the write barrier mode for this. Callers of this function 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // must be able to present a reference to an DisallowHeapAllocation 17464515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // object as a sign that they are not going to use this function 17474515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // from code that allocates and thus invalidates the returned write 17484515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // barrier mode. 1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline WriteBarrierMode GetWriteBarrierMode( 1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const DisallowHeapAllocation& promise); 1751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 1753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void HeapObjectShortPrint(std::ostream& os); // NOLINT 1754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef OBJECT_PRINT 1755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintHeader(std::ostream& os, const char* id); // NOLINT 1756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(HeapObject) 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(HeapObject) 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 1760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void VerifyObjectField(int offset); 17617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch inline void VerifySmiField(int offset); 176285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Verify a pointer is a valid HeapObject pointer that points to object 1764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // areas in the heap. 1765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void VerifyHeapPointer(Object* p); 1766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 1767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline AllocationAlignment RequiredAlignment(); 1769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 1771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // First field in a heap object is map. 1772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMapOffset = Object::kHeaderSize; 1773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeaderSize = kMapOffset + kPointerSize; 1774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kMapOffset == Internals::kHeapObjectMapOffset); 1776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(HeapObject); 1779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <int start_offset, int end_offset, int size> 1783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FixedBodyDescriptor; 1784756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1785756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <int start_offset> 1787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FlexibleBodyDescriptor; 1788756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1789756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The HeapNumber class describes heap allocated numbers that cannot be 1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// represented in a Smi (small integer) 1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass HeapNumber: public HeapObject { 1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [value]: number value. 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline double value() const; 1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_value(double value); 1797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 179862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline uint64_t value_as_bits() const; 179962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_value_as_bits(uint64_t bits); 180062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(HeapNumber) 1802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HeapNumberBooleanValue(); 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1806c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE void HeapNumberPrint(std::ostream& os); // NOLINT 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(HeapNumber) 1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 18096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline int get_exponent(); 18106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline int get_sign(); 18116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 1813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kValueOffset = HeapObject::kHeaderSize; 1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // IEEE doubles are two 32 bit words. The first is just mantissa, the second 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is a mixture of sign, exponent and mantissa. The offsets of two 32 bit 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // words within double numbers are endian dependent and they are set 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // accordingly. 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if defined(V8_TARGET_LITTLE_ENDIAN) 1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMantissaOffset = kValueOffset; 1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kExponentOffset = kValueOffset + 4; 1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif defined(V8_TARGET_BIG_ENDIAN) 1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMantissaOffset = kValueOffset + 4; 1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kExponentOffset = kValueOffset; 1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 1825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#error Unknown byte ordering 1826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 18278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kValueOffset + kDoubleSize; 1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kSignMask = 0x80000000u; 1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kExponentMask = 0x7ff00000u; 1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kMantissaMask = 0xfffffu; 18326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kMantissaBits = 52; 18339dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen static const int kExponentBits = 11; 1834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kExponentBias = 1023; 1835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kExponentShift = 20; 1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInfinityOrNanExponent = 1837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (kExponentMask >> kExponentShift) - kExponentBias; 1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMantissaBitsInTopWord = 20; 1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNonMantissaBitsInTopWord = 12; 1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(HeapNumber); 1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 18453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum EnsureElementsMode { 18463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DONT_ALLOW_DOUBLE_ELEMENTS, 18473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ALLOW_COPIED_DOUBLE_ELEMENTS, 18483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ALLOW_CONVERTED_DOUBLE_ELEMENTS 18493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 18503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 18523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Indicator for one component of an AccessorPair. 18533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum AccessorComponent { 18543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ACCESSOR_GETTER, 18553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ACCESSOR_SETTER 18563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 18573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 185813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochenum class GetKeysConversion { kKeepNumbers, kConvertToString }; 18593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 186013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochenum class KeyCollectionMode { 186113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kOwnOnly = static_cast<int>(v8::KeyCollectionMode::kOwnOnly), 186213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kIncludePrototypes = 186313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static_cast<int>(v8::KeyCollectionMode::kIncludePrototypes) 186413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}; 1865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1866f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochenum class AllocationSiteUpdateMode { kUpdate, kCheckOnly }; 1867f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 18683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// JSReceiver includes types on which properties can be defined, i.e., 18693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// JSObject and JSProxy. 18703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass JSReceiver: public HeapObject { 1871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 1872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [properties]: Backing storage for properties. 1873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // properties is a FixedArray in the fast case and a Dictionary in the 1874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // slow case. 1875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(properties, FixedArray) // Get and set fast properties. 1876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void initialize_properties(); 1877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasFastProperties(); 1878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Gets slow properties for non-global objects. 1879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline NameDictionary* property_dictionary(); 1880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Deletes an existing named property in a normalized object. 1882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void DeleteNormalizedProperty(Handle<JSReceiver> object, 1883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> name, int entry); 1884e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSReceiver) 18863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.1 ToPrimitive 1888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> ToPrimitive( 1889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> receiver, 1890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ToPrimitiveHint hint = ToPrimitiveHint::kDefault); 1891f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1892f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // ES6 section 7.1.1.1 OrdinaryToPrimitive 1893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> OrdinaryToPrimitive( 1894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> receiver, OrdinaryToPrimitiveHint hint); 1895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Context> GetFunctionRealm(Handle<JSReceiver> receiver); 1897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1898109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Get the first non-hidden prototype. 1899109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline MaybeHandle<Object> GetPrototype(Isolate* isolate, 1900109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<JSReceiver> receiver); 1901109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1902109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static Maybe<bool> HasInPrototypeChain( 1903109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, Handle<JSReceiver> object, Handle<Object> proto); 1904109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 190562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Reads all enumerable own properties of source and adds them to 190662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // target, using either Set or CreateDataProperty depending on the 190762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // use_set argument. This only copies values not present in the 190862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // maybe_excluded_properties list. 190962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static Maybe<bool> SetOrCopyDataProperties( 191062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<JSReceiver> target, Handle<Object> source, 191162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const ScopedVector<Handle<Object>>* excluded_properties = nullptr, 191262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool use_set = true); 191362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Implementation of [[HasProperty]], ECMA-262 5th edition, section 8.12.6. 1915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> HasProperty(LookupIterator* it); 1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Maybe<bool> HasProperty( 1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> object, Handle<Name> name); 1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Maybe<bool> HasElement( 1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> object, uint32_t index); 1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> HasOwnProperty( 1922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, Handle<Name> name); 1923bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static inline Maybe<bool> HasOwnProperty( 1924bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<JSReceiver> object, uint32_t index); 1925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 19263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( 19273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate, Handle<JSReceiver> receiver, const char* key); 19283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetProperty( 19293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSReceiver> receiver, Handle<Name> name); 19303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static inline MaybeHandle<Object> GetElement( 19313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate, Handle<JSReceiver> receiver, uint32_t index); 19323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Implementation of ES6 [[Delete]] 1934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeletePropertyOrElement( 1935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, Handle<Name> name, 1936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode = SLOPPY); 1937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeleteProperty( 1938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, Handle<Name> name, 1939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode = SLOPPY); 1940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeleteProperty(LookupIterator* it, 1941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode); 1942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeleteElement( 1943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, uint32_t index, 1944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode = SLOPPY); 1945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Object* DefineProperty(Isolate* isolate, 1947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> object, 1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> name, 1949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> attributes); 1950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> DefineProperties( 1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<Object> object, Handle<Object> properties); 1952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // "virtual" dispatcher to the correct [[DefineOwnProperty]] implementation. 1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnProperty( 1955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSReceiver> object, Handle<Object> key, 1956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 1957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 7.3.4 (when passed DONT_THROW) 1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> CreateDataProperty( 1960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, ShouldThrow should_throw); 1961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.1.6.1 1963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> OrdinaryDefineOwnProperty( 1964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSObject> object, Handle<Object> key, 1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 1966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> OrdinaryDefineOwnProperty( 1967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, PropertyDescriptor* desc, ShouldThrow should_throw); 1968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.1.6.2 1969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> IsCompatiblePropertyDescriptor( 1970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, bool extensible, PropertyDescriptor* desc, 1971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* current, Handle<Name> property_name, 1972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 1973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.1.6.3 1974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // |it| can be NULL in cases where the ES spec passes |undefined| as the 1975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // receiver. Exactly one of |it| and |property_name| must be provided. 1976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> ValidateAndApplyPropertyDescriptor( 1977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, LookupIterator* it, bool extensible, 1978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, PropertyDescriptor* current, 1979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw, Handle<Name> property_name = Handle<Name>()); 1980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1981f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE MUST_USE_RESULT static Maybe<bool> GetOwnPropertyDescriptor( 1982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSReceiver> object, Handle<Object> key, 1983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc); 1984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> GetOwnPropertyDescriptor( 1985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, PropertyDescriptor* desc); 1986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef PropertyAttributes IntegrityLevel; 1988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 7.3.14 (when passed DONT_THROW) 1990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 'level' must be SEALED or FROZEN. 1991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetIntegrityLevel( 1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, IntegrityLevel lvl, ShouldThrow should_throw); 1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 7.3.15 1995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 'level' must be SEALED or FROZEN. 1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> TestIntegrityLevel( 1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, IntegrityLevel lvl); 1998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 [[PreventExtensions]] (when passed DONT_THROW) 2000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> PreventExtensions( 2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> object, ShouldThrow should_throw); 2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> IsExtensible(Handle<JSReceiver> object); 20043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 20053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Returns the class name ([[Class]] property in the specification). 20063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch String* class_name(); 20073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 20083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Returns the constructor name (the name (possibly, inferred name) of the 20093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // function that was used to instantiate the object). 2010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> GetConstructorName(Handle<JSReceiver> receiver); 2011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 201262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Context> GetCreationContext(); 20133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> GetPropertyAttributes( 2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> object, Handle<Name> name); 2016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> 2017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetOwnPropertyAttributes(Handle<JSReceiver> object, Handle<Name> name); 2018bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> 2019bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch GetOwnPropertyAttributes(Handle<JSReceiver> object, uint32_t index); 20203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> GetElementAttributes( 2022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> object, uint32_t index); 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Maybe<PropertyAttributes> 2024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetOwnElementAttributes(Handle<JSReceiver> object, uint32_t index); 2025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes( 2027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it); 2028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Set the object's prototype (only JSReceiver and null are allowed values). 2030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPrototype(Handle<JSReceiver> object, 2031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 2032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool from_javascript, 2033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 2034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 20353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline static Handle<Object> GetDataProperty(Handle<JSReceiver> object, 20363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Name> name); 2037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> GetDataProperty(LookupIterator* it); 2038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 20393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 20403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Retrieves a permanent object identity hash code. The undefined value might 2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // be returned in case no hash was created yet. 204213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static inline Object* GetIdentityHash(Isolate* isolate, 204313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSReceiver> object); 20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Retrieves a permanent object identity hash code. May create and store a 2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // hash code if needed and none exists. 204713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline static Smi* GetOrCreateIdentityHash(Isolate* isolate, 204813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSReceiver> object); 20493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 [[OwnPropertyKeys]] (modulo return type) 205113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch MUST_USE_RESULT static inline MaybeHandle<FixedArray> OwnPropertyKeys( 205213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSReceiver> object); 2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2054109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<FixedArray> GetOwnValues( 2055109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<JSReceiver> object, PropertyFilter filter); 2056109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2057109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static MaybeHandle<FixedArray> GetOwnEntries( 2058109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<JSReceiver> object, PropertyFilter filter); 2059109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPropertiesOffset = HeapObject::kHeaderSize; 2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHeaderSize = HeapObject::kHeaderSize + kPointerSize; 20633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2064f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool HasProxyInPrototype(Isolate* isolate); 2065f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 20673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver); 20683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 20693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 20713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// The JSObject describes real heap allocated JavaScript objects with 20723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// properties. 20733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Note that the map of JSObject changes during execution to enable inline 20743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// caching. 20753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass JSObject: public JSReceiver { 20763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 2077014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<JSObject> New( 2078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> constructor, Handle<JSReceiver> new_target, 2079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<AllocationSite> site = Handle<AllocationSite>::null()); 2080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Gets global object properties. 2082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline GlobalDictionary* global_dictionary(); 2083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Context> GetFunctionRealm(Handle<JSObject> object); 2085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [elements]: The elements (properties with names that are integers). 2087756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // 2088756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // Elements can be in two general modes: fast and slow. Each mode 2089f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // corresponds to a set of object representations of elements that 2090756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // have something in common. 2091756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // 2092756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // In the fast mode elements is a FixedArray and so each element can 2093756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // be quickly accessed. This fact is used in the generated code. The 20943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // elements array can have one of three maps in this mode: 2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // fixed_array_map, sloppy_arguments_elements_map or 20963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // fixed_cow_array_map (for copy-on-write arrays). In the latter case 20973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // the elements array may be shared by a few objects and so before 20983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // writing to any element the array must be copied. Use 20993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // EnsureWritableFastElements in this case. 2100756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // 2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // In the slow mode the elements is either a NumberDictionary, a 2102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // FixedArray parameter map for a (sloppy) arguments object. 210369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DECL_ACCESSORS(elements, FixedArrayBase) 2104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void initialize_elements(); 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ResetElements(Handle<JSObject> object); 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void SetMapAndElements(Handle<JSObject> object, 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map, 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArrayBase> elements); 2109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline ElementsKind GetElementsKind(); 2110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ElementsAccessor* GetElementsAccessor(); 2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_SMI_ELEMENTS ElementsKind. 2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFastSmiElements(); 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_ELEMENTS ElementsKind. 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFastObjectElements(); 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_ELEMENTS or 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FAST_SMI_ONLY_ELEMENTS. 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFastSmiOrObjectElements(); 2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has any of the fast elements kinds. 2119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasFastElements(); 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_DOUBLE_ELEMENTS 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ElementsKind. 21223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline bool HasFastDoubleElements(); 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if an object has elements of FAST_HOLEY_*_ELEMENTS 2124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ElementsKind. 2125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFastHoleyElements(); 2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasSloppyArgumentsElements(); 2127109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool HasStringWrapperElements(); 2128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasDictionaryElements(); 2129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedTypedArrayElements(); 2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedUint8ClampedElements(); 2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedArrayElements(); 2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedInt8Elements(); 2135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedUint8Elements(); 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedInt16Elements(); 2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedUint16Elements(); 2138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedInt32Elements(); 2139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedUint32Elements(); 2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedFloat32Elements(); 2141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasFixedFloat64Elements(); 2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasFastArgumentsElements(); 2144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasSlowArgumentsElements(); 2145109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool HasFastStringWrapperElements(); 2146109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool HasSlowStringWrapperElements(); 21473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool HasEnumerableElements(); 21483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 2149c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch inline SeededNumberDictionary* element_dictionary(); // Gets slow elements. 2150c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 21513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Requires: HasFastElements(). 21523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static void EnsureWritableFastElements(Handle<JSObject> object); 2153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Collects elements starting at index 0. 2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Undefined values are placed after non-undefined values. 2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the number of non-undefined values. 2157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Object> PrepareElementsForSort(Handle<JSObject> object, 2158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t limit); 2159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // As PrepareElementsForSort, but only on objects where elements is 2160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a dictionary, and it will stay a dictionary. Collates undefined and 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // unexisting elements below limit from position zero of the elements. 2162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Object> PrepareSlowElementsForSort(Handle<JSObject> object, 2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t limit); 2164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyWithInterceptor( 2166109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch LookupIterator* it, ShouldThrow should_throw, Handle<Object> value); 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2168109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // The API currently still wants DefineOwnPropertyIgnoreAttributes to convert 2169109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // AccessorInfo objects to data fields. We allow FORCE_FIELD as an exception 2170109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // to the default behavior that calls the setter. 2171109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch enum AccessorInfoHandling { FORCE_FIELD, DONT_FORCE_FIELD }; 2172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> DefineOwnPropertyIgnoreAttributes( 2174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, 2175109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch AccessorInfoHandling handling = DONT_FORCE_FIELD); 2176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnPropertyIgnoreAttributes( 2178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, PropertyAttributes attributes, 2179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw, 2180109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch AccessorInfoHandling handling = DONT_FORCE_FIELD); 21813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> SetOwnPropertyIgnoreAttributes( 2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, Handle<Name> name, Handle<Object> value, 2184109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PropertyAttributes attributes); 21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> SetOwnElementIgnoreAttributes( 2187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, uint32_t index, Handle<Object> value, 2188109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PropertyAttributes attributes); 2189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Equivalent to one of the above depending on whether |name| can be converted 2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to an array index. 2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> 2193109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DefinePropertyOrElementIgnoreAttributes(Handle<JSObject> object, 2194109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Name> name, 2195109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Object> value, 2196109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PropertyAttributes attributes = NONE); 2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Adds or reconfigures a property to attributes NONE. It will fail when it 2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // cannot. 22003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MUST_USE_RESULT static Maybe<bool> CreateDataProperty( 22013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LookupIterator* it, Handle<Object> value, 22023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ShouldThrow should_throw = DONT_THROW); 2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void AddProperty(Handle<JSObject> object, Handle<Name> name, 2205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value, PropertyAttributes attributes); 2206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> AddDataElement( 2208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> receiver, uint32_t index, Handle<Object> value, 2209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes, ShouldThrow should_throw); 2210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> AddDataElement( 2211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> receiver, uint32_t index, Handle<Object> value, 2212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Extend the receiver with a single fast property appeared first in the 2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // passed map. This also extends the property backing store if necessary. 2216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void AllocateStorageForMap(Handle<JSObject> object, Handle<Map> map); 2217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Migrates the given object to a map whose field representations are the 2219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // lowest upper bound of all known representations for that field. 2220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MigrateInstance(Handle<JSObject> instance); 2221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Migrates the given object only if the target map is already available, 2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // or returns false if such a map is not yet available. 2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool TryMigrateInstance(Handle<JSObject> instance); 2225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Sets the property value in a normalized object given (key, value, details). 2227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Handles the special representation of JS global objects. 2228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetNormalizedProperty(Handle<JSObject> object, Handle<Name> name, 2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value, 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyDetails details); 2231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetDictionaryElement(Handle<JSObject> object, uint32_t index, 2232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 2233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 2234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetDictionaryArgumentsElement(Handle<JSObject> object, 2235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t index, 2236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 2237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 2238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void OptimizeAsPrototype(Handle<JSObject> object, 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrototypeOptimizationMode mode); 2241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ReoptimizeIfPrototype(Handle<JSObject> object); 224213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static void MakePrototypesFast(Handle<Object> receiver, 224313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch WhereToStart where_to_start, Isolate* isolate); 2244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void LazyRegisterPrototypeUser(Handle<Map> user, Isolate* isolate); 2245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void UpdatePrototypeUserRegistration(Handle<Map> old_map, 2246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> new_map, 2247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate); 2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool UnregisterPrototypeUser(Handle<Map> user, Isolate* isolate); 2249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InvalidatePrototypeChains(Map* map); 2250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2251c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Updates prototype chain tracking information when an object changes its 2252c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // map from |old_map| to |new_map|. 2253c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static void NotifyMapChange(Handle<Map> old_map, Handle<Map> new_map, 2254c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Isolate* isolate); 2255c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Utility used by many Array builtins and runtime functions 2257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline bool PrototypeHasNoElements(Isolate* isolate, JSObject* object); 2258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Alternative implementation of WeakFixedArray::NullCallback. 2260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class PrototypeRegistryCompactionCallback { 2261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 2262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Callback(Object* value, int old_index, int new_index); 2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 2264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Retrieve interceptors. 22663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline InterceptorInfo* GetNamedInterceptor(); 2267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline InterceptorInfo* GetIndexedInterceptor(); 2268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 22693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Used from JSReceiver. 2270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<PropertyAttributes> 2271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetPropertyAttributesWithInterceptor(LookupIterator* it); 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<PropertyAttributes> 2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GetPropertyAttributesWithFailedAccessCheck(LookupIterator* it); 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Defines an AccessorPair property on the given object. 2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(mstarzinger): Rename to SetAccessor(). 2277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static MaybeHandle<Object> DefineAccessor(Handle<JSObject> object, 2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> getter, 2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> setter, 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttributes attributes); 2282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Object> DefineAccessor(LookupIterator* it, 2283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> getter, 2284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> setter, 2285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Defines an AccessorInfo property on the given object. 2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> SetAccessor( 2289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AccessorInfo> info); 2291f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The result must be checked first for exceptions. If there's no exception, 2293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the output parameter |done| indicates whether the interceptor has a result 2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or not. 2295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithInterceptor( 2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, bool* done); 2297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void ValidateElements(Handle<JSObject> object); 22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Makes sure that this object can contain HeapObject as elements. 2301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void EnsureCanContainHeapObjectElements(Handle<JSObject> obj); 23023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Makes sure that this object can contain the specified elements. 2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void EnsureCanContainElements( 2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object** elements, 23073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t count, 23083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EnsureElementsMode mode); 2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void EnsureCanContainElements( 2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArrayBase> elements, 2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t length, 23133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EnsureElementsMode mode); 2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void EnsureCanContainElements( 2315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 23163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Arguments* arguments, 23173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t first_arg, 23183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t arg_count, 23193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EnsureElementsMode mode); 2320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Would we convert a fast elements array to dictionary mode given 2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // an access at key? 2323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool WouldConvertToSlowElements(uint32_t index); 2324402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu 2325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // Computes the new capacity when expanding the elements of a JSObject. 2326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static uint32_t NewElementsCapacity(uint32_t old_capacity) { 2327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // (old_capacity + 50%) + 16 2328e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return old_capacity + (old_capacity >> 1) + 16; 2329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2330e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // These methods do not perform access checks! 2332f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch template <AllocationSiteUpdateMode update_or_check = 2333f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AllocationSiteUpdateMode::kUpdate> 2334f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static bool UpdateAllocationSite(Handle<JSObject> object, 2335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ElementsKind to_kind); 2336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Lookup interceptors are used for handling properties controlled by host 2338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // objects. 2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasNamedInterceptor(); 2340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool HasIndexedInterceptor(); 2341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Support functions for v8 api (needed for correct interceptor behavior). 2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<bool> HasRealNamedProperty( 2344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, Handle<Name> name); 2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<bool> HasRealElementProperty( 2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, uint32_t index); 2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Maybe<bool> HasRealNamedCallbackProperty( 2348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, Handle<Name> name); 2349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the header size for a JSObject. Used to compute the index of 2351a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // internal fields as well as the number of internal fields. 2352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int GetHeaderSize(InstanceType instance_type); 2353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int GetHeaderSize(); 2354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int GetInternalFieldCount(Map* map); 2356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int GetInternalFieldCount(); 235744f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline int GetInternalFieldOffset(int index); 2358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* GetInternalField(int index); 2359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SetInternalField(int index, Object* value); 23603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void SetInternalField(int index, Smi* value); 2361bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool WasConstructedFromApiFunction(); 23623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 23633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns a new map with all transitions dropped from the object's current 23643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // map and the ElementsKind set. 23653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static Handle<Map> GetElementsTransitionMap(Handle<JSObject> object, 23663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind to_kind); 2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void TransitionElementsKind(Handle<JSObject> object, 2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind); 2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Always use this to migrate an object to a new map. 2371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // |expected_additional_properties| is only used for fast-to-slow transitions 2372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and ignored otherwise. 2373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void MigrateToMap(Handle<JSObject> object, Handle<Map> new_map, 2374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int expected_additional_properties = 0); 2375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Forces a prototype without any of the checks that the regular SetPrototype 2377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // would do. 2378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void ForceSetPrototype(Handle<JSObject> object, Handle<Object> proto); 2379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert the object to use the canonical dictionary 2381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // representation. If the object is expected to have additional properties 2382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // added this number can be indicated to have the backing store allocated to 2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // an initial capacity for holding these properties. 23843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static void NormalizeProperties(Handle<JSObject> object, 23853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PropertyNormalizationMode mode, 2386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int expected_additional_properties, 2387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* reason); 23883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Convert and update the elements backing store to be a 23903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // SeededNumberDictionary dictionary. Returns the backing after conversion. 23913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static Handle<SeededNumberDictionary> NormalizeElements( 23923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSObject> object); 23933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RequireSlowElements(SeededNumberDictionary* dictionary); 2395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Transform slow named properties to fast variants. 2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MigrateSlowToFast(Handle<JSObject> object, 2398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int unused_property_fields, const char* reason); 2399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool IsUnboxedDoubleField(FieldIndex index); 2401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Access fast-case object properties at index. 2403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Object> FastPropertyAt(Handle<JSObject> object, 2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation, 2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FieldIndex index); 2406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* RawFastPropertyAt(FieldIndex index); 2407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline double RawFastDoublePropertyAt(FieldIndex index); 240862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline uint64_t RawFastDoublePropertyAsBitsAt(FieldIndex index); 2409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void FastPropertyAtPut(FieldIndex index, Object* value); 2411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void RawFastPropertyAtPut(FieldIndex index, Object* value); 241262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void RawFastDoublePropertyAsBitsAtPut(FieldIndex index, uint64_t bits); 2413109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline void WriteToField(int descriptor, PropertyDetails details, 2414109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Object* value); 2415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Access to in object properties. 241744f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline int GetInObjectPropertyOffset(int index); 2418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* InObjectPropertyAt(int index); 2419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* InObjectPropertyAtPut(int index, 2420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value, 2421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode 2422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block = UPDATE_WRITE_BARRIER); 2423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set the object's prototype (only JSReceiver and null are allowed values). 2425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPrototype(Handle<JSObject> object, 2426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 2427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool from_javascript, 2428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2430f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Makes the object prototype immutable 2431f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Never called from JavaScript 2432f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void SetImmutableProto(Handle<JSObject> object); 2433f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Initializes the body starting at |start_offset|. It is responsibility of 2435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the caller to initialize object header. Fill the pre-allocated fields with 24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // pre_allocated_value and the rest with filler_value. 24373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Note: this call does not update write barrier, the caller is responsible 24383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // to ensure that |filler_value| can be collected without WB here. 2439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void InitializeBody(Map* map, int start_offset, 2440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* pre_allocated_value, Object* filler_value); 2441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check whether this object references another object 2443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool ReferencesObject(Object* obj); 2444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> PreventExtensions( 2446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, ShouldThrow should_throw); 2447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsExtensible(Handle<JSObject> object); 24498defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy object. 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum DeepCopyHints { kNoHints = 0, kObjectIsShallow = 1 }; 2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<JSObject> DeepCopy( 2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 2455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSiteUsageContext* site_context, 2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeepCopyHints hints = kNoHints); 2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<JSObject> DeepWalk( 2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 2459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSiteCreationContext* site_context); 2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSObject) 24628defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 2464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void JSObjectShortPrint(StringStream* accumulator); 2465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSObject) 2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSObject) 2467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef OBJECT_PRINT 246862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool PrintProperties(std::ostream& os); // NOLINT 246962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool PrintElements(std::ostream& os); // NOLINT 2470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 2471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if defined(DEBUG) || defined(OBJECT_PRINT) 2472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintTransitions(std::ostream& os); // NOLINT 2473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void PrintElementsTransition( 2476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file, Handle<JSObject> object, 2477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind from_kind, Handle<FixedArrayBase> from_elements, 2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind, Handle<FixedArrayBase> to_elements); 2479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void PrintInstanceMigration(FILE* file, Map* original_map, Map* new_map); 24813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 2483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Structure for collecting spill information about JSObjects. 2484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block class SpillInformation { 2485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Clear(); 2487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void Print(); 2488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_objects_; 2489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_objects_with_fast_properties_; 2490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_objects_with_fast_elements_; 2491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_fast_used_fields_; 2492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_fast_unused_fields_; 2493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_slow_used_properties_; 2494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_slow_unused_properties_; 2495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_fast_used_elements_; 2496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_fast_unused_elements_; 2497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_slow_used_elements_; 2498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int number_of_slow_unused_elements_; 2499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 2500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void IncrementSpillStatistics(SpillInformation* info); 2502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If a GC was caused while constructing this object, the elements pointer 2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // may point to a one pointer filler map. The object won't be rooted, but 2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // our heap verification code could stumble across it. 2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ElementsAreSafeToExamine(); 2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 25108defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* SlowReverseLookup(Object* value); 2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximal number of elements (numbered 0 .. kMaxElementCount - 1). 2514e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Also maximal value of JSArray's length property. 2515e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const uint32_t kMaxElementCount = 0xffffffffu; 2516e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 251769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Constants for heuristics controlling conversion of fast elements 251869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // to slow elements. 251969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 252069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Maximal gap that can be introduced by adding an element beyond 252169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // the current elements length. 2522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kMaxGap = 1024; 252369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 252469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Maximal length of fast elements array that won't be checked for 252569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // being dense enough on expansion. 252669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kMaxUncheckedFastElementsLength = 5000; 252769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 252869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Same as above but for old arrays. This limit is more strict. We 252969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // don't want to be wasteful with long lived objects. 253069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kMaxUncheckedOldFastElementsLength = 500; 253169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This constant applies only to the initial map of "global.Object" and 2533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // not to arbitrary other JSObject maps. 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInitialGlobalObjectUnusedPropertiesCount = 4; 2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxInstanceSize = 255 * kPointerSize; 2537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // When extending the backing storage for property values, we increase 2538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // its size by more than the 1 entry necessary, so sequentially adding fields 2539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to the same object requires fewer allocations and copies. 2540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kFieldsAdded = 3; 2541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 2543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kElementsOffset = JSReceiver::kHeaderSize; 2544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeaderSize = kElementsOffset + kPointerSize; 2545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kHeaderSize == Internals::kJSObjectHeaderSize); 2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef FlexibleBodyDescriptor<JSReceiver::kPropertiesOffset> BodyDescriptor; 2549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Gets the number of currently used elements. 2551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int GetFastElementsUsage(); 2552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool AllCanRead(LookupIterator* it); 2554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool AllCanWrite(LookupIterator* it); 2555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class JSReceiver; 2558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Object; 255969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Used from Object::GetProperty(). 2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetPropertyWithFailedAccessCheck( 2562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LookupIterator* it); 2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPropertyWithFailedAccessCheck( 2565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it, Handle<Object> value, ShouldThrow should_throw); 2566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeletePropertyWithInterceptor( 2568109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch LookupIterator* it, ShouldThrow should_throw); 25693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 25703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool ReferencesObjectFromElements(FixedArray* elements, 25713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ElementsKind kind, 25723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Object* object); 2573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 257413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Object* GetIdentityHash(Isolate* isolate, Handle<JSObject> object); 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 257613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Smi* GetOrCreateIdentityHash(Isolate* isolate, 257713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSObject> object); 25783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Helper for fast versions of preventExtensions, seal, and freeze. 2580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // attrs is one of NONE, SEALED, or FROZEN (depending on the operation). 2581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier template <PropertyAttributes attrs> 2582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> PreventExtensionsWithTransition( 2583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> object, ShouldThrow should_throw); 2584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSObject); 2586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2589109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSAccessorPropertyDescriptor is just a JSObject with a specific initial 2590109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// map. This initial map adds in-object properties for "get", "set", 2591109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// "enumerable" and "configurable" properties, as assigned by the 2592109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// FromPropertyDescriptor function for regular accessor properties. 2593109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSAccessorPropertyDescriptor: public JSObject { 2594109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2595109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2596109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kGetOffset = JSObject::kHeaderSize; 2597109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSetOffset = kGetOffset + kPointerSize; 2598109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kEnumerableOffset = kSetOffset + kPointerSize; 2599109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConfigurableOffset = kEnumerableOffset + kPointerSize; 2600109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kConfigurableOffset + kPointerSize; 2601109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2602109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kGetIndex = 0; 2603109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSetIndex = 1; 2604109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kEnumerableIndex = 2; 2605109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConfigurableIndex = 3; 2606109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2607109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2608109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSAccessorPropertyDescriptor); 2609109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2610109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2611109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2612109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSDataPropertyDescriptor is just a JSObject with a specific initial map. 2613109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This initial map adds in-object properties for "value", "writable", 2614109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// "enumerable" and "configurable" properties, as assigned by the 2615109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// FromPropertyDescriptor function for regular data properties. 2616109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSDataPropertyDescriptor: public JSObject { 2617109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2618109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2619109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kValueOffset = JSObject::kHeaderSize; 2620109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kWritableOffset = kValueOffset + kPointerSize; 2621109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kEnumerableOffset = kWritableOffset + kPointerSize; 2622109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConfigurableOffset = kEnumerableOffset + kPointerSize; 2623109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kConfigurableOffset + kPointerSize; 2624109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2625109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kValueIndex = 0; 2626109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kWritableIndex = 1; 2627109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kEnumerableIndex = 2; 2628109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConfigurableIndex = 3; 2629109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2630109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2631109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSDataPropertyDescriptor); 2632109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2633109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2634109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2635109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSIteratorResult is just a JSObject with a specific initial map. 2636109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This initial map adds in-object properties for "done" and "value", 2637109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// as specified by ES6 section 25.1.1.3 The IteratorResult Interface 2638109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSIteratorResult: public JSObject { 2639109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2640f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(value, Object) 2641f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2642f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(done, Object) 2643f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2644109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2645109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kValueOffset = JSObject::kHeaderSize; 2646109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kDoneOffset = kValueOffset + kPointerSize; 2647109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kDoneOffset + kPointerSize; 2648109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2649109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kValueIndex = 0; 2650109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kDoneIndex = 1; 2651109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2652109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2653109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSIteratorResult); 2654109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2655109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2656109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2657109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Common superclass for JSSloppyArgumentsObject and JSStrictArgumentsObject. 2658109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSArgumentsObject: public JSObject { 2659109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2660109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2661109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kLengthOffset = JSObject::kHeaderSize; 2662109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kHeaderSize = kLengthOffset + kPointerSize; 2663109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2664109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kLengthIndex = 0; 2665109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2666109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2667109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSArgumentsObject); 2668109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2669109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2670109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2671109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSSloppyArgumentsObject is just a JSObject with specific initial map. 2672109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This initial map adds in-object properties for "length" and "callee". 2673109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSSloppyArgumentsObject: public JSArgumentsObject { 2674109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2675109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2676109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kCalleeOffset = JSArgumentsObject::kHeaderSize; 2677109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kCalleeOffset + kPointerSize; 2678109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Indices of in-object properties. 2679109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kCalleeIndex = 1; 2680109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2681109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2682109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSSloppyArgumentsObject); 2683109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2684109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2685109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2686109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// JSStrictArgumentsObject is just a JSObject with specific initial map. 2687109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This initial map adds an in-object property for "length". 2688109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass JSStrictArgumentsObject: public JSArgumentsObject { 2689109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 2690109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Offsets of object fields. 2691109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = JSArgumentsObject::kHeaderSize; 2692109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2693109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 2694109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSStrictArgumentsObject); 2695109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 2696109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2697109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 26983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Common superclass for FixedArrays that allow implementations to share 26993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// common accessors and some code paths. 27003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass FixedArrayBase: public HeapObject { 2701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 2702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [length]: length of the array. 2703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int length() const; 2704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_length(int value); 2705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get and set the length using acquire loads and release stores. 2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int synchronized_length() const; 2708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_length(int value); 2709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedArrayBase) 27113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int GetMaxLengthForNewSpaceAllocation(ElementsKind kind); 2713f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 27143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Layout description. 27153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Length is smi tagged when it is stored. 27163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int kLengthOffset = HeapObject::kHeaderSize; 27173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int kHeaderSize = kLengthOffset + kPointerSize; 27183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 27193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 27203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 272169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass FixedDoubleArray; 2722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass IncrementalMarking; 2723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 272469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 27253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// FixedArray describes fixed-sized arrays with element type Object*. 27263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass FixedArray: public FixedArrayBase { 27273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 2728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setter and getter for elements. 2729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Object* get(int index) const; 2730109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline Handle<Object> get(FixedArray* array, int index, 2731109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate); 2732f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <class T> 2733f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MaybeHandle<T> GetValue(Isolate* isolate, int index) const; 2734f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2735f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <class T> 2736f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<T> GetValueChecked(Isolate* isolate, int index) const; 2737f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2738f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Return a grown copy if the index is bigger than the array's length. 2739f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<FixedArray> SetAndGrow(Handle<FixedArray> array, int index, 2740f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> value); 2741f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setter that uses write barrier. 2743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, Object* value); 2744c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool is_the_hole(Isolate* isolate, int index); 2745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Setter that doesn't need write barrier. 2747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, Smi* value); 2748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setter with explicit barrier mode. 2749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, Object* value, WriteBarrierMode mode); 2750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setters for frequently used oddballs located in old space. 2752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_undefined(int index); 275362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_undefined(Isolate* isolate, int index); 2754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_null(int index); 275562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_null(Isolate* isolate, int index); 2756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_the_hole(int index); 275762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_the_hole(Isolate* isolate, int index); 2758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetFirstElementAddress(); 2760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool ContainsOnlySmisOrHoles(); 2761756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 27626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Gives access to raw memory which stores the array's data. 27636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline Object** data_start(); 27646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void FillWithHoles(int from, int to); 2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shrink length and insert filler objects. 2768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Shrink(int length); 27693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Copy a sub array from the receiver to dest. 2771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void CopyTo(int pos, FixedArray* dest, int dest_pos, int len); 2772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. 277462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static constexpr int SizeFor(int length) { 277562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return kHeaderSize + length * kPointerSize; 277662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 2777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code Generation support. 277962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static constexpr int OffsetOfElementAt(int index) { return SizeFor(index); } 2780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Garbage collection support. 2782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object** RawFieldOfElementAt(int index); 2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedArray) 2785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2786e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Maximal allowed size, in bytes, of a single FixedArray. 2787e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Prevents overflowing size computations, as well as extreme memory 2788e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // consumption. 2789692be65d6b06edd9ff4cfc4c308555b7c99c1191Ben Murdoch static const int kMaxSize = 128 * MB * kPointerSize; 2790e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Maximally allowed length of a FixedArray. 2791e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kMaxLength = (kMaxSize - kHeaderSize) / kPointerSize; 2792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 2794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(FixedArray) 2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(FixedArray) 2796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 2797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Checks if two FixedArrays have identical contents. 2798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool IsEqualTo(FixedArray* other); 2799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef FlexibleBodyDescriptor<kHeaderSize> BodyDescriptor; 2802756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 28044515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // Set operation on FixedArray without using write barriers. Can 28054515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // only be used for storing old space objects or smis. 28063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static inline void NoWriteBarrierSet(FixedArray* array, 28073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index, 28083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* value); 28093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kHeaderSize == Internals::kFixedArrayHeaderSize); 2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(FixedArray); 2814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 2815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// FixedDoubleArray describes fixed-sized arrays with element type double. 28173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass FixedDoubleArray: public FixedArrayBase { 28183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 28193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Setter and getter for elements. 282069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline double get_scalar(int index); 2821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint64_t get_representation(int index); 2822109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline Handle<Object> get(FixedDoubleArray* array, int index, 2823109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate); 28243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline void set(int index, double value); 282562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_the_hole(Isolate* isolate, int index); 28263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline void set_the_hole(int index); 28273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Checking for the hole. 2829c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool is_the_hole(Isolate* isolate, int index); 28303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline bool is_the_hole(int index); 28313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Garbage collection support. 28333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch inline static int SizeFor(int length) { 28343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return kHeaderSize + length * kDoubleSize; 28353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 28363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Gives access to raw memory which stores the array's data. 2838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline double* data_start(); 2839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void FillWithHoles(int from, int to); 2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 28423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Code Generation support. 28433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static int OffsetOfElementAt(int index) { return SizeFor(index); } 28443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedDoubleArray) 28463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Maximal allowed size, in bytes, of a single FixedDoubleArray. 28483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Prevents overflowing size computations, as well as extreme memory 28493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // consumption. 28503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int kMaxSize = 512 * MB; 28513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Maximally allowed length of a FixedArray. 28523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize; 28533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Dispatched behavior. 2855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(FixedDoubleArray) 2856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(FixedDoubleArray) 28573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 28593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray); 28603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 28613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass WeakFixedArray : public FixedArray { 2864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // If |maybe_array| is not a WeakFixedArray, a fresh one will be allocated. 2866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This function does not check if the value exists already, callers must 2867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ensure this themselves if necessary. 2868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<WeakFixedArray> Add(Handle<Object> maybe_array, 2869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapObject> value, 2870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int* assigned_index = NULL); 2871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if an entry was found and removed. 2873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Remove(Handle<HeapObject> value); 2874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class NullCallback { 2876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 2877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Callback(Object* value, int old_index, int new_index) {} 2878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 2879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class CompactionCallback> 2881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Compact(); 2882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Object* Get(int index) const; 2884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Clear(int index); 2885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline int Length() const; 2886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsEmptySlot(int index) const; 2888c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Object* Empty() { return Smi::kZero; } 2889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class Iterator { 2891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 2892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit Iterator(Object* maybe_array) : list_(NULL) { Reset(maybe_array); } 2893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Reset(Object* maybe_array); 2894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <class T> 2896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline T* Next(); 2897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 2899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int index_; 2900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakFixedArray* list_; 2901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef DEBUG 2902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int last_used_index_; 2903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DisallowHeapAllocation no_gc_; 2904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // DEBUG 2905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_COPY_AND_ASSIGN(Iterator); 2906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 2907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CAST(WeakFixedArray) 2909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 2911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLastUsedIndexIndex = 0; 2912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kFirstIndex = 1; 2913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<WeakFixedArray> Allocate( 2915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate, int size, Handle<WeakFixedArray> initialize_from); 2916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void Set(Handle<WeakFixedArray> array, int index, 2918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<HeapObject> value); 2919958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void clear(int index); 2920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline int last_used_index() const; 2922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_last_used_index(int index); 2923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Disallow inherited setters. 2925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set(int index, Smi* value); 2926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set(int index, Object* value); 2927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set(int index, Object* value, WriteBarrierMode mode); 2928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DISALLOW_IMPLICIT_CONSTRUCTORS(WeakFixedArray); 2929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Generic array grows dynamically with O(1) amortized insertion. 2932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass ArrayList : public FixedArray { 2933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum AddMode { 2935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone, 2936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Use this if GC can delete elements from the array. 2937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kReloadLengthAfterAllocation, 2938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 2939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ArrayList> Add(Handle<ArrayList> array, Handle<Object> obj, 2940014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AddMode mode = kNone); 2941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ArrayList> Add(Handle<ArrayList> array, Handle<Object> obj1, 2942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> obj2, AddMode = kNone); 294362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<ArrayList> New(Isolate* isolate, int size); 2944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int Length(); 2945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetLength(int length); 2946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* Get(int index); 2947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object** Slot(int index); 2948f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void Set(int index, Object* obj, 2949f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 2950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Clear(int index, Object* undefined); 2951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsFull(); 2952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(ArrayList) 2953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ArrayList> EnsureSpace(Handle<ArrayList> array, int length); 2956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kLengthIndex = 0; 2957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFirstIndex = 1; 2958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ArrayList); 2959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 29603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2961f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define FRAME_ARRAY_FIELD_LIST(V) \ 2962c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(WasmInstance, Object) \ 2963f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(WasmFunctionIndex, Smi) \ 2964f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Receiver, Object) \ 2965f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Function, JSFunction) \ 2966f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Code, AbstractCode) \ 2967f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Offset, Smi) \ 2968f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Flags, Smi) 2969f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2970f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Container object for data collected during simple stack trace captures. 2971f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass FrameArray : public FixedArray { 2972f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 2973f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define DECLARE_FRAME_ARRAY_ACCESSORS(name, type) \ 2974f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline type* name(int frame_ix) const; \ 2975f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline void Set##name(int frame_ix, type* value); 2976f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch FRAME_ARRAY_FIELD_LIST(DECLARE_FRAME_ARRAY_ACCESSORS) 2977f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef DECLARE_FRAME_ARRAY_ACCESSORS 2978f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2979f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline bool IsWasmFrame(int frame_ix) const; 2980c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool IsAsmJsWasmFrame(int frame_ix) const; 2981f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline int FrameCount() const; 2982f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2983f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void ShrinkToFit(); 2984f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2985f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Flags. 2986f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kIsWasmFrame = 1 << 0; 2987c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIsAsmJsWasmFrame = 1 << 1; 2988c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIsStrict = 1 << 2; 2989c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kForceConstructor = 1 << 3; 299062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kAsmJsAtNumberConversion = 1 << 4; 2991f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2992f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Handle<FrameArray> AppendJSFrame(Handle<FrameArray> in, 2993f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> receiver, 2994f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSFunction> function, 2995f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<AbstractCode> code, int offset, 2996f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int flags); 2997f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Handle<FrameArray> AppendWasmFrame(Handle<FrameArray> in, 2998c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> wasm_instance, 2999f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int wasm_function_index, 3000f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<AbstractCode> code, 3001f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int offset, int flags); 3002f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3003f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_CAST(FrameArray) 3004f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3005f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 3006f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The underlying fixed array embodies a captured stack trace. Frame i 3007f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // occupies indices 3008f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 3009f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // kFirstIndex + 1 + [i * kElementsPerFrame, (i + 1) * kElementsPerFrame[, 3010f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 3011f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // with internal offsets as below: 3012f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3013c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kWasmInstanceOffset = 0; 3014f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kWasmFunctionIndexOffset = 1; 3015f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3016f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kReceiverOffset = 0; 3017f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFunctionOffset = 1; 3018f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3019f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kCodeOffset = 2; 3020f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kOffsetOffset = 3; 3021f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3022f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFlagsOffset = 4; 3023f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3024f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kElementsPerFrame = 5; 3025f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3026f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Array layout indices. 3027f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3028f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFrameCountIndex = 0; 3029f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFirstIndex = 1; 3030f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3031f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static int LengthFor(int frame_count) { 3032f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return kFirstIndex + frame_count * kElementsPerFrame; 3033f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 3034f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3035f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Handle<FrameArray> EnsureSpace(Handle<FrameArray> array, int length); 3036f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3037f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch friend class Factory; 3038f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FrameArray); 3039f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 30403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DescriptorArrays are fixed arrays used to hold instance descriptors. 3042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The format of the these objects is: 3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [0]: Number of descriptors 3044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [1]: Either Smi(0) if uninitialized, or a pointer to small fixed array: 3045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [0]: pointer to fixed array with enum cache 3046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [1]: either Smi(0) or pointer to fixed array with indices 3047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [2]: first key 304862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// [2 + number of descriptors * kEntrySize]: start of slack 3049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass DescriptorArray: public FixedArray { 3050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3051257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Returns true for both shared empty_descriptor_array and for smis, which the 3052257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // map uses to encode additional bit fields when the descriptor array is not 3053257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // yet used. 3054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsEmpty(); 3055e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 3056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the number of descriptors in the array. 3057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int number_of_descriptors(); 3058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int number_of_descriptors_storage(); 3060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int NumberOfSlackDescriptors(); 3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetNumberOfDescriptors(int number_of_descriptors); 3064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int number_of_entries(); 3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasEnumCache(); 3067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void CopyEnumCacheFrom(DescriptorArray* array); 3069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline FixedArray* GetEnumCache(); 3071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasEnumIndicesCache(); 3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline FixedArray* GetEnumIndicesCache(); 3075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object** GetEnumCacheSlot(); 3077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClearEnumCache(); 3079257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Initialize or change the enum cache, 3081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // using the supplied storage for the small "bridge". 3082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetEnumCache(Handle<DescriptorArray> descriptors, 3083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<FixedArray> new_cache, 3084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> new_index_cache); 3085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Accessors for fetching instance descriptor at descriptor number. 3087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Name* GetKey(int descriptor_number); 3088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetKeySlot(int descriptor_number); 3089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* GetValue(int descriptor_number); 3090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetValue(int descriptor_number, Object* value); 3091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetValueSlot(int descriptor_number); 3092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int GetValueOffset(int descriptor_number); 3093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetDescriptorStartSlot(int descriptor_number); 3094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object** GetDescriptorEndSlot(int descriptor_number); 3095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline PropertyDetails GetDetails(int descriptor_number); 3096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int GetFieldIndex(int descriptor_number); 309762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline FieldType* GetFieldType(int descriptor_number); 30983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Name* GetSortedKey(int descriptor_number); 3100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int GetSortedKeyIndex(int descriptor_number); 3101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetSortedKey(int pointer, int descriptor_number); 31023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Accessor for complete descriptor. 3104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void Get(int descriptor_number, Descriptor* desc); 3105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Set(int descriptor_number, Descriptor* desc); 310662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void Set(int descriptor_number, Name* key, Object* value, 310762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyDetails details); 3108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Replace(int descriptor_number, Descriptor* descriptor); 31093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 311062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Generalizes constness, representation and field type of all field 311162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // descriptors. 311262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void GeneralizeAllFields(); 311362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Append automatically sets the enumeration index. This should only be used 3115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to add descriptors in bulk at the end, followed by sorting the descriptor 3116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // array. 3117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Append(Descriptor* desc); 31183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<DescriptorArray> CopyUpTo(Handle<DescriptorArray> desc, 3120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int enumeration_index, 3121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slack = 0); 3122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<DescriptorArray> CopyUpToAddAttributes( 3124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<DescriptorArray> desc, 3125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int enumeration_index, 3126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttributes attributes, 3127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slack = 0); 31280d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 31290d5e116f6aee03185f237311a943491bb079a768Kristian Monsen // Sort the instance descriptors by the hash codes of their keys. 3130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Sort(); 3131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Search the instance descriptors for given name. 3133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(int Search(Name* name, int number_of_own_descriptors)); 3134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3135756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // As the above, but uses DescriptorLookupCache and updates it when 3136756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // necessary. 3137109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch INLINE(int SearchWithCache(Isolate* isolate, Name* name, Map* map)); 3138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsEqualUpTo(DescriptorArray* desc, int nof_descriptors); 3140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Allocates a DescriptorArray, but returns the singleton 3142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // empty descriptor array object if number_of_descriptors is 0. 3143109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static Handle<DescriptorArray> Allocate( 3144109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Isolate* isolate, int number_of_descriptors, int slack, 3145109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PretenureFlag pretenure = NOT_TENURED); 3146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DescriptorArray) 3148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Constant for denoting key was not found. 3150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNotFound = -1; 3151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorLengthIndex = 0; 3153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheIndex = 1; 3154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFirstIndex = 2; 3155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The length of the "bridge" to the enum cache. 3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheBridgeLength = 2; 3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheBridgeCacheIndex = 0; 3159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheBridgeIndicesCacheIndex = 1; 3160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 3162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorLengthOffset = FixedArray::kHeaderSize; 3163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheOffset = kDescriptorLengthOffset + kPointerSize; 3164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFirstOffset = kEnumCacheOffset + kPointerSize; 3165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description for the bridge array. 3167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEnumCacheBridgeCacheOffset = FixedArray::kHeaderSize; 3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout of descriptor. 317062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Naming is consistent with Dictionary classes for easy templating. 317162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kEntryKeyIndex = 0; 317262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kEntryDetailsIndex = 1; 317362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kEntryValueIndex = 2; 317462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kEntrySize = 3; 3175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if defined(DEBUG) || defined(OBJECT_PRINT) 3177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // For our gdb macros, we should perhaps change these in the future. 3178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print(); 3179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Print all the descriptors. 3181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintDescriptors(std::ostream& os); // NOLINT 318262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 318362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void PrintDescriptorDetails(std::ostream& os, int descriptor, 318462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyDetails::PrintMode mode); 3185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 3186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 3188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Is the descriptor array sorted and without duplicates? 3189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSortedNoDuplicates(int valid_descriptors = -1); 3190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Is the descriptor array consistent with the back pointers in targets? 3192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsConsistentWithBackPointers(Map* current_map); 3193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Are two DescriptorArrays equal? 3195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool IsEqualTo(DescriptorArray* other); 3196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 3197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the fixed array length required to hold number_of_descriptors 3199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // descriptors. 3200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int LengthFor(int number_of_descriptors) { 3201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ToKeyIndex(number_of_descriptors); 3202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 32043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static int ToDetailsIndex(int descriptor_number) { 320562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return kFirstIndex + (descriptor_number * kEntrySize) + kEntryDetailsIndex; 32063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 32073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 32083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Conversion from descriptor number to array indices. 32093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static int ToKeyIndex(int descriptor_number) { 321062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return kFirstIndex + (descriptor_number * kEntrySize) + kEntryKeyIndex; 32113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 32123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3213bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static int ToValueIndex(int descriptor_number) { 321462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return kFirstIndex + (descriptor_number * kEntrySize) + kEntryValueIndex; 3215bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 3216bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 3217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 3218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Transfer a complete descriptor from the src descriptor array to this 3219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // descriptor array. 3220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CopyFrom(int index, DescriptorArray* src); 3221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Swap first and second descriptor. 3223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SwapSortedKeys(int first, int second); 3224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(DescriptorArray); 3226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum SearchMode { ALL_ENTRIES, VALID_ENTRIES }; 3230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <SearchMode search_mode, typename T> 3232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierinline int Search(T* array, Name* name, int valid_entries = 0, 3233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int* out_insertion_index = NULL); 3234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HashTable is a subclass of FixedArray that implements a hash table 3237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// that uses open addressing and quadratic probing. 3238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 3239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// In order for the quadratic probing to work, elements that have not 3240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// yet been used and elements that have been deleted are 3241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// distinguished. Probing continues when deleted elements are 3242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// encountered and stops when unused elements are encountered. 3243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 3244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Elements with key == undefined have not been used yet. 32453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// - Elements with key == the_hole have been deleted. 3246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 3247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The hash table class is parameterized with a Shape and a Key. 3248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Shape must be a class with the following interface: 3249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// class ExampleShape { 3250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// public: 3251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // Tells whether key matches other. 3252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static bool IsMatch(Key key, Object* other); 3253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // Returns the hash value for key. 3254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static uint32_t Hash(Key key); 3255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // Returns the hash value for object. 3256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static uint32_t HashForObject(Key key, Object* object); 3257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // Convert key to an object. 3258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// static inline Handle<Object> AsHandle(Isolate* isolate, Key key); 3259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // The prefix size indicates number of elements in the beginning 3260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // of the backing storage. 3261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static const int kPrefixSize = ..; 3262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// // The Element size indicates number of elements per entry. 3263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// static const int kEntrySize = ..; 3264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// }; 32653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// The prefix size indicates an amount of memory in the 3266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// beginning of the backing storage that can be used for non-element 3267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// information by subclasses. 3268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3269c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochtemplate<typename Key> 3270c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass BaseShape { 3271c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch public: 3272c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const bool UsesSeed = false; 3273c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static uint32_t Hash(Key key) { return 0; } 3274c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static uint32_t SeededHash(Key key, uint32_t seed) { 3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(UsesSeed); 3276c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return Hash(key); 3277c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch } 3278c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static uint32_t HashForObject(Key key, Object* object) { return 0; } 3279c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static uint32_t SeededHashForObject(Key key, uint32_t seed, Object* object) { 3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(UsesSeed); 3281c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return HashForObject(key, object); 3282c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch } 3283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline Map* GetMap(Isolate* isolate); 3284c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 3285c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3286c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass HashTableBase : public FixedArray { 3288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 32893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Returns the number of elements in the hash table. 3290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int NumberOfElements(); 3291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3292e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Returns the number of deleted elements in the hash table. 3293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int NumberOfDeletedElements(); 3294e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 32953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Returns the capacity of the hash table. 3296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int Capacity(); 3297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ElementAdded should be called whenever an element is added to a 32993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // hash table. 3300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void ElementAdded(); 3301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ElementRemoved should be called whenever an element is removed from 33033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // a hash table. 3304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void ElementRemoved(); 3305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void ElementsRemoved(int n); 3306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 330769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Computes the required capacity for a table holding the given 330869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // number of elements. May be more than HashTable::kMaxCapacity. 3309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int ComputeCapacity(int at_least_space_for); 3310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 33113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Tells whether k is a real key. The hole and undefined are not allowed 3312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // as keys and can be used to indicate missing or deleted elements. 3313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsKey(Object* k); 331413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool IsKey(Isolate* isolate, Object* k); 3315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Compute the probe offset (quadratic probing). 3317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block INLINE(static uint32_t GetProbeOffset(uint32_t n)) { 3318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (n + n * n) >> 1; 3319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNumberOfElementsIndex = 0; 3322e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kNumberOfDeletedElementsIndex = 1; 3323e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kCapacityIndex = 2; 3324e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kPrefixStartIndex = 3; 3325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Constant used for denoting a absent entry. 3327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNotFound = -1; 3328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3329c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Minimum capacity for newly created hash tables. 3330c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMinCapacity = 4; 3331c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 33333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Update the number of elements in the hash table. 3334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetNumberOfElements(int nof); 3335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3336e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Update the number of deleted elements in the hash table. 3337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetNumberOfDeletedElements(int nod); 3338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns probe entry. 3340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static uint32_t GetProbe(uint32_t hash, uint32_t number, uint32_t size) { 3341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base::bits::IsPowerOfTwo32(size)); 3342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (hash + GetProbeOffset(number)) & (size - 1); 3343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static uint32_t FirstProbe(uint32_t hash, uint32_t size) { 3346e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return hash & (size - 1); 3347e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 3348e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 3349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static uint32_t NextProbe( 3350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t last, uint32_t number, uint32_t size) { 3351e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return (last + number) & (size - 1); 3352e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke } 3353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Derived, typename Shape, typename Key> 3357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass HashTable : public HashTableBase { 3358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 335913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch typedef Shape ShapeT; 336013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 3361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Wrapper methods 3362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t Hash(Key key) { 3363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Shape::UsesSeed) { 3364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::SeededHash(key, GetHeap()->HashSeed()); 3365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 3366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::Hash(key); 3367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t HashForObject(Key key, Object* object) { 3371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Shape::UsesSeed) { 3372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::SeededHashForObject(key, GetHeap()->HashSeed(), object); 3373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 3374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::HashForObject(key, object); 3375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns a new HashTable object. 3379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Handle<Derived> New( 3380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, int at_least_space_for, 3381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY, 3382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure = NOT_TENURED); 3383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(HashTable) 3385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Garbage collection support. 3387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IteratePrefix(ObjectVisitor* visitor); 3388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IterateElements(ObjectVisitor* visitor); 3389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find entry for key otherwise return kNotFound. 3391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int FindEntry(Key key); 3392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int FindEntry(Isolate* isolate, Key key, int32_t hash); 3393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int FindEntry(Isolate* isolate, Key key); 3394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool Has(Isolate* isolate, Key key); 3395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool Has(Key key); 3396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Rehashes the table in-place. 3398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Rehash(Key key); 3399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the key at entry. 340113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Object* KeyAt(int entry) { return get(EntryToIndex(entry) + kEntryKeyIndex); } 3402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kElementsStartIndex = kPrefixStartIndex + Shape::kPrefixSize; 3404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kEntrySize = Shape::kEntrySize; 340513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch STATIC_ASSERT(kEntrySize > 0); 340613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryKeyIndex = 0; 3407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kElementsStartOffset = 3408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kHeaderSize + kElementsStartIndex * kPointerSize; 3409c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Maximal capacity of HashTable. Based on maximal length of underlying 3410c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // FixedArray. Staying below kMaxCapacity also ensures that EntryToIndex 3411c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // cannot overflow. 3412c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMaxCapacity = 3413c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch (FixedArray::kMaxLength - kElementsStartIndex) / kEntrySize; 3414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the index for an entry (of the key) 3416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int EntryToIndex(int entry) { 3417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (entry * kEntrySize) + kElementsStartIndex; 3418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 3421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class ObjectHashTable; 3422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 342362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static Handle<Derived> New(Isolate* isolate, int capacity, 342462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PretenureFlag pretenure); 342562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find the entry at which to insert element with the given key that 3427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // has the given hash value. 3428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t FindInsertionEntry(uint32_t hash); 3429e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 34303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Attempt to shrink hash table after removal of key. 3431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<Derived> Shrink(Handle<Derived> table, Key key); 34323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Ensure enough space for n additional elements. 3434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<Derived> EnsureCapacity( 3435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Derived> table, 3436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int n, 3437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Key key, 3438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure = NOT_TENURED); 3439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if this table has sufficient capacity for adding n elements. 344113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool HasSufficientCapacityToAdd(int number_of_additional_elements); 3442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Sets the capacity of the hash table. 3444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetCapacity(int capacity) { 3445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // To scale a computed hash code to fit within the hash table, we 3446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // use bit-wise AND with a mask, so the capacity must be positive 3447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and non-zero. 3448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(capacity > 0); 3449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(capacity <= kMaxCapacity); 3450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch set(kCapacityIndex, Smi::FromInt(capacity)); 3451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns _expected_ if one of entries given by the first _probe_ probes is 3455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // equal to _expected_. Otherwise, returns the entry given by the probe 3456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // number _probe_. 3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t EntryForProbe(Key key, Object* k, int probe, uint32_t expected); 3458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Swap(uint32_t entry1, uint32_t entry2, WriteBarrierMode mode); 3460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Rehashes this hash-table into the new table. 3462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Rehash(Handle<Derived> new_table, Key key); 3463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// HashTableKey is an abstract superclass for virtual key behavior. 3467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass HashTableKey { 3468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns whether the other object matches this key. 3470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual bool IsMatch(Object* other) = 0; 3471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the hash value for this key. 3472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual uint32_t Hash() = 0; 3473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the hash value for object. 3474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual uint32_t HashForObject(Object* key) = 0; 34753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // Returns the key object for storing into the hash table. 3476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT virtual Handle<Object> AsHandle(Isolate* isolate) = 0; 3477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Required. 3478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~HashTableKey() {} 3479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3481c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StringTableShape : public BaseShape<HashTableKey*> { 3483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 348444f0eee88ff00398ff7f715fab053374d808c90dSteve Block static inline bool IsMatch(HashTableKey* key, Object* value) { 3485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->IsMatch(value); 3486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 348844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static inline uint32_t Hash(HashTableKey* key) { 3489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->Hash(); 3490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 349244f0eee88ff00398ff7f715fab053374d808c90dSteve Block static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 3493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->HashForObject(object); 3494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 3497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPrefixSize = 0; 3499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kEntrySize = 1; 3500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SeqOneByteString; 3503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// StringTable. 3505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 3506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// No special elements in the prefix and the element size is 1 3507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// because only the string itself (the key) needs to be stored. 3508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StringTable: public HashTable<StringTable, 3509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringTableShape, 3510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HashTableKey*> { 3511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find string in the string table. If it is not there yet, it is 3513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // added. The return value is the string found. 3514f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE static Handle<String> LookupString(Isolate* isolate, 3515f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<String> key); 3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<String> LookupKey(Isolate* isolate, HashTableKey* key); 3517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static String* LookupKeyIfExists(Isolate* isolate, HashTableKey* key); 3518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tries to internalize given string and returns string handle on success 3520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // or an empty handle otherwise. 3521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<String> InternalizeStringIfExists( 3522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, 3523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> string); 3524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Looks up a string that is equal to the given string and returns 3526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // string handle if it is found, or an empty handle otherwise. 3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<String> LookupStringIfExists( 3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, 3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> str); 3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<String> LookupTwoCharsStringIfExists( 3531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, 3532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c1, 3533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c2); 3534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void EnsureCapacityForDeserialization(Isolate* isolate, int expected); 3536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(StringTable) 3538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 3540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <bool seq_one_byte> 3541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class JsonParser; 3542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(StringTable); 3544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass StringSetShape : public BaseShape<String*> { 35473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 35483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static inline bool IsMatch(String* key, Object* value); 35493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static inline uint32_t Hash(String* key); 35503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static inline uint32_t HashForObject(String* key, Object* object); 35513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 35523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kPrefixSize = 0; 35533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kEntrySize = 1; 35543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 35553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 35563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass StringSet : public HashTable<StringSet, StringSetShape, String*> { 35573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public: 35583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static Handle<StringSet> New(Isolate* isolate); 35593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static Handle<StringSet> Add(Handle<StringSet> blacklist, 35603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<String> name); 35613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool Has(Handle<String> name); 35623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 35633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DECLARE_CAST(StringSet) 35643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}; 3565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename Derived, typename Shape, typename Key> 3567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Dictionary: public HashTable<Derived, Shape, Key> { 3568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef HashTable<Derived, Shape, Key> DerivedHashTable; 3569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the value at entry. 3572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* ValueAt(int entry) { 3573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return this->get(Derived::EntryToIndex(entry) + 1); 3574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set the value for entry. 35773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void ValueAtPut(int entry, Object* value) { 3578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch this->set(Derived::EntryToIndex(entry) + 1, value); 3579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the property details for the property at entry. 3582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyDetails DetailsAt(int entry) { 3583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::DetailsAt(static_cast<Derived*>(this), entry); 3584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set the details for entry. 3587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void DetailsAtPut(int entry, PropertyDetails value) { 3588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Shape::DetailsAtPut(static_cast<Derived*>(this), entry, value); 3589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if property at given entry is deleted. 3592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsDeleted(int entry) { 3593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Shape::IsDeleted(static_cast<Derived*>(this), entry); 3594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Delete a property from the dictionary. 3597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> DeleteProperty(Handle<Derived> dictionary, int entry); 3598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Attempt to shrink the dictionary after deletion of key. 3600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Handle<Derived> Shrink( 3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Derived> dictionary, 3602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Key key) { 3603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return DerivedHashTable::Shrink(dictionary, key); 3604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 36053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Sorting support 3607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(dcarney): templatize or move to SeededNumberDictionary 3608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CopyValuesTo(FixedArray* elements); 3609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the number of elements in the dictionary filtering out properties 3611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // with the specified attributes. 3612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int NumberOfElementsFilterAttributes(PropertyFilter filter); 3613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the number of enumerable elements in the dictionary. 3615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int NumberOfEnumElements() { 3616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NumberOfElementsFilterAttributes(ENUMERABLE_STRINGS); 3617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch enum SortMode { UNSORTED, SORTED }; 3620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 362162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Return the key indices sorted by its enumeration index. 362262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<FixedArray> IterationIndices( 362362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Dictionary<Derived, Shape, Key>> dictionary); 362462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Collect the keys into the given KeyAccumulator, in ascending chronological 3626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // order of property creation. 3627f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void CollectKeysTo(Handle<Dictionary<Derived, Shape, Key>> dictionary, 3628f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch KeyAccumulator* keys); 3629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Copies enumerable keys to preallocated fixed array. 3631f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void CopyEnumKeysTo(Handle<Dictionary<Derived, Shape, Key>> dictionary, 3632f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<FixedArray> storage, KeyCollectionMode mode, 3633f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch KeyAccumulator* accumulator); 3634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Accessors for next enumeration index. 3636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void SetNextEnumerationIndex(int index) { 3637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(index != 0); 36383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch this->set(kNextEnumerationIndexIndex, Smi::FromInt(index)); 3639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int NextEnumerationIndex() { 3642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(this->get(kNextEnumerationIndexIndex))->value(); 3643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Creates a new dictionary. 3646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<Derived> New( 3647f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate, int at_least_space_for, 3648f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PretenureFlag pretenure = NOT_TENURED, 3649f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MinimumCapacity capacity_option = USE_DEFAULT_MINIMUM_CAPACITY); 3650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 365162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Creates an dictionary with minimal possible capacity. 365262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static Handle<Derived> NewEmpty( 365362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, PretenureFlag pretenure = NOT_TENURED); 365462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Ensures that a new dictionary is created when the capacity is checked. 3656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetRequiresCopyOnCapacityChange(); 3657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Ensure enough space for n additional elements. 3659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> EnsureCapacity(Handle<Derived> obj, int n, Key key); 3660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef OBJECT_PRINT 366213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // For our gdb macros, we should perhaps change these in the future. 366313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void Print(); 366413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 3665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Print(std::ostream& os); // NOLINT 3666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 3667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the key (slow). 3668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* SlowReverseLookup(Object* value); 3669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Sets the entry to (key, value) pair. 3671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SetEntry(int entry, 3672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key, 3673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 36748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch inline void SetEntry(int entry, 3675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key, 3676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value, 3677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyDetails details); 3678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3679f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MUST_USE_RESULT static Handle<Derived> Add(Handle<Derived> dictionary, 3680f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Key key, Handle<Object> value, 3681f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyDetails details, 3682f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int* entry_out = nullptr); 3683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3684c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMaxNumberKeyIndex = DerivedHashTable::kPrefixStartIndex; 3685c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNextEnumerationIndexIndex = kMaxNumberKeyIndex + 1; 3686c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 368762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const bool kIsEnumerable = Shape::kIsEnumerable; 368862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block protected: 3690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Generic at put operation. 3691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<Derived> AtPut( 3692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Derived> dictionary, 3693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Key key, 3694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 3695f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Add entry to dictionary. Returns entry value. 3696f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int AddEntry(Handle<Derived> dictionary, Key key, Handle<Object> value, 3697f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyDetails details, uint32_t hash); 3698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Generate new enumeration indices to avoid enumeration index overflow. 3699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Returns iteration indices array for the |dictionary|. 3700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<FixedArray> GenerateNewEnumerationIndices( 3701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Derived> dictionary); 3702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Derived, typename Shape> 3706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass NameDictionaryBase : public Dictionary<Derived, Shape, Handle<Name> > { 3707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef Dictionary<Derived, Shape, Handle<Name> > DerivedDictionary; 3708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find entry for key, otherwise return kNotFound. Optimized version of 3711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // HashTable::FindEntry. 3712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int FindEntry(Handle<Name> key); 3713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Key> 3717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass BaseDictionaryShape : public BaseShape<Key> { 3718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline PropertyDetails DetailsAt(Dictionary* dict, int entry) { 3721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(Dictionary::kEntrySize == 3); 3722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(entry >= 0); // Not found is -1, which is not caught by get(). 372313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return PropertyDetails(Smi::cast(dict->get( 372413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Dictionary::EntryToIndex(entry) + Dictionary::kEntryDetailsIndex))); 3725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void DetailsAtPut(Dictionary* dict, int entry, 3729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDetails value) { 3730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(Dictionary::kEntrySize == 3); 373113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch dict->set(Dictionary::EntryToIndex(entry) + Dictionary::kEntryDetailsIndex, 373213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch value.AsSmi()); 3733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsDeleted(Dictionary* dict, int entry) { 3737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 3738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key, 3742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, PropertyDetails details); 3743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3746014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass NameDictionaryShape : public BaseDictionaryShape<Handle<Name> > { 3747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsMatch(Handle<Name> key, Object* other); 3749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t Hash(Handle<Name> key); 3750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t HashForObject(Handle<Name> key, Object* object); 3751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Name> key); 3752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPrefixSize = 2; 3753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kEntrySize = 3; 375413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 375513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryDetailsIndex = 2; 3756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const bool kIsEnumerable = true; 3757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3760014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass NameDictionary 3761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public NameDictionaryBase<NameDictionary, NameDictionaryShape> { 3762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef NameDictionaryBase<NameDictionary, NameDictionaryShape> 3763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DerivedDictionary; 3764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(NameDictionary) 3767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline static Handle<FixedArray> DoGenerateNewEnumerationIndices( 3769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<NameDictionary> dictionary); 377013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 377113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 377213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryDetailsIndex = 2; 3773c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kInitialCapacity = 2; 3774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 37753bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 3776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass GlobalDictionaryShape : public NameDictionaryShape { 3778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kEntrySize = 2; // Overrides NameDictionaryShape::kEntrySize 3780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3781014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline PropertyDetails DetailsAt(Dictionary* dict, int entry); 3783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3785014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void DetailsAtPut(Dictionary* dict, int entry, 3786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDetails value); 3787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3788014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsDeleted(Dictionary* dict, int entry); 3790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <typename Dictionary> 3792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline void SetEntry(Dictionary* dict, int entry, Handle<Object> key, 3793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, PropertyDetails details); 3794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 3795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass GlobalDictionary 3798014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public NameDictionaryBase<GlobalDictionary, GlobalDictionaryShape> { 3799014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 3800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(GlobalDictionary) 380113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 380213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 3803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass NumberDictionaryShape : public BaseDictionaryShape<uint32_t> { 3807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 3808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool IsMatch(uint32_t key, Object* other); 3809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, uint32_t key); 3810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const bool kIsEnumerable = false; 3811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3814c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass SeededNumberDictionaryShape : public NumberDictionaryShape { 3815c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch public: 3816c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const bool UsesSeed = true; 3817c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const int kPrefixSize = 2; 3818f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kEntrySize = 3; 3819c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3820c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static inline uint32_t SeededHash(uint32_t key, uint32_t seed); 3821c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static inline uint32_t SeededHashForObject(uint32_t key, 3822c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch uint32_t seed, 3823c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch Object* object); 3824c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 3825c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3826c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3827c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass UnseededNumberDictionaryShape : public NumberDictionaryShape { 38282b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch public: 3829c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const int kPrefixSize = 0; 3830f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kEntrySize = 2; 3831c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3832c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static inline uint32_t Hash(uint32_t key); 3833c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static inline uint32_t HashForObject(uint32_t key, Object* object); 3834f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 3835f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <typename Dictionary> 3836f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline PropertyDetails DetailsAt(Dictionary* dict, int entry) { 3837f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 3838f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return PropertyDetails::Empty(); 3839f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 3840f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 3841f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch template <typename Dictionary> 3842f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline void DetailsAtPut(Dictionary* dict, int entry, 3843f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyDetails value) { 3844f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 3845f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 3846f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 3847f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static inline Map* GetMap(Isolate* isolate); 3848c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 3849c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3850c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3851c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass SeededNumberDictionary 3852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public Dictionary<SeededNumberDictionary, 3853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SeededNumberDictionaryShape, 3854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t> { 3855c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch public: 3856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SeededNumberDictionary) 3857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Type specific at put (default NONE attributes is used when adding). 3859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<SeededNumberDictionary> AtNumberPut( 3860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SeededNumberDictionary> dictionary, uint32_t key, 386162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> value, Handle<JSObject> dictionary_holder); 3862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<SeededNumberDictionary> AddNumberEntry( 3863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SeededNumberDictionary> dictionary, uint32_t key, 386462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> value, PropertyDetails details, 386562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSObject> dictionary_holder); 3866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set an existing entry or add a new one if needed. 38683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the updated dictionary. 38693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MUST_USE_RESULT static Handle<SeededNumberDictionary> Set( 3870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SeededNumberDictionary> dictionary, uint32_t key, 387162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> value, PropertyDetails details, 387262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSObject> dictionary_holder); 38733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 387462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void UpdateMaxNumberKey(uint32_t key, Handle<JSObject> dictionary_holder); 3875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns true if the dictionary contains any elements that are non-writable, 38773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // non-configurable, non-enumerable, or have getters/setters. 38783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool HasComplexElements(); 38793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If slow elements are required we will never go back to fast-case 3881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // for the elements kept in this dictionary. We require slow 3882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // elements if an element has been added at an index larger than 3883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // kRequiresSlowElementsLimit or set_requires_slow_elements() has been called 3884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // when defining a getter or setter with a number key. 3885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool requires_slow_elements(); 3886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_requires_slow_elements(); 3887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the value of the max number key that has been added to this 3889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // dictionary. max_number_key can only be called if 3890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // requires_slow_elements returns false. 3891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint32_t max_number_key(); 3892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 389313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 389413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryDetailsIndex = 2; 389513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 3896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit masks. 3897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kRequiresSlowElementsMask = 1; 3898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kRequiresSlowElementsTagSize = 1; 3899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const uint32_t kRequiresSlowElementsLimit = (1 << 29) - 1; 3900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 3901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3903c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass UnseededNumberDictionary 3904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public Dictionary<UnseededNumberDictionary, 3905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UnseededNumberDictionaryShape, 3906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t> { 3907c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch public: 3908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(UnseededNumberDictionary) 3909c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3910c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // Type specific at put (default NONE attributes is used when adding). 3911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<UnseededNumberDictionary> AtNumberPut( 3912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<UnseededNumberDictionary> dictionary, 3913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t key, 3914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 3915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<UnseededNumberDictionary> AddNumberEntry( 3916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<UnseededNumberDictionary> dictionary, 3917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t key, 3918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 3919f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<UnseededNumberDictionary> DeleteKey( 3920f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<UnseededNumberDictionary> dictionary, uint32_t key); 3921c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3922c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // Set an existing entry or add a new one if needed. 39233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return the updated dictionary. 39243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MUST_USE_RESULT static Handle<UnseededNumberDictionary> Set( 39253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<UnseededNumberDictionary> dictionary, 3926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t key, 39273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Object> value); 392813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 392913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryValueIndex = 1; 393013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kEntryDetailsIndex = 2; 3931c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch}; 3932c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3933c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ObjectHashTableShape : public BaseShape<Handle<Object> > { 39352b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch public: 3936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsMatch(Handle<Object> key, Object* other); 3937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t Hash(Handle<Object> key); 3938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t HashForObject(Handle<Object> key, Object* object); 3939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Object> key); 3940592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static const int kPrefixSize = 0; 3941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEntrySize = 2; 3942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ObjectHashTable maps keys that are arbitrary objects to object values by 3946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// using the identity hash of the key for hashing purposes. 3947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ObjectHashTable: public HashTable<ObjectHashTable, 3948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectHashTableShape, 3949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> > { 3950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef HashTable< 3951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ObjectHashTable, ObjectHashTableShape, Handle<Object> > DerivedHashTable; 3952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ObjectHashTable) 3954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Attempt to shrink hash table after removal of key. 3956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static inline Handle<ObjectHashTable> Shrink( 3957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ObjectHashTable> table, 3958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key); 3959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Looks up the value associated with the given key. The hole value is 3961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // returned in case the key is not present. 3962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* Lookup(Handle<Object> key); 3963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* Lookup(Handle<Object> key, int32_t hash); 3964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* Lookup(Isolate* isolate, Handle<Object> key, int32_t hash); 3965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3966c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns the value at entry. 3967c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Object* ValueAt(int entry); 3968c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Adds (or overwrites) the value associated with the given key. 3970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table, 3971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key, 3972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 3973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ObjectHashTable> Put(Handle<ObjectHashTable> table, 3974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> key, Handle<Object> value, 3975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t hash); 3976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an ObjectHashTable (possibly |table|) where |key| has been removed. 3978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<ObjectHashTable> Remove(Handle<ObjectHashTable> table, 3979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> key, 3980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool* was_present); 3981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<ObjectHashTable> Remove(Handle<ObjectHashTable> table, 3982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> key, bool* was_present, 3983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t hash); 3984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 3986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class MarkCompactCollector; 3987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddEntry(int entry, Object* key, Object* value); 3989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RemoveEntry(int entry); 3990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the index to the value of an entry. 3992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int EntryToValueIndex(int entry) { 3993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return EntryToIndex(entry) + 1; 3994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 399569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 399669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3997f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass ObjectHashSetShape : public ObjectHashTableShape { 3998f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 3999f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kPrefixSize = 0; 4000f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kEntrySize = 1; 4001f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 4002f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4003f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass ObjectHashSet 4004f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : public HashTable<ObjectHashSet, ObjectHashSetShape, Handle<Object>> { 4005f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 4006f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<ObjectHashSet> Add(Handle<ObjectHashSet> set, 4007f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> key); 4008f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4009f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool Has(Isolate* isolate, Handle<Object> key, int32_t hash); 4010f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool Has(Isolate* isolate, Handle<Object> key); 4011f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4012f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(ObjectHashSet) 4013f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 401469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OrderedHashTable is a HashTable with Object keys that preserves 4016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// insertion order. There are Map and Set interfaces (OrderedHashMap 4017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// and OrderedHashTable, below). It is meant to be used by JSMap/JSSet. 4018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Only Object* keys are supported, with Object::SameValueZero() used as the 4020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// equality operator and Object::GetHash() for the hash function. 4021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Based on the "Deterministic Hash Table" as described by Jason Orendorff at 4023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables 4024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Originally attributed to Tyler Close. 4025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Memory layout: 4027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [0]: bucket count 4028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [1]: element count 4029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [2]: deleted element count 4030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [3..(3 + NumberOfBuckets() - 1)]: "hash table", where each item is an 4031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// offset into the data table (see below) where the 4032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// first item in this bucket is stored. 4033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [3 + NumberOfBuckets()..length]: "data table", an array of length 4034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Capacity() * kEntrySize, where the first entrysize 4035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// items are handled by the derived class and the 4036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// item at kChainOffset is another entry into the 4037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// data table indicating the next entry in this hash 4038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// bucket. 4039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When we transition the table to a new version we obsolete it and reuse parts 4041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// of the memory to store information how to transition an iterator to the new 4042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// table: 4043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Memory layout for obsolete table: 4045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [0]: bucket count 4046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [1]: Next newer table 4047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [2]: Number of removed holes or -1 when the table was cleared. 4048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [3..(3 + NumberOfRemovedHoles() - 1)]: The indexes of the removed holes. 4049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [3 + NumberOfRemovedHoles()..length]: Not used 4050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 4051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Derived, class Iterator, int entrysize> 4052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OrderedHashTable: public FixedArray { 40533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 4054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an OrderedHashTable with a capacity of at least |capacity|. 4055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> Allocate( 4056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate, int capacity, PretenureFlag pretenure = NOT_TENURED); 4057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an OrderedHashTable (possibly |table|) with enough space 4059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to add at least one new element. 4060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> EnsureGrowable(Handle<Derived> table); 4061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an OrderedHashTable (possibly |table|) that's shrunken 4063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // if possible. 4064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> Shrink(Handle<Derived> table); 4065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a new empty OrderedHashTable and records the clearing so that 4067bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // existing iterators can be updated. 4068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> Clear(Handle<Derived> table); 4069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns a true if the OrderedHashTable contains the key 4071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool HasKey(Handle<Derived> table, Handle<Object> key); 4072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfElements() { 4074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(get(kNumberOfElementsIndex))->value(); 4075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfDeletedElements() { 4078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(get(kNumberOfDeletedElementsIndex))->value(); 4079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4081bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Returns the number of contiguous entries in the data table, starting at 0, 4082bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // that either are real entries or have been deleted. 4083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int UsedCapacity() { return NumberOfElements() + NumberOfDeletedElements(); } 4084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfBuckets() { 4086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(get(kNumberOfBucketsIndex))->value(); 4087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns an index into |this| for the given entry. 4090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int EntryToIndex(int entry) { 4091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kHashTableStartIndex + NumberOfBuckets() + (entry * kEntrySize); 4092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int HashToBucket(int hash) { return hash & (NumberOfBuckets() - 1); } 4095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int HashToEntry(int hash) { 4097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int bucket = HashToBucket(hash); 4098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* entry = this->get(kHashTableStartIndex + bucket); 4099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Smi::cast(entry)->value(); 4100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 410213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int KeyToFirstEntry(Isolate* isolate, Object* key) { 4103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* hash = key->GetHash(); 4104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the object does not have an identity hash, it was never used as a key 410513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (hash->IsUndefined(isolate)) return kNotFound; 4106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return HashToEntry(Smi::cast(hash)->value()); 4107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int NextChainEntry(int entry) { 4110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* next_entry = get(EntryToIndex(entry) + kChainOffset); 4111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Smi::cast(next_entry)->value(); 4112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 4113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 411413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // use KeyAt(i)->IsTheHole(isolate) to determine if this is a deleted entry. 4115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Object* KeyAt(int entry) { 4116bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK_LT(entry, this->UsedCapacity()); 4117bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return get(EntryToIndex(entry)); 4118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 4119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsObsolete() { 4121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !get(kNextTableIndex)->IsSmi(); 4122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The next newer table. This is only valid if the table is obsolete. 4125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Derived* NextTable() { 4126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Derived::cast(get(kNextTableIndex)); 4127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // When the table is obsolete we store the indexes of the removed holes. 4130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int RemovedIndexAt(int index) { 4131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Smi::cast(get(kRemovedHolesIndex + index))->value(); 4132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNotFound = -1; 4135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMinCapacity = 4; 4136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 413762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kNumberOfElementsIndex = 0; 413862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // The next table is stored at the same index as the nof elements. 4139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNextTableIndex = kNumberOfElementsIndex; 414062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kNumberOfDeletedElementsIndex = kNumberOfElementsIndex + 1; 414162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kNumberOfBucketsIndex = kNumberOfDeletedElementsIndex + 1; 414262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kHashTableStartIndex = kNumberOfBucketsIndex + 1; 414362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 414462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static constexpr const int kNumberOfElementsOffset = 414562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FixedArray::OffsetOfElementAt(kNumberOfElementsIndex); 414662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static constexpr const int kNextTableOffset = 414762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FixedArray::OffsetOfElementAt(kNextTableIndex); 414862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static constexpr const int kNumberOfDeletedElementsOffset = 414962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FixedArray::OffsetOfElementAt(kNumberOfDeletedElementsIndex); 415062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static constexpr const int kNumberOfBucketsOffset = 415162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FixedArray::OffsetOfElementAt(kNumberOfBucketsIndex); 415262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static constexpr const int kHashTableStartOffset = 415362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FixedArray::OffsetOfElementAt(kHashTableStartIndex); 4154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kEntrySize = entrysize + 1; 4156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kChainOffset = entrysize; 4157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLoadFactor = 2; 4159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // NumberOfDeletedElements is set to kClearedTableSentinel when 4161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // the table is cleared, which allows iterator transitions to 4162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // optimize that case. 4163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kClearedTableSentinel = -1; 4164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 4165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 4166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Derived> Rehash(Handle<Derived> table, int new_capacity); 4167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetNumberOfBuckets(int num) { 4169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set(kNumberOfBucketsIndex, Smi::FromInt(num)); 4170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetNumberOfElements(int num) { 4173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set(kNumberOfElementsIndex, Smi::FromInt(num)); 4174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetNumberOfDeletedElements(int num) { 4177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set(kNumberOfDeletedElementsIndex, Smi::FromInt(num)); 4178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4180bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Returns the number elements that can fit into the allocated buffer. 4181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int Capacity() { 4182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NumberOfBuckets() * kLoadFactor; 4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetNextTable(Derived* next_table) { 4186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set(kNextTableIndex, next_table); 4187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetRemovedIndexAt(int index, int removed_index) { 4190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return set(kRemovedHolesIndex + index, Smi::FromInt(removed_index)); 4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kRemovedHolesIndex = kHashTableStartIndex; 41943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxCapacity = 4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (FixedArray::kMaxLength - kHashTableStartIndex) 4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch / (1 + (kEntrySize * kLoadFactor)); 41983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 41993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSSetIterator; 4202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OrderedHashSet: public OrderedHashTable< 4205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OrderedHashSet, JSSetIterator, 1> { 4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(OrderedHashSet) 4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<OrderedHashSet> Add(Handle<OrderedHashSet> table, 4210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value); 421113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Handle<FixedArray> ConvertToKeysArray(Handle<OrderedHashSet> table, 421213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch GetKeysConversion convert); 4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSMapIterator; 4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass OrderedHashMap 4220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public OrderedHashTable<OrderedHashMap, JSMapIterator, 2> { 422169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 4222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(OrderedHashMap) 4223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* ValueAt(int entry); 422569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kValueOffset = 1; 4227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <int entrysize> 4231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass WeakHashTableShape : public BaseShape<Handle<Object> > { 4232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsMatch(Handle<Object> key, Object* other); 4234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t Hash(Handle<Object> key); 4235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t HashForObject(Handle<Object> key, Object* object); 4236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, Handle<Object> key); 4237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrefixSize = 0; 4238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEntrySize = entrysize; 4239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// WeakHashTable maps keys that are arbitrary heap objects to heap object 4243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// values. The table wraps the keys in weak cells and store values directly. 4244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Thus it references keys weakly and values strongly. 4245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass WeakHashTable: public HashTable<WeakHashTable, 4246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WeakHashTableShape<2>, 4247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> > { 4248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef HashTable< 4249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WeakHashTable, WeakHashTableShape<2>, Handle<Object> > DerivedHashTable; 4250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(WeakHashTable) 4252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Looks up the value associated with the given key. The hole value is 425469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // returned in case the key is not present. 4255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* Lookup(Handle<HeapObject> key); 425669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 425769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Adds (or overwrites) the value associated with the given key. Mapping a 4258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // key to the hole value causes removal of the whole entry. 4259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<WeakHashTable> Put(Handle<WeakHashTable> table, 4260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapObject> key, 4261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<HeapObject> value); 4262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<FixedArray> GetValues(Handle<WeakHashTable> table); 426469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 426569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 426669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch friend class MarkCompactCollector; 426769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddEntry(int entry, Handle<WeakCell> key, Handle<HeapObject> value); 426969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 427069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returns the index to the value of an entry. 427169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static inline int EntryToValueIndex(int entry) { 427269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return EntryToIndex(entry) + 1; 427369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 427469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 427569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 427669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 427780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// The cache for maps used by normalized (dictionary mode) objects. 427880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// Such maps do not have property descriptors, so a typical program 427980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen// needs very limited number of distinct normalized maps. 428080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenclass NormalizedMapCache: public FixedArray { 428180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen public: 4282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<NormalizedMapCache> New(Isolate* isolate); 428380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT MaybeHandle<Map> Get(Handle<Map> fast_map, 4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyNormalizationMode mode); 4286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Set(Handle<Map> fast_map, Handle<Map> normalized_map); 428780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 428880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen void Clear(); 428980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 4290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(NormalizedMapCache) 429180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 4292109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline bool IsNormalizedMapCache(const HeapObject* obj); 4293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(NormalizedMapCache) 4295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEntries = 64; 4297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int GetIndex(Handle<Map> map); 4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The following declarations hide base class methods. 4301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* get(int index); 4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set(int index, Object* value); 430380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen}; 430480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 4305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// HandlerTable is a fixed array containing entries for exception handlers in 4306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// the code object it is associated with. The tables comes in two flavors: 4307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 1) Based on ranges: Used for unoptimized code. Contains one entry per 4308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// exception handler and a range representing the try-block covered by that 4309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// handler. Layout looks as follows: 4310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// [ range-start , range-end , handler-offset , handler-data ] 4311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// 2) Based on return addresses: Used for turbofanned code. Contains one entry 4312f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// per call-site that could throw an exception. Layout looks as follows: 4313f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// [ return-address-offset , handler-offset ] 4314f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass HandlerTable : public FixedArray { 4315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 4316f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Conservative prediction whether a given handler will locally catch an 4317f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // exception or cause a re-throw to outside the code boundary. Since this is 4318f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // undecidable it is merely an approximation (e.g. useful for debugger). 4319f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum CatchPrediction { 4320f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNCAUGHT, // The handler will (likely) rethrow the exception. 4321f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CAUGHT, // The exception will be caught by the handler. 4322f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PROMISE, // The exception will be caught and cause a promise rejection. 4323f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DESUGARING, // The exception will be caught, but both the exception and the 4324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // catching are part of a desugaring and should therefore not 4325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // be visible to the user (we won't notify the debugger of such 4326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // exceptions). 4327f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ASYNC_AWAIT, // The exception will be caught and cause a promise rejection 4328f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // in the desugaring of an async function, so special 4329f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // async/await handling in the debugger can take place. 4330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 4331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Getters for handler table based on ranges. 4333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int GetRangeStart(int index) const; 4334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int GetRangeEnd(int index) const; 4335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int GetRangeHandler(int index) const; 4336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int GetRangeData(int index) const; 4337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Setters for handler table based on ranges. 4339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetRangeStart(int index, int value); 4340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetRangeEnd(int index, int value); 4341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetRangeHandler(int index, int offset, CatchPrediction pred); 4342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetRangeData(int index, int value); 4343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Setters for handler table based on return addresses. 4345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetReturnOffset(int index, int value); 4346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void SetReturnHandler(int index, int offset); 4347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 434862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Lookup handler in a table based on ranges. The {pc_offset} is an offset to 434962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // the start of the potentially throwing instruction (using return addresses 435062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // for this value would be invalid). 4351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int LookupRange(int pc_offset, int* data, CatchPrediction* prediction); 4352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Lookup handler in a table based on return addresses. 4354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int LookupReturn(int pc_offset); 4355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns the number of entries in the table. 4357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int NumberOfRangeEntries() const; 4358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns the required length of the underlying fixed array. 4360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int LengthForRange(int entries) { return entries * kRangeEntrySize; } 4361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static int LengthForReturn(int entries) { return entries * kReturnEntrySize; } 4362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(HandlerTable) 4364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#ifdef ENABLE_DISASSEMBLER 4366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void HandlerTableRangePrint(std::ostream& os); // NOLINT 4367f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void HandlerTableReturnPrint(std::ostream& os); // NOLINT 4368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif 4369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 4371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Layout description for handler table based on ranges. 4372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeStartIndex = 0; 4373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeEndIndex = 1; 4374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeHandlerIndex = 2; 4375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeDataIndex = 3; 4376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kRangeEntrySize = 4; 4377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Layout description for handler table based on return addresses. 4379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kReturnOffsetIndex = 0; 4380f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kReturnHandlerIndex = 1; 4381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kReturnEntrySize = 2; 4382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4383f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Encoding of the {handler} field. 4384f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class HandlerPredictionField : public BitField<CatchPrediction, 0, 3> {}; 4385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class HandlerOffsetField : public BitField<int, 3, 29> {}; 4386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 438780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 43883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ByteArray represents fixed sized byte arrays. Used for the relocation info 43893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// that is attached to code objects. 439069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass ByteArray: public FixedArrayBase { 4391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 4392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int Size(); 43933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Setter and getter. 4395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline byte get(int index); 4396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set(int index, byte value); 4397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4398bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Copy in / copy out whole byte slices. 4399bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline void copy_out(int index, byte* buffer, int length); 4400bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline void copy_in(int index, const byte* buffer, int length); 4401bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 4402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Treat contents as an int array. 4403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int get_int(int index); 4404bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline void set_int(int index, int value); 4405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int SizeFor(int length) { 44077f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return OBJECT_POINTER_ALIGN(kHeaderSize + length); 4408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // We use byte arrays for free blocks in the heap. Given a desired size in 4410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // bytes that is a multiple of the word size and big enough to hold a byte 4411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // array, this function returns the number of elements a byte array should 4412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // have. 4413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int LengthFor(int size_in_bytes) { 4414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsAligned(size_in_bytes, kPointerSize)); 4415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(size_in_bytes >= kHeaderSize); 4416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return size_in_bytes - kHeaderSize; 4417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns data start address. 4420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Address GetDataStartAddress(); 4421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns a pointer to the ByteArray object for a given data start address. 4423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline ByteArray* FromDataStartAddress(Address address); 44243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(ByteArray) 44263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 4428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int ByteArraySize(); 4429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(ByteArray) 4430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(ByteArray) 4431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 4433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize); 4434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maximal memory consumption for a single ByteArray. 4436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxSize = 512 * MB; 4437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maximal length of a single ByteArray. 4438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxLength = kMaxSize - kHeaderSize; 44393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 44403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block private: 4441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ByteArray); 44423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 44433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4444c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// Wrapper class for ByteArray which can store arbitrary C++ classes, as long 4445c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// as they can be copied with memcpy. 4446c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochtemplate <class T> 4447c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass PodArray : public ByteArray { 4448c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 4449c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<PodArray<T>> New(Isolate* isolate, int length, 4450c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PretenureFlag pretenure = NOT_TENURED); 4451c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void copy_out(int index, T* result) { 4452c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ByteArray::copy_out(index * sizeof(T), reinterpret_cast<byte*>(result), 4453c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch sizeof(T)); 4454c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 4455c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch T get(int index) { 4456c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch T result; 4457c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch copy_out(index, &result); 4458c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return result; 4459c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 4460c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void set(int index, const T& value) { 4461c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch copy_in(index * sizeof(T), reinterpret_cast<const byte*>(&value), 4462c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch sizeof(T)); 4463c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 4464c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int length() { return ByteArray::length() / sizeof(T); } 4465c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(PodArray<T>) 4466c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 4467c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 4468c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PodArray<T>); 4469c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 44703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// BytecodeArray represents a sequence of interpreter bytecodes. 4472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass BytecodeArray : public FixedArrayBase { 44733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block public: 447462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define DECLARE_BYTECODE_AGE_ENUM(X) k##X##BytecodeAge, 447562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch enum Age { 447662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kNoAgeBytecodeAge = 0, 447762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CODE_AGE_LIST(DECLARE_BYTECODE_AGE_ENUM) kAfterLastBytecodeAge, 447862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kFirstBytecodeAge = kNoAgeBytecodeAge, 447962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kLastBytecodeAge = kAfterLastBytecodeAge - 1, 448062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kBytecodeAgeCount = kAfterLastBytecodeAge - kFirstBytecodeAge - 1, 448162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kIsOldBytecodeAge = kSexagenarianBytecodeAge 448262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 448362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef DECLARE_BYTECODE_AGE_ENUM 448462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static int SizeFor(int length) { 4486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return OBJECT_POINTER_ALIGN(kHeaderSize + length); 4487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 44883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Setter and getter 4490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline byte get(int index); 4491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set(int index, byte value); 44923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns data start address. 4494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Address GetFirstBytecodeAddress(); 44953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessors for frame size. 4497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int frame_size() const; 4498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_frame_size(int frame_size); 44993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessor for register count (derived from frame_size). 4501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int register_count() const; 45023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessors for parameter count (including implicit 'this' receiver). 4504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int parameter_count() const; 4505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_parameter_count(int number_of_parameters); 45063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4507109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Accessors for profiling count. 4508109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline int interrupt_budget() const; 4509109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline void set_interrupt_budget(int interrupt_budget); 4510109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4511f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Accessors for OSR loop nesting level. 4512f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int osr_loop_nesting_level() const; 4513f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_osr_loop_nesting_level(int depth); 4514f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 451562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Accessors for bytecode's code age. 451662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline Age bytecode_age() const; 451762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_bytecode_age(Age age); 451862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 4519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessors for the constant pool. 4520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(constant_pool, FixedArray) 45213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4522109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Accessors for handler table containing offsets of exception handlers. 4523109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(handler_table, FixedArray) 4524109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4525109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Accessors for source position table containing mappings between byte code 4526109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // offset and source position. 45273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DECL_ACCESSORS(source_position_table, ByteArray) 4528109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(BytecodeArray) 45303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 4532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int BytecodeArraySize(); 45333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4534109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline int instruction_size(); 4535109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 453613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of bytecode and its metadata. This includes the size of 453713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // bytecode, constant pool, source position table, and handler table. 453813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int SizeIncludingMetadata(); 453913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 4540109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int SourcePosition(int offset); 4541109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int SourceStatementPosition(int offset); 4542109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(BytecodeArray) 4544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(BytecodeArray) 45453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void Disassemble(std::ostream& os); 45473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4548109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void CopyBytecodesTo(BytecodeArray* to); 4549109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 455062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Bytecode aging 455162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IsOld() const; 455262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void MakeOlder(); 4553f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 4555109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kConstantPoolOffset = FixedArrayBase::kHeaderSize; 4556109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kHandlerTableOffset = kConstantPoolOffset + kPointerSize; 4557109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSourcePositionTableOffset = 4558109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch kHandlerTableOffset + kPointerSize; 4559109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kFrameSizeOffset = kSourcePositionTableOffset + kPointerSize; 4560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kParameterSizeOffset = kFrameSizeOffset + kIntSize; 4561109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kInterruptBudgetOffset = kParameterSizeOffset + kIntSize; 4562f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kOSRNestingLevelOffset = kInterruptBudgetOffset + kIntSize; 456362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kBytecodeAgeOffset = kOSRNestingLevelOffset + kCharSize; 456462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kHeaderSize = kBytecodeAgeOffset + kCharSize; 45653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maximal memory consumption for a single BytecodeArray. 4567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxSize = 512 * MB; 4568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maximal length of a single BytecodeArray. 4569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMaxLength = kMaxSize - kHeaderSize; 45703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4571f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kPointerFieldsBeginOffset = kConstantPoolOffset; 4572f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kPointerFieldsEndOffset = kFrameSizeOffset; 4573f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4574f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 4575f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kPointerFieldsEndOffset, kHeaderSize> 4576f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MarkingBodyDescriptor; 4577f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 45793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 45803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block private: 4581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(BytecodeArray); 45823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}; 45833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 45843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// FreeSpace are fixed-size free memory blocks used by the heap and GC. 4586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// They look like heap objects (are heap object tagged and have a map) so that 4587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// the heap remains iterable. They have a size and a next pointer. 4588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The next pointer is the raw address of the next FreeSpace object (or NULL) 4589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// in the free list. 4590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass FreeSpace: public HeapObject { 4591257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 4592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [size]: size of the free space including the header. 4593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int size() const; 4594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_size(int value); 4595257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int nobarrier_size() const; 4597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void nobarrier_set_size(int value); 4598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int Size(); 4600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Accessors for the next field. 4602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline FreeSpace* next(); 4603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_next(FreeSpace* next); 4604257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline static FreeSpace* cast(HeapObject* obj); 4606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 4608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(FreeSpace) 4609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(FreeSpace) 4610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 4612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Size is smi tagged when it is stored. 4613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSizeOffset = HeapObject::kHeaderSize; 4614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNextOffset = POINTER_SIZE_ALIGN(kSizeOffset + kPointerSize); 4615f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kSize = kNextOffset + kPointerSize; 4616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FreeSpace); 4619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// V has parameters (Type, type, TYPE, C type, element_size) 4623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAYS(V) \ 4624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Uint8, uint8, UINT8, uint8_t, 1) \ 4625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Int8, int8, INT8, int8_t, 1) \ 4626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Uint16, uint16, UINT16, uint16_t, 2) \ 4627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Int16, int16, INT16, int16_t, 2) \ 4628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Uint32, uint32, UINT32, uint32_t, 4) \ 4629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Int32, int32, INT32, int32_t, 4) \ 4630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Float32, float32, FLOAT32, float, 4) \ 4631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Float64, float64, FLOAT64, double, 8) \ 4632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Uint8Clamped, uint8_clamped, UINT8_CLAMPED, uint8_t, 1) 4633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FixedTypedArrayBase: public FixedArrayBase { 4636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [base_pointer]: Either points to the FixedTypedArrayBase itself or nullptr. 4638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(base_pointer, Object) 4639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [external_pointer]: Contains the offset between base_pointer and the start 4641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // of the data. If the base_pointer is a nullptr, the external_pointer 4642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // therefore points to the actual backing store. 4643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(external_pointer, void) 4644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 4646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedTypedArrayBase) 4647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBasePointerOffset = FixedArrayBase::kHeaderSize; 4649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kExternalPointerOffset = kBasePointerOffset + kPointerSize; 4650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHeaderSize = 4651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DOUBLE_POINTER_ALIGN(kExternalPointerOffset + kPointerSize); 4652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDataOffset = kHeaderSize; 4654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4655014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 4656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int size(); 4658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int TypedArraySize(InstanceType type, int length); 4660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int TypedArraySize(InstanceType type); 4661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use with care: returns raw pointer into heap. 4663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void* DataPtr(); 4664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int DataSize(); 4666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline int ElementSize(InstanceType type); 4669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int DataSize(InstanceType type); 4671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArrayBase); 4673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class Traits> 4677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass FixedTypedArray: public FixedTypedArrayBase { 4678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef typename Traits::ElementType ElementType; 4680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const InstanceType kInstanceType = Traits::kInstanceType; 4681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FixedTypedArray<Traits>) 4683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline ElementType get_scalar(int index); 4685109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static inline Handle<Object> get(FixedTypedArray* array, int index); 4686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set(int index, ElementType value); 4687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline ElementType from_int(int value); 4689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline ElementType from_double(double value); 4690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This accessor applies the correct conversion from Smi, HeapNumber 4692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and undefined. 4693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetValue(uint32_t index, Object* value); 4694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(FixedTypedArray) 4696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(FixedTypedArray) 4697257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4698257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 4699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(FixedTypedArray); 4700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 4701257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIXED_TYPED_ARRAY_TRAITS(Type, type, TYPE, elementType, size) \ 4703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Type##ArrayTraits { \ 4704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: /* NOLINT */ \ 4705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef elementType ElementType; \ 4706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const InstanceType kInstanceType = FIXED_##TYPE##_ARRAY_TYPE; \ 4707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const char* Designator() { return #type " array"; } \ 4708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> ToHandle(Isolate* isolate, \ 4709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elementType scalar); \ 4710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline elementType defaultValue(); \ 4711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; \ 4712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch \ 4713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef FixedTypedArray<Type##ArrayTraits> Fixed##Type##Array; 4714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTYPED_ARRAYS(FIXED_TYPED_ARRAY_TRAITS) 4716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIXED_TYPED_ARRAY_TRAITS 4718257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DeoptimizationInputData is a fixed array used to hold the deoptimization 4720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// data for code generated by the Hydrogen/Lithium compiler. It also 4721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contains information about functions that were inlined. If N different 4722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// functions were inlined then first N elements of the literal array will 4723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contain these functions. 4724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 4725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// It can be empty. 4726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass DeoptimizationInputData: public FixedArray { 4727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Layout description. Indices in the array. 4729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kTranslationByteArrayIndex = 0; 4730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kInlinedFunctionCountIndex = 1; 4731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kLiteralArrayIndex = 2; 4732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kOsrAstIdIndex = 3; 4733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kOsrPcOffsetIndex = 4; 4734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kOptimizationIdIndex = 5; 4735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSharedFunctionInfoIndex = 6; 4736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kWeakCellCacheIndex = 7; 4737c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kInliningPositionsIndex = 8; 4738c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kFirstDeoptEntryIndex = 9; 4739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Offsets of deopt entry elements relative to the start of the entry. 4741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAstIdRawOffset = 0; 4742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kTranslationIndexOffset = 1; 4743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kArgumentsStackHeightOffset = 2; 47442b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch static const int kPcOffset = 3; 47452b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch static const int kDeoptEntrySize = 4; 4746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Simple element accessors. 4748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECLARE_ELEMENT_ACCESSORS(name, type) \ 4749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline type* name(); \ 4750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Set##name(type* value); 4751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(TranslationByteArray, ByteArray) 4753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(InlinedFunctionCount, Smi) 4754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(LiteralArray, FixedArray) 4755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(OsrAstId, Smi) 4756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(OsrPcOffset, Smi) 4757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(OptimizationId, Smi) 4758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(SharedFunctionInfo, Object) 4759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ELEMENT_ACCESSORS(WeakCellCache, Object) 4760c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_ELEMENT_ACCESSORS(InliningPositions, PodArray<InliningPosition>) 476185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 4762014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECLARE_ELEMENT_ACCESSORS 4763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Accessors for elements of the ith deoptimization entry. 4765014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DECLARE_ENTRY_ACCESSORS(name, type) \ 4766014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline type* name(int i); \ 4767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void Set##name(int i, type* value); 4768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ENTRY_ACCESSORS(AstIdRaw, Smi) 4770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ENTRY_ACCESSORS(TranslationIndex, Smi) 4771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ENTRY_ACCESSORS(ArgumentsStackHeight, Smi) 4772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_ENTRY_ACCESSORS(Pc, Smi) 4773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DECLARE_ENTRY_ACCESSORS 4775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline BailoutId AstId(int i); 4777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetAstId(int i, BailoutId value); 4779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int DeoptCount(); 4781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4782c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNotInlinedIndex = -1; 4783c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 4784c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns the inlined function at the given position in LiteralArray, or the 4785c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // outer function if index == kNotInlinedIndex. 4786c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch class SharedFunctionInfo* GetInlinedFunction(int index); 4787c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 4788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Allocates a DeoptimizationInputData. 4789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<DeoptimizationInputData> New(Isolate* isolate, 4790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int deopt_entry_count, 4791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure); 4792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DeoptimizationInputData) 4794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 47953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#ifdef ENABLE_DISASSEMBLER 4796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void DeoptimizationInputDataPrint(std::ostream& os); // NOLINT 4797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 4798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int IndexForEntry(int i) { 4801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kFirstDeoptEntryIndex + (i * kDeoptEntrySize); 4802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int LengthFor(int entry_count) { return IndexForEntry(entry_count); } 4806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DeoptimizationOutputData is a fixed array used to hold the deoptimization 4809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// data for code generated by the full compiler. 4810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// The format of the these objects is 4811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// [i * 2]: Ast ID for ith deoptimization. 4812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// [i * 2 + 1]: PC and state of ith deoptimization 4813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass DeoptimizationOutputData: public FixedArray { 4814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int DeoptPoints(); 4816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline BailoutId AstId(int index); 4818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetAstId(int index, BailoutId id); 4820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Smi* PcAndState(int index); 4822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetPcAndState(int index, Smi* offset); 4823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int LengthOfFixedArray(int deopt_points) { 4825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return deopt_points * 2; 4826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Allocates a DeoptimizationOutputData. 4829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<DeoptimizationOutputData> New(Isolate* isolate, 4830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int number_of_deopt_points, 4831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure); 4832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DeoptimizationOutputData) 4834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4835109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#ifdef ENABLE_DISASSEMBLER 4836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void DeoptimizationOutputDataPrint(std::ostream& os); // NOLINT 4837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 4838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4840f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass TemplateList : public FixedArray { 4841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 4842f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<TemplateList> New(Isolate* isolate, int size); 4843f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline int length() const; 4844f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline Object* get(int index) const; 4845f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set(int index, Object* value); 4846f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<TemplateList> Add(Isolate* isolate, Handle<TemplateList> list, 4847f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> value); 4848f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(TemplateList) 4849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 4850f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kLengthIndex = 0; 4851f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kFirstElementIndex = kLengthIndex + 1; 4852f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(TemplateList); 4853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 4854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Code describes objects with on-the-fly generated machine code. 4856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Code: public HeapObject { 4857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 4858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Opaque data type for encapsulating code flags like kind, inline 4859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // cache state, and arguments count. 4860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef uint32_t Flags; 4861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define NON_IC_KIND_LIST(V) \ 4863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FUNCTION) \ 4864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(OPTIMIZED_FUNCTION) \ 48653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(BYTECODE_HANDLER) \ 4866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(STUB) \ 4867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HANDLER) \ 4868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BUILTIN) \ 4869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(REGEXP) \ 48703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(WASM_FUNCTION) \ 48713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(WASM_TO_JS_FUNCTION) \ 487262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(JS_TO_WASM_FUNCTION) \ 487362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(WASM_INTERPRETER_ENTRY) 4874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define IC_KIND_LIST(V) \ 4876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LOAD_IC) \ 487713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(LOAD_GLOBAL_IC) \ 4878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(KEYED_LOAD_IC) \ 4879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(STORE_IC) \ 4880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(KEYED_STORE_IC) \ 4881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BINARY_OP_IC) \ 4882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(COMPARE_IC) \ 4883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TO_BOOLEAN_IC) 4884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define CODE_KIND_LIST(V) \ 4886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NON_IC_KIND_LIST(V) \ 4887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IC_KIND_LIST(V) 4888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum Kind { 4890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DEFINE_CODE_KIND_ENUM(name) name, 4891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_KIND_LIST(DEFINE_CODE_KIND_ENUM) 4892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DEFINE_CODE_KIND_ENUM 4893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NUMBER_OF_KINDS 4894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 4895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const char* Kind2String(Kind kind); 4897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrologueOffsetNotSet = -1; 4899b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 4900c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) 4901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Printing 4902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const char* ICState2String(InlineCacheState state); 4903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void PrintExtraICState(std::ostream& os, // NOLINT 4904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind, ExtraICState extra); 4905c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#endif // defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) 4906c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 4907c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#ifdef ENABLE_DISASSEMBLER 4908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Disassemble(const char* name, std::ostream& os); // NOLINT 4909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // ENABLE_DISASSEMBLER 4910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [instruction_size]: Size of the native instructions 4912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int instruction_size() const; 4913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_instruction_size(int value); 4914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4915ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke // [relocation_info]: Code relocation information 4916ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke DECL_ACCESSORS(relocation_info, ByteArray) 4917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InvalidateRelocation(); 4918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InvalidateEmbeddedObjects(); 4919ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 49203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [handler_table]: Fixed array containing offsets of exception handlers. 49213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(handler_table, FixedArray) 49223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // [deoptimization_data]: Array containing data for deopt. 4924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DECL_ACCESSORS(deoptimization_data, FixedArray) 4925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4926f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // [source_position_table]: ByteArray for the source positions table. 4927f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_ACCESSORS(source_position_table, ByteArray) 4928f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [raw_type_feedback_info]: This field stores various things, depending on 4930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the kind of the code object. 4931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FUNCTION => type feedback information. 4932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // STUB and ICs => major/minor key as Smi. 4933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(raw_type_feedback_info, Object) 4934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* type_feedback_info(); 4935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_type_feedback_info( 4936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* value, WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 4937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint32_t stub_key(); 4938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_stub_key(uint32_t key); 4939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [next_code_link]: Link for lists of optimized or deoptimized code. 4941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note that storage for this field is overlapped with typefeedback_info. 4942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(next_code_link, Object) 49433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 49443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [gc_metadata]: Field used to hold GC related metadata. The contents of this 4945257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // field does not have to be traced during garbage collection since 4946257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // it is only used by the garbage collector itself. 49473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(gc_metadata, Object) 49483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 49493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [ic_age]: Inline caching age: the value of the Heap::global_ic_age 49503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // at the moment when this object was created. 49513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_ic_age(int count); 4952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int ic_age() const; 4953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [prologue_offset]: Offset of the function prologue, used for aging 4955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // FUNCTIONs and OPTIMIZED_FUNCTIONs. 4956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int prologue_offset() const; 4957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_prologue_offset(int offset); 49585d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 4959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [constant_pool offset]: Offset of the constant pool. 4960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Valid for FLAG_enable_embedded_constant_pool only 4961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int constant_pool_offset() const; 4962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_constant_pool_offset(int offset); 4963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 4964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Unchecked accessors to be used during GC. 4965ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke inline ByteArray* unchecked_relocation_info(); 4966ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 4967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int relocation_size(); 4968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [flags]: Various code flags. 4970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Flags flags(); 4971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_flags(Flags flags); 4972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [flags]: Access to specific code flags. 4974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Kind kind(); 4975b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch inline ExtraICState extra_ic_state(); // Only valid for IC stubs. 4976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Testers for IC stub kinds. 4978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool is_inline_cache_stub(); 4979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_debug_stub(); 4980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_handler(); 498162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool is_stub(); 4982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_binary_op_stub(); 4983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_compare_ic_stub(); 4984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_to_boolean_ic_stub(); 4985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_optimized_code(); 49863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool is_wasm_code(); 4987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsCodeStubOrIC(); 4989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_raw_kind_specific_flags1(int value); 4991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_raw_kind_specific_flags2(int value); 4992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4993109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Testers for interpreter builtins. 499413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool is_interpreter_trampoline_builtin(); 4995109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 4996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [is_crankshafted]: For kind STUB or ICs, tells whether or not a code 4997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object was generated by either the hydrogen or the TurboFan optimizing 4998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // compiler (but it may not be an optimized function). 4999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_crankshafted(); 5000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_hydrogen_stub(); // Crankshafted, but not a function. 5001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_is_crankshafted(bool value); 5002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [is_turbofanned]: For kind STUB or OPTIMIZED_FUNCTION, tells whether the 5004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // code object was generated by the TurboFan optimizing compiler. 5005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_turbofanned(); 5006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_is_turbofanned(bool value); 50073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [can_have_weak_objects]: For kind OPTIMIZED_FUNCTION, tells whether the 5009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // embedded objects in code should be treated weakly. 5010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool can_have_weak_objects(); 5011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_can_have_weak_objects(bool value); 5012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5013f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // [is_construct_stub]: For kind BUILTIN, tells whether the code object 5014f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // represents a hand-written construct stub 5015f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // (e.g., NumberConstructor_ConstructStub). 5016f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool is_construct_stub(); 5017f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_is_construct_stub(bool value); 5018f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // [has_deoptimization_support]: For FUNCTION kind, tells if it has 5020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // deoptimization support. 5021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline bool has_deoptimization_support(); 5022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_has_deoptimization_support(bool value); 5023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5024589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // [has_debug_break_slots]: For FUNCTION kind, tells if it has 5025589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // been compiled with debug break slots. 5026589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch inline bool has_debug_break_slots(); 5027589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch inline void set_has_debug_break_slots(bool value); 5028589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 5029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // [has_reloc_info_for_serialization]: For FUNCTION kind, tells if its 5030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // reloc info includes runtime and external references to support 5031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // serialization/deserialization. 5032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool has_reloc_info_for_serialization(); 5033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_has_reloc_info_for_serialization(bool value); 5034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // [allow_osr_at_loop_nesting_level]: For FUNCTION kind, tells for 5036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // how long the function has been marked for OSR and therefore which 5037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // level of loop nesting we are willing to do on-stack replacement 5038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // for. 5039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_allow_osr_at_loop_nesting_level(int level); 5040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline int allow_osr_at_loop_nesting_level(); 5041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 50428f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch // [profiler_ticks]: For FUNCTION kind, tells for how many profiler ticks 50438f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch // the code object was seen on the stack with no IC patching going on. 50448f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline int profiler_ticks(); 50458f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline void set_profiler_ticks(int ticks); 50468f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 5047f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // [builtin_index]: For builtins, tells which builtin index the code object 5048f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // has. Note that builtins can have a code kind other than BUILTIN. The 5049f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // builtin index is a non-negative integer for builtins, and -1 otherwise. 5050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int builtin_index(); 5051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_builtin_index(int id); 5052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // [stack_slots]: For kind OPTIMIZED_FUNCTION, the number of stack slots 5054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // reserved in the code prologue. 5055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline unsigned stack_slots(); 5056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_stack_slots(unsigned slots); 5057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [safepoint_table_start]: For kind OPTIMIZED_FUNCTION, the offset in 5059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the instruction stream where the safepoint table starts. 50601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block inline unsigned safepoint_table_offset(); 50611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block inline void set_safepoint_table_offset(unsigned offset); 5062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [back_edge_table_start]: For kind FUNCTION, the offset in the 5064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // instruction stream where the back edge table starts. 5065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline unsigned back_edge_table_offset(); 5066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_back_edge_table_offset(unsigned offset); 5067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool back_edges_patched_for_osr(); 5069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 507069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // [to_boolean_foo]: For kind TO_BOOLEAN_IC tells what state the stub is in. 5071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint16_t to_boolean_state(); 5072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [marked_for_deoptimization]: For kind OPTIMIZED_FUNCTION tells whether 5074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the code is going to be deoptimized because of dead embedded maps. 5075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool marked_for_deoptimization(); 5076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_marked_for_deoptimization(bool flag); 5077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 507862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // [is_promise_rejection]: For kind BUILTIN tells whether the exception 507962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // thrown by the code will lead to promise rejection. 508062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool is_promise_rejection(); 508162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_is_promise_rejection(bool flag); 508262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 508362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // [is_exception_caught]: For kind BUILTIN tells whether the exception 508462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // thrown by the code will be caught internally. 508562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool is_exception_caught(); 508662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_is_exception_caught(bool flag); 508762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [constant_pool]: The constant pool for this function. 5089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Address constant_pool(); 5090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5091b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Get the safepoint entry for the given pc. 5092b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch SafepointEntry GetSafepointEntry(Address pc); 5093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find an object in a stub with a specified map 5095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* FindNthObject(int n, Map* match_map); 5096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find the first allocation site in an IC stub. 5098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSite* FindFirstAllocationSite(); 5099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Find the first map in an IC stub. 5101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Map* FindFirstMap(); 51023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For each (map-to-find, object-to-replace) pair in the pattern, this 5104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // function replaces the corresponding placeholder in the code with the 5105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object-to-replace. The function assumes that pairs in the pattern come in 5106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the same order as the placeholders in the code. 5107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the placeholder is a weak cell, then the value of weak cell is matched 5108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // against the map-to-find. 5109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void FindAndReplace(const FindAndReplacePattern& pattern); 5110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The entire code object including its header is copied verbatim to the 5112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // snapshot so that it can be written in one, fast, memcpy during 5113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deserialization. The deserializer will overwrite some pointers, rather 5114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // like a runtime linker, but the random allocation addresses used in the 5115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // mksnapshot process would still be present in the unlinked snapshot data, 5116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // which would make snapshot production non-reproducible. This method wipes 5117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // out the to-be-overwritten header data for reproducible snapshots. 5118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void WipeOutHeader(); 51193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Flags operations. 5121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static inline Flags ComputeFlags( 5122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind, ExtraICState extra_ic_state = kNoExtraICState, 5123bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch CacheHolderFlag holder = kCacheOnReceiver); 5124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Flags ComputeHandlerFlags( 5126bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Kind handler_kind, CacheHolderFlag holder = kCacheOnReceiver); 5127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline CacheHolderFlag ExtractCacheHolderFromFlags(Flags flags); 5129589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static inline Kind ExtractKindFromFlags(Flags flags); 5130589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags); 5131589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 5132bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static inline Flags RemoveHolderFromFlags(Flags flags); 5133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Convert a target address into a code object. 5135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline Code* GetCodeFromTargetAddress(Address address); 5136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5137791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // Convert an entry address into an object. 5138791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block static inline Object* GetObjectFromEntryAddress(Address location_of_address); 5139791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 5140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the address of the first instruction. 5141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline byte* instruction_start(); 5142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5143ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke // Returns the address right after the last instruction. 5144ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke inline byte* instruction_end(); 5145ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 514613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of the instructions, padding, relocation and unwinding 514713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // information. 5148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int body_size(); 5149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 515013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of code and its metadata. This includes the size of code 515113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // relocation information, deoptimization data and handler table. 515213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int SizeIncludingMetadata(); 515313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the address of the first relocation info (read backwards!). 5155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline byte* relocation_start(); 5156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 515713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [has_unwinding_info]: Whether this code object has unwinding information. 515813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // If it doesn't, unwinding_information_start() will point to invalid data. 515913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 516013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // The body of all code objects has the following layout. 516113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 516213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- instruction_start() 516313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | instructions | 516413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | ... | 516513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ 516613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | relocation info | 516713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | ... | 516813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- instruction_end() 516913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 517013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // If has_unwinding_info() is false, instruction_end() points to the first 517113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // memory location after the end of the code object. Otherwise, the body 517213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // continues as follows: 517313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 517413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ 517513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | padding to the next | 517613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | 8-byte aligned address | 517713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- instruction_end() 517813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | [unwinding_info_size] | 517913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | as uint64_t | 518013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- unwinding_info_start() 518113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | unwinding info | 518213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // | ... | 518313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // +--------------------------+ <-- unwinding_info_end() 518413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 518513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // and unwinding_info_end() points to the first memory location after the end 518613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // of the code object. 518713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // 518813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_BOOLEAN_ACCESSORS(has_unwinding_info) 518913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 519013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [unwinding_info_size]: Size of the unwinding information. 519113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int unwinding_info_size() const; 519213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline void set_unwinding_info_size(int value); 519313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 519413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the address of the unwinding information, if any. 519513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline byte* unwinding_info_start(); 519613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 519713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the address right after the end of the unwinding information. 519813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline byte* unwinding_info_end(); 519913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code entry point. 5201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline byte* entry(); 5202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns true if pc is inside this object's instructions. 5204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool contains(byte* pc); 5205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Relocate the code by delta bytes. Called to signal that this code 5207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // object has been moved by delta bytes. 5208d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block void Relocate(intptr_t delta); 5209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Migrate code described by desc. 5211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void CopyFrom(const CodeDesc& desc); 5212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 52133bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch // Returns the object size for a given body (used for allocation). 52143bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch static int SizeFor(int body_size) { 5215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_SIZE_TAG_ALIGNED(body_size); 52163bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch return RoundUp(kHeaderSize + body_size, kCodeAlignment); 5217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 5218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Calculate the size of the code object to report for log events. This takes 5220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the layout of the code object into account. 5221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int ExecutableSize(); 5222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Code) 5224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 5226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int CodeSize(); 5227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Code) 5229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Code) 5230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 52318f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch void ClearInlineCaches(); 5232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset); 5234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t TranslateAstIdToPcOffset(BailoutId ast_id); 5235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge, 5237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Age { 5238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kToBeExecutedOnceCodeAge = -3, 5239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNotExecutedCodeAge = -2, 5240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kExecutedOnceCodeAge = -1, 5241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNoAgeCodeAge = 0, 5242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CODE_AGE_LIST(DECLARE_CODE_AGE_ENUM) 5243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAfterLastCodeAge, 5244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kFirstCodeAge = kToBeExecutedOnceCodeAge, 5245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLastCodeAge = kAfterLastCodeAge - 1, 5246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kCodeAgeCount = kAfterLastCodeAge - kFirstCodeAge - 1, 5247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsOldCodeAge = kSexagenarianCodeAge, 5248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPreAgedCodeAge = kIsOldCodeAge - 1 5249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 5250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_CODE_AGE_ENUM 5251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Code aging. Indicates how many full GCs this code has survived without 5253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // being entered through the prologue. Used to determine when it is 5254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // relatively safe to flush this code object and replace it with the lazy 5255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // compilation stub. 5256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate); 5257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void MarkCodeAsExecuted(byte* sequence, Isolate* isolate); 5258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void MakeYoung(Isolate* isolate); 52593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void PreAge(Isolate* isolate); 5260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void MarkToBeExecutedOnce(Isolate* isolate); 526162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void MakeOlder(); 5262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool IsYoungSequence(Isolate* isolate, byte* sequence); 5263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsOld(); 5264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Age GetAge(); 5265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Code* GetPreAgedCodeAgeStub(Isolate* isolate) { 526662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return GetCodeAgeStub(isolate, kNotExecutedCodeAge); 5267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDeoptLocation(FILE* out, Address pc); 5270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanDeoptAt(Address pc); 5271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 5273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void VerifyEmbeddedObjectsDependency(); 5274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 5275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef DEBUG 5277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum VerifyMode { kNoContextSpecificPointers, kNoContextRetainingPointers }; 5278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void VerifyEmbeddedObjects(VerifyMode mode = kNoContextRetainingPointers); 5279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void VerifyRecompiledCode(Code* old_code, Code* new_code); 5280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif // DEBUG 5281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool CanContainWeakObjects(); 5283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsWeakObject(Object* object); 5285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsWeakObjectInOptimizedCode(Object* object); 5287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<WeakCell> WeakCellFor(Handle<Code> code); 5289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCell* CachedWeakCell(); 5290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kConstantPoolSize = 5292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FLAG_enable_embedded_constant_pool ? kIntSize : 0; 5293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 5295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kRelocationInfoOffset = HeapObject::kHeaderSize; 52963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize; 5297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kDeoptimizationDataOffset = 52983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kHandlerTableOffset + kPointerSize; 5299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kSourcePositionTableOffset = 5300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kDeoptimizationDataOffset + kPointerSize; 5301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For FUNCTION kind, we store the type feedback info here. 53023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kTypeFeedbackInfoOffset = 5303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSourcePositionTableOffset + kPointerSize; 5304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNextCodeLinkOffset = kTypeFeedbackInfoOffset + kPointerSize; 5305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kGCMetadataOffset = kNextCodeLinkOffset + kPointerSize; 5306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kInstructionSizeOffset = kGCMetadataOffset + kPointerSize; 5307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kICAgeOffset = kInstructionSizeOffset + kIntSize; 53083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kFlagsOffset = kICAgeOffset + kIntSize; 5309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kKindSpecificFlags1Offset = kFlagsOffset + kIntSize; 5310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kKindSpecificFlags2Offset = 5311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kKindSpecificFlags1Offset + kIntSize; 5312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note: We might be able to squeeze this into the flags above. 5313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrologueOffset = kKindSpecificFlags2Offset + kIntSize; 5314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kConstantPoolOffset = kPrologueOffset + kIntSize; 53153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kBuiltinIndexOffset = 5316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kConstantPoolOffset + kConstantPoolSize; 53173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kHeaderPaddingStart = kBuiltinIndexOffset + kIntSize; 5318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 531962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch enum TrapFields { kTrapCodeOffset, kTrapLandingOffset, kTrapDataSize }; 532062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 532162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Add padding to align the instruction start following right after 5323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the Code object header. 5324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHeaderSize = 5325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch (kHeaderPaddingStart + kCodeAlignmentMask) & ~kCodeAlignmentMask; 5326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 532713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int GetUnwindingInfoSizeOffset() const; 532813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 5330589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 5331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Byte offsets within kKindSpecificFlags1Offset. 5332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFullCodeFlags = kKindSpecificFlags1Offset; 5333589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch class FullCodeFlagsHasDeoptimizationSupportField: 5334589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch public BitField<bool, 0, 1> {}; // NOLINT 5335589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {}; 5336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier class FullCodeFlagsHasRelocInfoForSerialization 5337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, 2, 1> {}; 5338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Bit 3 in this bitfield is unused. 5339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class ProfilerTicksField : public BitField<int, 4, 28> {}; 5340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5341589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // Flags layout. BitField<type, shift, size>. 5342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class HasUnwindingInfoField : public BitField<bool, 0, 1> {}; 534313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch class CacheHolderField 534413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch : public BitField<CacheHolderFlag, HasUnwindingInfoField::kNext, 2> {}; 534513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch class KindField : public BitField<Kind, CacheHolderField::kNext, 5> {}; 534613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch STATIC_ASSERT(NUMBER_OF_KINDS <= KindField::kMax); 5347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class ExtraICStateField 5348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : public BitField<ExtraICState, KindField::kNext, 5349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PlatformSmiTagging::kSmiValueSize - KindField::kNext> { 5350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 5351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 53523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // KindSpecificFlags1 layout (STUB, BUILTIN and OPTIMIZED_FUNCTION) 5353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStackSlotsFirstBit = 0; 5354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStackSlotsBitCount = 24; 5355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kMarkedForDeoptimizationBit = 5356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStackSlotsFirstBit + kStackSlotsBitCount; 5357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kIsTurbofannedBit = kMarkedForDeoptimizationBit + 1; 5358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kCanHaveWeakObjects = kIsTurbofannedBit + 1; 5359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Could be moved to overlap previous bits when we need more space. 5360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kIsConstructStub = kCanHaveWeakObjects + 1; 536162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kIsPromiseRejection = kIsConstructStub + 1; 536262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kIsExceptionCaught = kIsPromiseRejection + 1; 5363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32); 536562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch STATIC_ASSERT(kIsExceptionCaught + 1 <= 32); 5366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class StackSlotsField: public BitField<int, 5368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStackSlotsFirstBit, kStackSlotsBitCount> {}; // NOLINT 5369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class MarkedForDeoptimizationField 5370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, kMarkedForDeoptimizationBit, 1> {}; // NOLINT 5371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsTurbofannedField : public BitField<bool, kIsTurbofannedBit, 1> { 5372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; // NOLINT 5373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class CanHaveWeakObjectsField 5374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public BitField<bool, kCanHaveWeakObjects, 1> {}; // NOLINT 5375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class IsConstructStubField : public BitField<bool, kIsConstructStub, 1> { 5376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; // NOLINT 537762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch class IsPromiseRejectionField 537862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : public BitField<bool, kIsPromiseRejection, 1> {}; // NOLINT 537962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch class IsExceptionCaughtField : public BitField<bool, kIsExceptionCaught, 1> { 538062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; // NOLINT 5381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // KindSpecificFlags2 layout (ALL) 5383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIsCrankshaftedBit = 0; 5384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsCrankshaftedField: public BitField<bool, 5385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsCrankshaftedBit, 1> {}; // NOLINT 5386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // KindSpecificFlags2 layout (STUB and OPTIMIZED_FUNCTION) 5388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSafepointTableOffsetFirstBit = kIsCrankshaftedBit + 1; 5389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSafepointTableOffsetBitCount = 30; 5390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kSafepointTableOffsetFirstBit + 5392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSafepointTableOffsetBitCount <= 32); 5393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(1 + kSafepointTableOffsetBitCount <= 32); 5394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class SafepointTableOffsetField: public BitField<int, 5396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSafepointTableOffsetFirstBit, 5397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSafepointTableOffsetBitCount> {}; // NOLINT 5398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // KindSpecificFlags2 layout (FUNCTION) 5400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class BackEdgeTableOffsetField: public BitField<int, 5401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsCrankshaftedBit + 1, 27> {}; // NOLINT 5402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class AllowOSRAtLoopNestingLevelField: public BitField<int, 5403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsCrankshaftedBit + 1 + 27, 4> {}; // NOLINT 5404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kArgumentsBits = 16; 5406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxArguments = (1 << kArgumentsBits) - 1; 5407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 54083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // This constant should be encodable in an ARM instruction. 5409bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kFlagsNotUsedInLookup = CacheHolderField::kMask; 5410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 5412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class RelocIterator; 5413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Deoptimizer; // For FindCodeAgeSequence. 5414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Code aging 5416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch byte* FindCodeAgeSequence(); 541762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Age GetCodeAge(Isolate* isolate, byte* sequence); 541862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Age GetAgeOfCodeAgeStub(Code* code); 541962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Code* GetCodeAgeStub(Isolate* isolate, Age age); 5420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Code aging -- platform-specific 542262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void PatchPlatformCodeAge(Isolate* isolate, byte* sequence, Age age); 5423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Code); 5425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 5426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5427109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass AbstractCode : public HeapObject { 5428109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public: 54293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // All code kinds and INTERPRETED_FUNCTION. 54303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch enum Kind { 54313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define DEFINE_CODE_KIND_ENUM(name) name, 54323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch CODE_KIND_LIST(DEFINE_CODE_KIND_ENUM) 54333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef DEFINE_CODE_KIND_ENUM 54343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch INTERPRETED_FUNCTION, 543513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch NUMBER_OF_KINDS 54363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch }; 54373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 543813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const char* Kind2String(Kind kind); 543913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 5440109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int SourcePosition(int offset); 5441109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int SourceStatementPosition(int offset); 5442109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 54433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns the address of the first instruction. 54443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Address instruction_start(); 54453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 54463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns the address right after the last instruction. 54473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Address instruction_end(); 54483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 544913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of the code instructions. 54503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline int instruction_size(); 54513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5452f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Return the source position table. 5453f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline ByteArray* source_position_table(); 5454f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5455f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Set the source position table. 5456f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_source_position_table(ByteArray* source_position_table); 5457f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 545813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns the size of instructions and the metadata. 545913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int SizeIncludingMetadata(); 546013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 54613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns true if pc is inside this object's instructions. 54623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool contains(byte* pc); 54633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 54643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Returns the AbstractCode::Kind of the code. 54653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline Kind kind(); 54663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 54673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Calculate the size of the code object to report for log events. This takes 54683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // the layout of the code object into account. 54693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline int ExecutableSize(); 54703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5471109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECLARE_CAST(AbstractCode) 5472109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline Code* GetCode(); 5473109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline BytecodeArray* GetBytecodeArray(); 5474f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 5475f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Max loop nesting marker used to postpose OSR. We don't take loop 5476f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // nesting that is deeper than 5 levels into account. 5477f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kMaxLoopNestingMarker = 6; 5478f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(Code::AllowOSRAtLoopNestingLevelField::kMax >= 5479f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kMaxLoopNestingMarker); 5480109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}; 5481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Dependent code is a singly linked list of fixed arrays. Each array contains 5483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// code objects in weak cells for one dependent group. The suffix of the array 5484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// can be filled with the undefined value if the number of codes is less than 5485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// the length of the array. 5486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 5487014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// +------+-----------------+--------+--------+-----+--------+-----------+-----+ 5488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// | next | count & group 1 | code 1 | code 2 | ... | code n | undefined | ... | 5489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// +------+-----------------+--------+--------+-----+--------+-----------+-----+ 5490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// | 5491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// V 5492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// +------+-----------------+--------+--------+-----+--------+-----------+-----+ 5493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// | next | count & group 2 | code 1 | code 2 | ... | code m | undefined | ... | 5494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// +------+-----------------+--------+--------+-----+--------+-----------+-----+ 5495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// | 5496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// V 5497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// empty_fixed_array() 5498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 5499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The list of fixed arrays is ordered by dependency groups. 5500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DependentCode: public FixedArray { 5502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum DependencyGroup { 5504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that weakly embed this map and depend on being 5505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deoptimized when the map is garbage collected. 5506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kWeakCodeGroup, 5507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that embed a transition to this map, and depend on being 5508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deoptimized when the transition is replaced by a new version. 5509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTransitionGroup, 5510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that omit run-time prototype checks for prototypes 5511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // described by this map. The group is deoptimized whenever an object 5512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // described by this map changes shape (and transitions to a new map), 5513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // possibly invalidating the assumptions embedded in the code. 5514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPrototypeCheckGroup, 5515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that depends on global property values in property cells 5516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // not being changed. 5517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPropertyCellChangedGroup, 5518c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Group of code that omit run-time checks for field(s) introduced by 5519c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // this map, i.e. for the field type. 5520c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kFieldOwnerGroup, 5521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that omit run-time type checks for initial maps of 5522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // constructors. 5523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInitialMapChangedGroup, 5524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that depends on tenuring information in AllocationSites 5525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // not being changed. 5526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAllocationSiteTenuringChangedGroup, 5527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Group of code that depends on element transition information in 5528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // AllocationSites not being changed. 5529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAllocationSiteTransitionChangedGroup 5530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 5531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kGroupCount = kAllocationSiteTransitionChangedGroup + 1; 5533f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kNextLinkIndex = 0; 5534f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kFlagsIndex = 1; 5535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kCodesStartIndex = 2; 5536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Contains(DependencyGroup group, WeakCell* code_cell); 5538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsEmpty(DependencyGroup group); 5539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> InsertCompilationDependencies( 5541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<DependentCode> entries, DependencyGroup group, 5542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Foreign> info); 5543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> InsertWeakCode(Handle<DependentCode> entries, 5545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DependencyGroup group, 5546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<WeakCell> code_cell); 5547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateToFinishedCode(DependencyGroup group, Foreign* info, 5549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCell* code_cell); 5550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveCompilationDependencies(DependentCode::DependencyGroup group, 5552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Foreign* info); 5553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void DeoptimizeDependentCodeGroup(Isolate* isolate, 5555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DependentCode::DependencyGroup group); 5556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MarkCodeForDeoptimization(Isolate* isolate, 5558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DependentCode::DependencyGroup group); 5559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The following low-level accessors should only be used by this class 5561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and the mark compact collector. 5562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline DependentCode* next_link(); 5563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_next_link(DependentCode* next); 5564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int count(); 5565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_count(int value); 5566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline DependencyGroup group(); 5567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_group(DependencyGroup group); 5568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* object_at(int i); 5569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_object_at(int i, Object* object); 5570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void clear_at(int i); 5571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void copy(int from, int to); 5572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DependentCode) 5573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const char* DependencyGroupName(DependencyGroup group); 5575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetMarkedForDeoptimization(Code* code, DependencyGroup group); 5576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> Insert(Handle<DependentCode> entries, 5579014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DependencyGroup group, 5580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> object); 5581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> New(DependencyGroup group, Handle<Object> object, 5582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<DependentCode> next); 5583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<DependentCode> EnsureSpace(Handle<DependentCode> entries); 5584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Compact by removing cleared weak cells and return true if there was 5585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // any cleared weak cell. 5586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Compact(); 5587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static int Grow(int number_of_entries) { 5588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (number_of_entries < 5) return number_of_entries + 1; 5589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return number_of_entries * 5 / 4; 5590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 5591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int flags(); 5592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_flags(int flags); 5593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class GroupField : public BitField<int, 0, 3> {}; 5594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class CountField : public BitField<int, 3, 27> {}; 5595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kGroupCount <= GroupField::kMax + 1); 5596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 5597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PrototypeInfo; 5600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All heap objects have a Map that describes their structure. 5603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A Map contains information about: 5604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - Size information about the object 5605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - How to iterate over an object (for garbage collection) 5606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Map: public HeapObject { 5607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 5608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Instance size. 5609791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // Size in bytes or kVariableSizeSentinel if instances do not have 5610791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // a fixed size. 5611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int instance_size(); 5612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_instance_size(int value); 5613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Only to clear an unused byte, remove once byte is used. 5615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_unused(); 5616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [inobject_properties_or_constructor_function_index]: Provides access 5618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to the inobject properties in case of JSObject maps, or the constructor 5619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // function index in case of primitive maps. 5620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int inobject_properties_or_constructor_function_index(); 5621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_inobject_properties_or_constructor_function_index(int value); 5622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Count of properties allocated in the object (JSObject only). 5623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int GetInObjectProperties(); 5624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetInObjectProperties(int value); 5625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Index of the constructor function in the native context (primitives only), 5626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or the special sentinel value to indicate that there is no object wrapper 5627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // for the primitive (i.e. in case of null or undefined). 5628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNoConstructorFunctionIndex = 0; 5629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int GetConstructorFunctionIndex(); 5630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetConstructorFunctionIndex(int value); 5631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<JSFunction> GetConstructorFunction( 5632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map, Handle<Context> native_context); 5633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 56343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Retrieve interceptors. 56353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline InterceptorInfo* GetNamedInterceptor(); 56363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline InterceptorInfo* GetIndexedInterceptor(); 56373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 5638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Instance type. 5639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline InstanceType instance_type(); 5640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_instance_type(InstanceType value); 5641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tells how many unused property fields are available in the 5643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instance (only used for JSObject in fast mode). 5644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int unused_property_fields(); 5645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_unused_property_fields(int value); 5646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit field. 5648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline byte bit_field() const; 5649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_bit_field(byte value); 5650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit field 2. 5652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline byte bit_field2() const; 5653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_bit_field2(byte value); 5654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5655257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Bit field 3. 5656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t bit_field3() const; 5657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_bit_field3(uint32_t bits); 5658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class EnumLengthBits: public BitField<int, 5660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 0, kDescriptorIndexBitCount> {}; // NOLINT 5661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class NumberOfOwnDescriptorsBits: public BitField<int, 5662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDescriptorIndexBitCount, kDescriptorIndexBitCount> {}; // NOLINT 5663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kDescriptorIndexBitCount + kDescriptorIndexBitCount == 20); 5664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DictionaryMap : public BitField<bool, 20, 1> {}; 5665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OwnsDescriptors : public BitField<bool, 21, 1> {}; 5666109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch class HasHiddenPrototype : public BitField<bool, 22, 1> {}; 5667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Deprecated : public BitField<bool, 23, 1> {}; 5668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier class IsUnstable : public BitField<bool, 24, 1> {}; 5669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier class IsMigrationTarget : public BitField<bool, 25, 1> {}; 5670f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class ImmutablePrototype : public BitField<bool, 26, 1> {}; 5671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class NewTargetIsBase : public BitField<bool, 27, 1> {}; 5672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Bit 28 is free. 5673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Keep this bit field at the very end for better code in 5675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Builtins::kJSConstructStubGeneric stub. 5676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This counter is used for in-object slack tracking. 5677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // The in-object slack tracking is considered enabled when the counter is 5678109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // non zero. The counter only has a valid count for initial maps. For 5679109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // transitioned maps only kNoSlackTracking has a meaning, namely that inobject 5680109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // slack tracking already finished for the transition tree. Any other value 5681109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // indicates that either inobject slack tracking is still in progress, or that 5682109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // the map isn't part of the transition tree anymore. 5683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class ConstructionCounter : public BitField<int, 29, 3> {}; 5684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSlackTrackingCounterStart = 7; 5685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSlackTrackingCounterEnd = 1; 5686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNoSlackTracking = 0; 5687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kSlackTrackingCounterStart <= ConstructionCounter::kMax); 5688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Inobject slack tracking is the way to reclaim unused inobject space. 5691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 5692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The instance size is initially determined by adding some slack to 5693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // expected_nof_properties (to allow for a few extra properties added 5694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // after the constructor). There is no guarantee that the extra space 5695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // will not be wasted. 5696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 5697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Here is the algorithm to reclaim the unused inobject space: 5698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - Detect the first constructor call for this JSFunction. 5699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // When it happens enter the "in progress" state: initialize construction 5700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // counter in the initial_map. 5701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - While the tracking is in progress initialize unused properties of a new 5702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // object with one_pointer_filler_map instead of undefined_value (the "used" 5703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // part is initialized with undefined_value as usual). This way they can 5704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // be resized quickly and safely. 5705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - Once enough objects have been created compute the 'slack' 5706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // (traverse the map transition tree starting from the 5707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // initial_map and find the lowest value of unused_property_fields). 5708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - Traverse the transition tree again and decrease the instance size 5709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // of every map. Existing objects will resize automatically (they are 5710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // filled with one_pointer_filler_map). All further allocations will 5711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // use the adjusted instance size. 5712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - SharedFunctionInfo's expected_nof_properties left unmodified since 5713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // allocations made using different closures could actually create different 5714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // kind of objects (see prototype inheritance pattern). 5715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 5716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Important: inobject slack tracking is not attempted during the snapshot 5717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // creation. 5718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kGenerousAllocationCount = 5720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSlackTrackingCounterStart - kSlackTrackingCounterEnd + 1; 5721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Starts the tracking by initializing object constructions countdown counter. 5723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void StartInobjectSlackTracking(); 5724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // True if the object constructions countdown counter is a range 5726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [kSlackTrackingCounterEnd, kSlackTrackingCounterStart]. 5727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsInobjectSlackTrackingInProgress(); 5728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Does the tracking step. 5730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void InobjectSlackTrackingStep(); 5731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Completes inobject slack tracking for the transition tree starting at this 5733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // initial map. 5734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CompleteInobjectSlackTracking(); 5735257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tells whether the object in the prototype property will be used 5737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // for instances created from this function. If the prototype 5738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // property is set to a value that is not a JSObject, the prototype 5739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // property will not be used to create instances of the function. 5740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // See ECMA-262, 13.2.2. 5741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_non_instance_prototype(bool value); 5742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_non_instance_prototype(); 5743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tells whether the instance has a [[Construct]] internal method. 5745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This property is implemented according to ES6, section 7.2.4. 5746109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline void set_is_constructor(bool value); 5747014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_constructor() const; 57486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 5749109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Tells whether the instance with this map has a hidden prototype. 5750109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline void set_has_hidden_prototype(bool value); 5751109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool has_hidden_prototype() const; 5752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Records and queries whether the instance has a named interceptor. 5754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_has_named_interceptor(); 5755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_named_interceptor(); 5756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Records and queries whether the instance has an indexed interceptor. 5758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_has_indexed_interceptor(); 5759014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_indexed_interceptor(); 5760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tells whether the instance is undetectable. 5762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // An undetectable object is a special class of JSObject: 'typeof' operator 5763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // returns undefined, ToBoolean returns false. Otherwise it behaves like 5764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // a normal JS object. It is useful for implementing undetectable 5765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // document.all in Firefox & Safari. 5766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // See https://bugzilla.mozilla.org/show_bug.cgi?id=248549. 5767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_is_undetectable(); 5768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_undetectable(); 5769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5770014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tells whether the instance has a [[Call]] internal method. 5771014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // This property is implemented according to ES6, section 7.2.3. 5772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_is_callable(); 5773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_callable() const; 5774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_new_target_is_base(bool value); 5776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool new_target_is_base(); 57778defd9ff6930b4e24729971a61cf7469daf119beSteve Block inline void set_is_extensible(bool value); 57788defd9ff6930b4e24729971a61cf7469daf119beSteve Block inline bool is_extensible(); 5779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_is_prototype_map(bool value); 5780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_prototype_map() const; 5781e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 5782014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_elements_kind(ElementsKind elements_kind); 5783014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ElementsKind elements_kind(); 57843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 57853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Tells whether the instance has fast elements that are only Smis. 5786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_smi_elements(); 57873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 57883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Tells whether the instance has fast elements. 5789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_object_elements(); 5790014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_smi_or_object_elements(); 5791014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_double_elements(); 5792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fast_elements(); 5793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_sloppy_arguments_elements(); 579413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool has_fast_sloppy_arguments_elements(); 5795109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool has_fast_string_wrapper_elements(); 5796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_fixed_typed_array_elements(); 5797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_dictionary_elements(); 57983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 57993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static bool IsValidElementsTransition(ElementsKind from_kind, 58003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind to_kind); 58013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if the current map doesn't have DICTIONARY_ELEMENTS but if a 5803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // map with DICTIONARY_ELEMENTS was found in the prototype chain. 5804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool DictionaryElementsInPrototypeChainOnly(); 58050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 5806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Map* ElementsTransitionMap(); 58070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 5808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline FixedArrayBase* GetInitialElements(); 58090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 5810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [raw_transitions]: Provides access to the transitions storage field. 5811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Don't call set_raw_transitions() directly to overwrite transitions, use 5812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the TransitionArray::ReplaceTransitions() wrapper instead! 5813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(raw_transitions, Object) 5814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [prototype_info]: Per-prototype metadata. Aliased with transitions 5815014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // (which prototype maps don't have). 5816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(prototype_info, Object) 5817014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // PrototypeInfo is created lazily using this helper (which installs it on 5818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the given prototype's map). 5819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<PrototypeInfo> GetOrCreatePrototypeInfo( 5820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> prototype, Isolate* isolate); 5821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<PrototypeInfo> GetOrCreatePrototypeInfo( 5822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> prototype_map, Isolate* isolate); 582313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool should_be_fast_prototype_map() const; 582413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static void SetShouldBeFastPrototypeMap(Handle<Map> map, bool value, 582513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* isolate); 5826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [prototype chain validity cell]: Associated with a prototype object, 5828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // stored in that object's map's PrototypeInfo, indicates that prototype 5829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // chains through this object are currently valid. The cell will be 5830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // invalidated and replaced when the prototype chain changes. 5831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Cell> GetOrCreatePrototypeChainValidityCell(Handle<Map> map, 5832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate); 5833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPrototypeChainValid = 0; 5834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPrototypeChainInvalid = 1; 5835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5836c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Return the map of the root of object's prototype chain. 5837c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Map* GetPrototypeChainRootMap(Isolate* isolate); 5838c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 5839c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Returns a WeakCell object containing given prototype. The cell is cached 5840c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // in PrototypeInfo which is created lazily. 5841c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<WeakCell> GetOrCreatePrototypeWeakCell( 5842c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSObject> prototype, Isolate* isolate); 5843c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 5844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map* FindRootMap(); 5845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map* FindFieldOwner(int descriptor); 5846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int GetInObjectPropertyOffset(int index); 5848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfFields(); 5850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 585162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Returns true if transition to the given map requires special 585262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // synchronization with the concurrent marker. 585362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool TransitionRequiresSynchronizationWithGC(Map* target); 585462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Returns true if transition to the given map removes a tagged in-object 585562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // field. 585662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool TransitionRemovesTaggedField(Map* target); 585762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Returns true if transition to the given map replaces a tagged in-object 585862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // field with an untagged in-object field. 585962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool TransitionChangesTaggedFieldToUntaggedField(Map* target); 586062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(ishell): candidate with JSObject::MigrateToMap(). 5862bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool InstancesNeedRewriting(Map* target); 5863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool InstancesNeedRewriting(Map* target, int target_number_of_fields, 5864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int target_inobject, int target_unused, 5865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* old_number_of_fields); 5866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(ishell): moveit! 586762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<Map> GeneralizeAllFields(Handle<Map> map); 5868109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MUST_USE_RESULT static Handle<FieldType> GeneralizeFieldType( 5869109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Representation rep1, Handle<FieldType> type1, Representation rep2, 5870109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<FieldType> type2, Isolate* isolate); 587162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static void GeneralizeField(Handle<Map> map, int modify_index, 587262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyConstness new_constness, 587362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Representation new_representation, 587462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FieldType> new_field_type); 5875bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 587662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<Map> ReconfigureProperty(Handle<Map> map, int modify_index, 587762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyKind new_kind, 587862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyAttributes new_attributes, 587962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Representation new_representation, 588062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FieldType> new_field_type); 5881bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 588262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<Map> ReconfigureElementsKind(Handle<Map> map, 588362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ElementsKind new_elements_kind); 5884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> PrepareForDataProperty(Handle<Map> old_map, 5886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int descriptor_number, 588762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyConstness constness, 5888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 5889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<Map> Normalize(Handle<Map> map, PropertyNormalizationMode mode, 5891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* reason); 5892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tells whether the map is used for JSObjects in dictionary mode (ie 5894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // normalized objects, ie objects for which HasFastProperties returns false). 5895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A map can never be used for both dictionary mode and fast mode JSObjects. 5896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // False by default and for HeapObjects that are not JSObjects. 5897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_dictionary_map(bool value); 5898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_dictionary_map(); 58990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 5900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Tells whether the instance needs security checks when accessing its 5901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // properties. 5902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_is_access_check_needed(bool access_check_needed); 5903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool is_access_check_needed(); 5904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if map has a non-empty stub code cache. 5906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool has_code_cache(); 5907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [prototype]: implicit prototype object. 5909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(prototype, Object) 5910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // TODO(jkummerow): make set_prototype private. 5911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetPrototype( 5912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map, Handle<Object> prototype, 5913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrototypeOptimizationMode proto_mode = FAST_PROTOTYPE); 5914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [constructor]: points back to the function responsible for this map. 5916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The field overlaps with the back pointer. All maps in a transition tree 5917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // have the same constructor, so maps with back pointers can walk the 5918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // back pointer chain until they find the map holding their constructor. 5919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(constructor_or_backpointer, Object) 5920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* GetConstructor() const; 5921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetConstructor(Object* constructor, 5922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 5923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [back pointer]: points back to the parent map from which a transition 5924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // leads to this map. The field overlaps with the constructor (see above). 5925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* GetBackPointer(); 5926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetBackPointer(Object* value, 5927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 5928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [instance descriptors]: describes the object. 5930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(instance_descriptors, DescriptorArray) 5931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // [layout descriptor]: describes the object layout. 5933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_ACCESSORS(layout_descriptor, LayoutDescriptor) 5934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // |layout descriptor| accessor which can be used from GC. 5935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline LayoutDescriptor* layout_descriptor_gc_safe(); 5936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool HasFastPointerLayout() const; 5937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // |layout descriptor| accessor that is safe to call even when 5939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // FLAG_unbox_double_fields is disabled (in this case Map does not contain 5940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // |layout_descriptor| field at all). 5941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline LayoutDescriptor* GetLayoutDescriptor(); 5942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void UpdateDescriptors(DescriptorArray* descriptors, 5944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LayoutDescriptor* layout_descriptor); 5945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void InitializeDescriptors(DescriptorArray* descriptors, 5946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LayoutDescriptor* layout_descriptor); 5947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [stub cache]: contains stubs compiled for this map. 594913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(code_cache, FixedArray) 5950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [dependent code]: list of optimized codes that weakly embed this map. 5952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(dependent_code, DependentCode) 5953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [weak cell cache]: cache that stores a weak cell pointing to this map. 5955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(weak_cell_cache, Object) 5956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline PropertyDetails GetLastDescriptorDetails(); 5958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int LastAdded(); 5960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int NumberOfOwnDescriptors(); 5962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetNumberOfOwnDescriptors(int number); 5963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Cell* RetrieveDescriptorsPointer(); 5965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5966109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Checks whether all properties are stored either in the map or on the object 5967109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // (inobject, properties, or elements backing store), requiring no special 5968109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // checks. 5969109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool OnlyHasSimpleProperties(); 5970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int EnumLength(); 5971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetEnumLength(int length); 5972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool owns_descriptors(); 5974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_owns_descriptors(bool owns_descriptors); 5975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void mark_unstable(); 5976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_stable(); 5977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_migration_target(bool value); 5978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_migration_target(); 5979f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_immutable_proto(bool value); 5980f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool is_immutable_proto(); 5981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_construction_counter(int value); 5982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int construction_counter(); 5983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void deprecate(); 5984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_deprecated(); 5985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool CanBeDeprecated(); 5986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a non-deprecated version of the input. If the input was not 5987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deprecated, it is directly returned. Otherwise, the non-deprecated version 5988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is found by re-transitioning from the root of the transition tree using the 5989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // descriptor array of the map. Returns MaybeHandle<Map>() if no updated map 5990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // is found. 5991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static MaybeHandle<Map> TryUpdate(Handle<Map> map) WARN_UNUSED_RESULT; 5992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a non-deprecated version of the input. This method may deprecate 5994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // existing maps along the way if encodings conflict. Not for use while 5995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // gathering type feedback. Use TryUpdate in those cases instead. 5996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> Update(Handle<Map> map); 5997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Handle<Map> CopyInitialMap(Handle<Map> map); 5999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> CopyInitialMap(Handle<Map> map, int instance_size, 6000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int in_object_properties, 6001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int unused_property_fields); 6002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyDropDescriptors(Handle<Map> map); 6003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyInsertDescriptor(Handle<Map> map, 6004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Descriptor* descriptor, 6005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 600762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<Object> WrapFieldType(Handle<FieldType> type); 600862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static FieldType* UnwrapFieldType(Object* wrapped_type); 600962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Map> CopyWithField( 6011109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<Map> map, Handle<Name> name, Handle<FieldType> type, 601262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyAttributes attributes, PropertyConstness constness, 601362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Representation representation, TransitionFlag flag); 6014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static MaybeHandle<Map> CopyWithConstant( 6016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map, 6017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 6018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> constant, 6019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttributes attributes, 6020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 602180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 6022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a new map with all transitions dropped from the given map and 6023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the ElementsKind set. 6024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> TransitionElementsTo(Handle<Map> map, 6025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind); 6026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> AsElementsKind(Handle<Map> map, ElementsKind kind); 6028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyAsElementsKind(Handle<Map> map, 6030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind kind, 6031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> AsLanguageMode(Handle<Map> initial_map, 6034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode, 6035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FunctionKind kind); 6036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<Map> CopyForPreventExtensions(Handle<Map> map, 6039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PropertyAttributes attrs_to_add, 6040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Symbol> transition_marker, 6041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* reason); 6042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> FixProxy(Handle<Map> map, InstanceType type, int size); 6044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximal number of fast properties. Used to restrict the number of map 6047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // transitions to avoid an explosion in the number of maps for objects used as 6048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // dictionaries. 6049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool TooManyFastProperties(StoreFromKeyed store_mode); 6050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> TransitionToDataProperty(Handle<Map> map, 6051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 6052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value, 6053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyAttributes attributes, 605462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyConstness constness, 6055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFromKeyed store_mode); 6056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> TransitionToAccessorProperty( 6057bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Isolate* isolate, Handle<Map> map, Handle<Name> name, int descriptor, 6058bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Object> getter, Handle<Object> setter, 60593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch PropertyAttributes attributes); 6060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> ReconfigureExistingProperty(Handle<Map> map, 6061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int descriptor, 6062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyKind kind, 6063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 6064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void AppendDescriptor(Descriptor* desc); 6066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns a copy of the map, prepared for inserting into the transition 6068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // tree (if the |map| owns descriptors then the new one will share 6069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // descriptors with |map|). 6070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> CopyForTransition(Handle<Map> map, const char* reason); 6071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns a copy of the map, with all transitions dropped from the 6073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instance descriptors. 6074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<Map> Copy(Handle<Map> map, const char* reason); 6075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> Create(Isolate* isolate, int inobject_properties); 6076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns the next free property index (only valid for FAST MODE). 6078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int NextFreePropertyIndex(); 6079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 60803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns the number of properties described in instance_descriptors 60813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // filtering out properties with the specified attributes. 6082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NumberOfDescribedProperties(DescriptorFlag which = OWN_DESCRIPTORS, 6083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyFilter filter = ALL_PROPERTIES); 6084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Map) 6086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code cache operations. 6088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Clears the code cache. 609044f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void ClearCodeCache(Heap* heap); 6091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Update code cache. 60933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static void UpdateCodeCache(Handle<Map> map, 6094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 60953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Code> code); 6096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Extend the descriptor array of the map with the list of descriptors. 6098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // In case of duplicates, the latest descriptor is used. 6099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void AppendCallbackDescriptors(Handle<Map> map, 6100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> descriptors); 6101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static inline int SlackForArraySize(int old_size, int size_limit); 6103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void EnsureDescriptorSlack(Handle<Map> map, int slack); 6105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6106bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Code* LookupInCodeCache(Name* name, Code::Flags code); 61073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 610862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<Map> GetObjectCreateMap(Handle<HeapObject> prototype); 610962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 61103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Computes a hash value for this map, to be used in HashTables and such. 61113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int Hash(); 61123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 61133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns the transitioned map for this map with the most generic 6114bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // elements_kind that's found in |candidates|, or |nullptr| if no match is 61153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // found at all. 6116bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Map* FindElementsKindTransitionedMap(MapHandleList* candidates); 6117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool CanTransition(); 6119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsBooleanMap(); 6121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsPrimitiveMap(); 6122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSReceiverMap(); 6123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSObjectMap(); 6124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSArrayMap(); 6125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSFunctionMap(); 6126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsStringMap(); 6127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSProxyMap(); 6128f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline bool IsModuleMap(); 6129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSGlobalProxyMap(); 6130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSGlobalObjectMap(); 6131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSTypedArrayMap(); 6132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSDataViewMap(); 6133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 613462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool IsSpecialReceiverMap(); 613562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool CanOmitMapChecks(); 6137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void AddDependentCode(Handle<Map> map, 6139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DependentCode::DependencyGroup group, 6140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code); 6141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsMapInArrayPrototypeChain(); 6143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static Handle<WeakCell> WeakCellForMap(Handle<Map> map); 6145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 6147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Map) 6148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Map) 6149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 6151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void DictionaryMapVerify(); 6152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void VerifyOmittedMapChecks(); 6153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 6154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6155756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick inline int visitor_id(); 6156756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick inline void set_visitor_id(int visitor_id); 61573bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 6158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> TransitionToPrototype(Handle<Map> map, 6159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> prototype, 6160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PrototypeOptimizationMode mode); 6161053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block 6162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<Map> TransitionToImmutableProto(Handle<Map> map); 6163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 6164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxPreAllocatedPropertyFields = 255; 6165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 6167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceSizesOffset = HeapObject::kHeaderSize; 6168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceAttributesOffset = kInstanceSizesOffset + kIntSize; 6169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBitField3Offset = kInstanceAttributesOffset + kIntSize; 6170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPrototypeOffset = kBitField3Offset + kPointerSize; 6171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kConstructorOrBackPointerOffset = 6172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kPrototypeOffset + kPointerSize; 6173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // When there is only one transition, it is stored directly in this field; 6174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // otherwise a transition array is used. 6175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For prototype maps, this slot is used to store this map's PrototypeInfo 6176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // struct. 6177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kTransitionsOrPrototypeInfoOffset = 6178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kConstructorOrBackPointerOffset + kPointerSize; 6179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDescriptorsOffset = 6180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kTransitionsOrPrototypeInfoOffset + kPointerSize; 6181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_DOUBLE_FIELDS_UNBOXING 6182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kLayoutDescriptorOffset = kDescriptorsOffset + kPointerSize; 6183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kCodeCacheOffset = kLayoutDescriptorOffset + kPointerSize; 6184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 6185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kLayoutDescriptorOffset = 1; // Must not be ever accessed. 6186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCodeCacheOffset = kDescriptorsOffset + kPointerSize; 6187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 6188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDependentCodeOffset = kCodeCacheOffset + kPointerSize; 6189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kWeakCellCacheOffset = kDependentCodeOffset + kPointerSize; 6190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kWeakCellCacheOffset + kPointerSize; 61917f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 61927f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Layout of pointer fields. Heap iteration code relies on them 61933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // being continuously allocated. 61947f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kPointerFieldsBeginOffset = Map::kPrototypeOffset; 6195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPointerFieldsEndOffset = kSize; 6196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Byte offsets within kInstanceSizesOffset. 6198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceSizeOffset = kInstanceSizesOffset + 0; 6199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInObjectPropertiesOrConstructorFunctionIndexByte = 1; 6200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInObjectPropertiesOrConstructorFunctionIndexOffset = 6201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kInstanceSizesOffset + kInObjectPropertiesOrConstructorFunctionIndexByte; 6202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Note there is one byte available for use here. 6203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kUnusedByte = 2; 6204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kUnusedOffset = kInstanceSizesOffset + kUnusedByte; 62059ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick static const int kVisitorIdByte = 3; 62069ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick static const int kVisitorIdOffset = kInstanceSizesOffset + kVisitorIdByte; 6207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Byte offsets within kInstanceAttributesOffset attributes. 6209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_LITTLE_ENDIAN 6210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Order instance type and bit field together such that they can be loaded 6211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // together as a 16-bit word with instance type in the lower 8 bits regardless 6212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // of endianess. Also provide endian-independent offset to that 16-bit word. 6213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceTypeOffset = kInstanceAttributesOffset + 0; 6214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBitFieldOffset = kInstanceAttributesOffset + 1; 6215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 6216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBitFieldOffset = kInstanceAttributesOffset + 0; 6217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInstanceTypeOffset = kInstanceAttributesOffset + 1; 6218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 6219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInstanceTypeAndBitFieldOffset = 6220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInstanceAttributesOffset + 0; 6221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBitField2Offset = kInstanceAttributesOffset + 2; 6222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kUnusedPropertyFieldsOffset = kInstanceAttributesOffset + 3; 6223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kInstanceTypeAndBitFieldOffset == 6225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Internals::kMapInstanceTypeAndBitFieldOffset); 6226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions for bit field. 6228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHasNonInstancePrototype = 0; 6229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kIsCallable = 1; 6230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHasNamedInterceptor = 2; 6231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHasIndexedInterceptor = 3; 6232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIsUndetectable = 4; 6233bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kIsAccessCheckNeeded = 5; 6234bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kIsConstructor = 6; 6235bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Bit 7 is free. 6236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions for bit field 2 62383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu static const int kIsExtensible = 0; 6239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Bit 1 is free. 6240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsPrototypeMapBits : public BitField<bool, 2, 1> {}; 6241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ElementsKindBits: public BitField<ElementsKind, 3, 5> {}; 62423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 62433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Derived values from bit field 2 62443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static const int8_t kMaximumBitField2FastElementValue = static_cast<int8_t>( 6245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (FAST_ELEMENTS + 1) << Map::ElementsKindBits::kShift) - 1; 6246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int8_t kMaximumBitField2FastSmiElementValue = 6247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int8_t>((FAST_SMI_ELEMENTS + 1) << 6248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::ElementsKindBits::kShift) - 1; 6249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int8_t kMaximumBitField2FastHoleyElementValue = 6250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int8_t>((FAST_HOLEY_ELEMENTS + 1) << 6251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::ElementsKindBits::kShift) - 1; 6252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int8_t kMaximumBitField2FastHoleySmiElementValue = 6253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int8_t>((FAST_HOLEY_SMI_ELEMENTS + 1) << 6254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::ElementsKindBits::kShift) - 1; 6255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6256756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 6257756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kPointerFieldsEndOffset, 6258756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kSize> BodyDescriptor; 6259756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 6260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Compares this map to another to see if they describe equivalent objects. 6261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If |mode| is set to CLEAR_INOBJECT_PROPERTIES, |other| is treated as if 6262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // it had exactly zero inobject properties. 6263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The "shared" flags of both this map and |other| are ignored. 6264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool EquivalentToForNormalization(Map* other, PropertyNormalizationMode mode); 6265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Returns true if given field is unboxed double. 6267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool IsUnboxedDoubleField(FieldIndex index); 6268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 6270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void TraceTransition(const char* what, Map* from, Map* to, Name* name); 6271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static void TraceAllTransitions(Map* map); 6272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 6273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline Handle<Map> AddMissingTransitionsForTesting( 6275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> split_map, Handle<DescriptorArray> descriptors, 6276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<LayoutDescriptor> full_layout_descriptor); 6277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 627862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Fires when the layout of an object with a leaf map changes. 627962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // This includes adding transitions to the leaf map or changing 628062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // the descriptor array. 628162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void NotifyLeafMapLayoutChange(); 628262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 6284bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Returns the map that this (root) map transitions to if its elements_kind 6285bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // is changed to |elements_kind|, or |nullptr| if no such map is cached yet. 6286bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Map* LookupElementsTransitionMap(ElementsKind elements_kind); 6287bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6288bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Tries to replay property transitions starting from this (root) map using 6289bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // the descriptor array of the |map|. The |root_map| is expected to have 6290bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // proper elements kind and therefore elements kinds transitions are not 6291bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // taken by this function. Returns |nullptr| if matching transition map is 6292bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // not found. 6293bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Map* TryReplayPropertyTransitions(Map* map); 6294bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ConnectTransition(Handle<Map> parent, Handle<Map> child, 6296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, SimpleTransitionFlag flag); 6297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool EquivalentToForTransition(Map* other); 6299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> RawCopy(Handle<Map> map, int instance_size); 6300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> ShareDescriptor(Handle<Map> map, 6301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<DescriptorArray> descriptors, 6302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Descriptor* descriptor); 6303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Map> AddMissingTransitions( 6304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map, Handle<DescriptorArray> descriptors, 6305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<LayoutDescriptor> full_layout_descriptor); 6306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InstallDescriptors( 6307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> parent_map, Handle<Map> child_map, int new_descriptor, 6308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<DescriptorArray> descriptors, 6309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<LayoutDescriptor> full_layout_descriptor); 6310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyAddDescriptor(Handle<Map> map, 6311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Descriptor* descriptor, 6312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyReplaceDescriptors( 6314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> map, Handle<DescriptorArray> descriptors, 6315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<LayoutDescriptor> layout_descriptor, TransitionFlag flag, 6316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MaybeHandle<Name> maybe_name, const char* reason, 6317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SimpleTransitionFlag simple_flag); 6318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 6319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyReplaceDescriptor(Handle<Map> map, 6320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<DescriptorArray> descriptors, 6321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Descriptor* descriptor, 6322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index, 6323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TransitionFlag flag); 6324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<Map> TryReconfigureExistingProperty( 6325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map, int descriptor, PropertyKind kind, 6326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes, const char** reason); 6327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<Map> CopyNormalized(Handle<Map> map, 6329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyNormalizationMode mode); 6330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 633162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // TODO(ishell): Move to MapUpdater. 633262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<Map> CopyGeneralizeAllFields( 6333bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Map> map, ElementsKind elements_kind, int modify_index, 633462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyKind kind, PropertyAttributes attributes, const char* reason); 6335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void DeprecateTransitionTree(); 6337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ReplaceDescriptors(DescriptorArray* new_descriptors, 6339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LayoutDescriptor* new_layout_descriptor); 6340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Update field type of the given descriptor to new representation and new 6343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // type. The type must be prepared for storing in descriptor array: 6344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // it must be either a simple type or a map wrapped in a weak cell. 6345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UpdateFieldType(int descriptor_number, Handle<Name> name, 634662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyConstness new_constness, 6347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Representation new_representation, 6348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> new_wrapped_type); 6349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 635062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // TODO(ishell): Move to MapUpdater. 6351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintReconfiguration(FILE* file, int modify_index, PropertyKind kind, 6352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyAttributes attributes); 635362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // TODO(ishell): Move to MapUpdater. 6354109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void PrintGeneralization(FILE* file, const char* reason, int modify_index, 6355109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int split, int descriptors, bool constant_to_field, 6356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation old_representation, 6357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation new_representation, 6358109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MaybeHandle<FieldType> old_field_type, 6359109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MaybeHandle<Object> old_value, 6360109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MaybeHandle<FieldType> new_field_type, 6361109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch MaybeHandle<Object> new_value); 6362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFastPropertiesSoftLimit = 12; 6363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxFastProperties = 128; 6364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 636562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch friend class MapUpdater; 636662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Map); 6368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 6369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// An abstract superclass, a marker class really, for simple structure classes. 6372257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// It doesn't carry much functionality but allows struct classes to be 6373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// identified in the type system. 6374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Struct: public HeapObject { 6375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 6376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void InitializeBody(int object_size); 6377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Struct) 6378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6380c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// A container struct to hold state required for PromiseResolveThenableJob. 6381c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass PromiseResolveThenableJobInfo : public Struct { 6382f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 6383f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(thenable, JSReceiver) 6384f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(then, JSReceiver) 6385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(resolve, JSFunction) 6386f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(reject, JSFunction) 638762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6388c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(context, Context) 6389f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6390f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kThenableOffset = Struct::kHeaderSize; 6391f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kThenOffset = kThenableOffset + kPointerSize; 6392f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kResolveOffset = kThenOffset + kPointerSize; 6393f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kRejectOffset = kResolveOffset + kPointerSize; 639462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kContextOffset = kRejectOffset + kPointerSize; 6395c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kContextOffset + kPointerSize; 6396f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6397c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(PromiseResolveThenableJobInfo) 6398c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(PromiseResolveThenableJobInfo) 6399c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(PromiseResolveThenableJobInfo) 6400f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6401f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 6402c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PromiseResolveThenableJobInfo); 6403c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 6404c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 640562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass JSPromise; 640662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6407c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// Struct to hold state required for PromiseReactionJob. 6408c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass PromiseReactionJobInfo : public Struct { 6409c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 6410c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(value, Object) 6411c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(tasks, Object) 641262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 641362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Check comment in JSPromise for information on what state these 641462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // deferred fields could be in. 641562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(deferred_promise, Object) 641662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(deferred_on_resolve, Object) 641762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(deferred_on_reject, Object) 641862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 641962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_INT_ACCESSORS(debug_id) 642062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 6421c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(context, Context) 6422c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6423c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kValueOffset = Struct::kHeaderSize; 6424c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kTasksOffset = kValueOffset + kPointerSize; 642562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kDeferredPromiseOffset = kTasksOffset + kPointerSize; 642662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kDeferredOnResolveOffset = 642762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kDeferredPromiseOffset + kPointerSize; 642862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kDeferredOnRejectOffset = 642962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kDeferredOnResolveOffset + kPointerSize; 643062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kContextOffset = kDeferredOnRejectOffset + kPointerSize; 6431c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kContextOffset + kPointerSize; 6432c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6433c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(PromiseReactionJobInfo) 6434c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(PromiseReactionJobInfo) 6435c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(PromiseReactionJobInfo) 6436c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6437c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 6438c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PromiseReactionJobInfo); 6439f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 6440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Container for metadata stored on each prototype map. 6442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PrototypeInfo : public Struct { 6443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 6444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int UNREGISTERED = -1; 6445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6446c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [weak_cell]: A WeakCell containing this prototype. ICs cache the cell here. 6447c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(weak_cell, Object) 6448c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [prototype_users]: WeakFixedArray containing maps using this prototype, 6450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or Smi(0) if uninitialized. 6451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(prototype_users, Object) 645213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 645313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [object_create_map]: A field caching the map for Object.create(prototype). 645413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static inline void SetObjectCreateMap(Handle<PrototypeInfo> info, 645513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<Map> map); 645613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline Map* ObjectCreateMap(); 645713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool HasObjectCreateMap(); 645813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [registry_slot]: Slot in prototype's user registry where this user 6460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // is stored. Returns UNREGISTERED if this prototype has not been registered. 6461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int registry_slot() const; 6462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_registry_slot(int slot); 6463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [validity_cell]: Cell containing the validity bit for prototype chains 6464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // going through this object, or Smi(0) if uninitialized. 6465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // When a prototype object changes its map, then both its own validity cell 6466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and those of all "downstream" prototypes are invalidated; handlers for a 6467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // given receiver embed the currently valid cell for that receiver's prototype 6468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // during their compilation and check it on execution. 6469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(validity_cell, Object) 647013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [bit_field] 647113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline int bit_field() const; 647213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline void set_bit_field(int bit_field); 647313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 647413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_BOOLEAN_ACCESSORS(should_be_fast_map) 6475014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(PrototypeInfo) 6477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 6479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(PrototypeInfo) 6480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(PrototypeInfo) 6481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6482c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kWeakCellOffset = HeapObject::kHeaderSize; 6483c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kPrototypeUsersOffset = kWeakCellOffset + kPointerSize; 6484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kRegistrySlotOffset = kPrototypeUsersOffset + kPointerSize; 6485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kValidityCellOffset = kRegistrySlotOffset + kPointerSize; 648613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kObjectCreateMap = kValidityCellOffset + kPointerSize; 648713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kBitFieldOffset = kObjectCreateMap + kPointerSize; 648813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kSize = kBitFieldOffset + kPointerSize; 648913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 649013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Bit field usage. 649113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kShouldBeFastBit = 0; 6492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 649413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(object_create_map, Object) 649513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6496014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PrototypeInfo); 6497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 6498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 649962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Tuple2 : public Struct { 6500c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 6501c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(value1, Object) 6502c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(value2, Object) 650362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 650462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_CAST(Tuple2) 650562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 650662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Dispatched behavior. 650762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_PRINTER(Tuple2) 650862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_VERIFIER(Tuple2) 650962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 651062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kValue1Offset = HeapObject::kHeaderSize; 651162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kValue2Offset = kValue1Offset + kPointerSize; 651262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSize = kValue2Offset + kPointerSize; 651362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 651462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 651562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Tuple2); 651662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 651762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 651862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass Tuple3 : public Tuple2 { 651962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 6520c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(value3, Object) 6521c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6522c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(Tuple3) 6523c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6524c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Dispatched behavior. 6525c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(Tuple3) 6526c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(Tuple3) 6527c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 652862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kValue3Offset = Tuple2::kSize; 6529c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kValue3Offset + kPointerSize; 6530c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6531c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 6532c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Tuple3); 6533c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 6534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Pair used to store both a ScopeInfo and an extension object in the extension 6536f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// slot of a block, catch, or with context. Needed in the rare case where a 6537f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// declaration block scope (a "varblock" as used to desugar parameter 6538f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// destructuring) also contains a sloppy direct eval, or for with and catch 6539f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// scopes. (In no other case both are needed at the same time.) 6540f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass ContextExtension : public Struct { 6541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 6542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [scope_info]: Scope info. 6543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(scope_info, ScopeInfo) 6544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [extension]: Extension object. 6545f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(extension, Object) 6546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6547f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_CAST(ContextExtension) 6548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 6550f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_PRINTER(ContextExtension) 6551f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_VERIFIER(ContextExtension) 6552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kScopeInfoOffset = HeapObject::kHeaderSize; 6554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kExtensionOffset = kScopeInfoOffset + kPointerSize; 6555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kExtensionOffset + kPointerSize; 6556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 6558f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ContextExtension); 6559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 6560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Script describes a script which has been added to the VM. 6562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Script: public Struct { 6563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 6564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Script types. 6565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum Type { 6566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block TYPE_NATIVE = 0, 6567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block TYPE_EXTENSION = 1, 6568f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch TYPE_NORMAL = 2, 656962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch TYPE_WASM = 3, 657062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch TYPE_INSPECTOR = 4 6571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 6572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Script compilation types. 6574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum CompilationType { 6575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block COMPILATION_TYPE_HOST = 0, 65763e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu COMPILATION_TYPE_EVAL = 1 6577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 6578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 65793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Script compilation state. 65803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum CompilationState { 65813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch COMPILATION_STATE_INITIAL = 0, 65823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch COMPILATION_STATE_COMPILED = 1 65833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 65843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [source]: the script source. 6586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(source, Object) 6587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [name]: the script name. 6589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(name, Object) 6590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [id]: the script id. 6592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(id) 6593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [line_offset]: script line offset in resource from where it was extracted. 6595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(line_offset) 6596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [column_offset]: script column offset in resource from where it was 6598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // extracted. 6599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(column_offset) 6600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [context_data]: context data for the context this script was compiled in. 6602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(context_data, Object) 6603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // [wrapper]: the wrapper cache. This is either undefined or a WeakCell. 6605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_ACCESSORS(wrapper, HeapObject) 6606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [type]: the script type. 6608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(type) 6609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6610d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // [line_ends]: FixedArray of line ends positions. 6611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(line_ends, Object) 6612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6613109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // [eval_from_shared]: for eval scripts the shared function info for the 6614d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // function from which eval was called. 6615d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block DECL_ACCESSORS(eval_from_shared, Object) 6616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6617bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // [eval_from_position]: the source position in the code for the function 6618bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // from which eval was called, as positive integer. Or the code offset in the 6619bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // code from which eval was called, as negative integer. 6620bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECL_INT_ACCESSORS(eval_from_position) 6621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [shared_function_infos]: weak fixed array containing all shared 6623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // function infos created from this script. 662462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(shared_function_infos, FixedArray) 6625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [flags]: Holds an exciting bitfield. 6627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(flags) 6628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [source_url]: sourceURL from magic comment 6630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(source_url, Object) 6631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6632f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // [source_mapping_url]: sourceMappingURL magic comment 6633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(source_mapping_url, Object) 6634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6635c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [wasm_compiled_module]: the compiled wasm module this script belongs to. 6636f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // This must only be called if the type of this script is TYPE_WASM. 6637c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(wasm_compiled_module, Object) 6638f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 6639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [compilation_type]: how the the script was compiled. Encoded in the 6640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 'flags' field. 6641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline CompilationType compilation_type(); 6642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_compilation_type(CompilationType type); 6643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [compilation_state]: determines whether the script has already been 6645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // compiled. Encoded in the 'flags' field. 6646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline CompilationState compilation_state(); 6647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_compilation_state(CompilationState state); 6648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [origin_options]: optional attributes set by the embedder via ScriptOrigin, 6650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and used by the embedder to make decisions about the script. V8 just passes 6651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // this through. Encoded in the 'flags' field. 6652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline v8::ScriptOriginOptions origin_options(); 6653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_origin_options(ScriptOriginOptions origin_options); 6654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Script) 6656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 66573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // If script source is an external string, check that the underlying 66583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // resource is accessible. Otherwise, always return true. 66593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block inline bool HasValidSource(); 66603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 666162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Object* GetNameOrSourceURL(); 6662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6663bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Set eval origin for stack trace formatting. 6664bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static void SetEvalOrigin(Handle<Script> script, 6665bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<SharedFunctionInfo> outer, 6666bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch int eval_position); 6667bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Retrieve source position from where eval was called. 6668bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch int GetEvalPosition(); 6669bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 6670109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Init line_ends array with source code positions of line ends. 6671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void InitLineEnds(Handle<Script> script); 6672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 667313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Carries information about a source position. 667413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch struct PositionInfo { 667513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch PositionInfo() : line(-1), column(-1), line_start(-1), line_end(-1) {} 667613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 667713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int line; // Zero-based line number. 667813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int column; // Zero-based column number. 667913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int line_start; // Position of first character in line. 6680c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int line_end; // Position of final linebreak character in line. 668113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch }; 668213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 668313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Specifies whether to add offsets to position infos. 668413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch enum OffsetFlag { NO_OFFSET = 0, WITH_OFFSET = 1 }; 668513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 668613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Retrieves information about the given position, optionally with an offset. 668713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Returns false on failure, and otherwise writes into the given info object 668813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // on success. 6689c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The static method should is preferable for handlified callsites because it 6690c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // initializes the line ends array, avoiding expensive recomputations. 6691c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The non-static version is not allocating and safe for unhandlified 6692c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // callsites. 6693c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static bool GetPositionInfo(Handle<Script> script, int position, 6694c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PositionInfo* info, OffsetFlag offset_flag); 669513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool GetPositionInfo(int position, PositionInfo* info, 6696c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch OffsetFlag offset_flag) const; 6697c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6698c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Wrappers for GetPositionInfo 6699c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static int GetColumnNumber(Handle<Script> script, int code_offset); 6700c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int GetColumnNumber(int code_pos) const; 6701c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static int GetLineNumber(Handle<Script> script, int code_offset); 6702c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int GetLineNumber(int code_pos) const; 670313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get the JS object wrapping the given script; create it if none exists. 6705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<JSObject> GetWrapper(Handle<Script> script); 6706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Look through the list of existing shared function infos to find one 6708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // that matches the function literal. Return empty handle if not found. 670962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MaybeHandle<SharedFunctionInfo> FindSharedFunctionInfo( 671062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, const FunctionLiteral* fun); 6711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterate over all script objects on the heap. 6713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class Iterator { 6714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 6715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit Iterator(Isolate* isolate); 6716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Script* Next(); 6717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 6719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakFixedArray::Iterator iterator_; 6720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_COPY_AND_ASSIGN(Iterator); 6721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 6722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 6724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Script) 6725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Script) 6726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSourceOffset = HeapObject::kHeaderSize; 6728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNameOffset = kSourceOffset + kPointerSize; 6729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kLineOffsetOffset = kNameOffset + kPointerSize; 6730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kColumnOffsetOffset = kLineOffsetOffset + kPointerSize; 6731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kContextOffset = kColumnOffsetOffset + kPointerSize; 6732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kWrapperOffset = kContextOffset + kPointerSize; 6733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kTypeOffset = kWrapperOffset + kPointerSize; 6734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLineEndsOffset = kTypeOffset + kPointerSize; 6735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kIdOffset = kLineEndsOffset + kPointerSize; 6736d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block static const int kEvalFromSharedOffset = kIdOffset + kPointerSize; 6737bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kEvalFromPositionOffset = 6738d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block kEvalFromSharedOffset + kPointerSize; 6739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSharedFunctionInfosOffset = 6740bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kEvalFromPositionOffset + kPointerSize; 6741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFlagsOffset = kSharedFunctionInfosOffset + kPointerSize; 6742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSourceUrlOffset = kFlagsOffset + kPointerSize; 6743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSourceMappingUrlOffset = kSourceUrlOffset + kPointerSize; 6744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kSourceMappingUrlOffset + kPointerSize; 6745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 6747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bit positions in the flags field. 6748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCompilationTypeBit = 0; 6749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCompilationStateBit = 1; 675062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kOriginOptionsShift = 2; 675162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kOriginOptionsSize = 4; 6752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kOriginOptionsMask = ((1 << kOriginOptionsSize) - 1) 6753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch << kOriginOptionsShift; 6754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Script); 6756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 6757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// List of builtin functions we want to identify to improve code 6760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// generation. 6761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 6762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Each entry has a name of a global object property holding an object 6763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// optionally followed by ".prototype", a name of a builtin function 6764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// on the object (the one the id is set for), and a label. 6765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 6766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Installation of ids for the selected builtin functions is handled 6767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// by the bootstrapper. 67683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define FUNCTIONS_WITH_ID_LIST(V) \ 676962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array, isArray, ArrayIsArray) \ 677062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, concat, ArrayConcat) \ 677162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, every, ArrayEvery) \ 677262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, fill, ArrayFill) \ 677362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, filter, ArrayFilter) \ 677462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, findIndex, ArrayFindIndex) \ 677562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, forEach, ArrayForEach) \ 677662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, includes, ArrayIncludes) \ 67773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, indexOf, ArrayIndexOf) \ 677862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, join, ArrayJoin) \ 67793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, lastIndexOf, ArrayLastIndexOf) \ 678062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, map, ArrayMap) \ 67813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, pop, ArrayPop) \ 678262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, push, ArrayPush) \ 678362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, reverse, ArrayReverse) \ 67843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Array.prototype, shift, ArrayShift) \ 678562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, slice, ArraySlice) \ 678662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, some, ArraySome) \ 678762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, splice, ArraySplice) \ 678862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Array.prototype, unshift, ArrayUnshift) \ 678962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Date, now, DateNow) \ 6790f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getDate, DateGetDate) \ 6791f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getDay, DateGetDay) \ 6792f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getFullYear, DateGetFullYear) \ 6793f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getHours, DateGetHours) \ 6794f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getMilliseconds, DateGetMilliseconds) \ 6795f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getMinutes, DateGetMinutes) \ 6796f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getMonth, DateGetMonth) \ 6797f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getSeconds, DateGetSeconds) \ 6798f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Date.prototype, getTime, DateGetTime) \ 67993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Function.prototype, apply, FunctionApply) \ 68003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Function.prototype, call, FunctionCall) \ 680162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Object, assign, ObjectAssign) \ 680262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Object, create, ObjectCreate) \ 68033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Object.prototype, hasOwnProperty, ObjectHasOwnProperty) \ 680462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Object.prototype, toString, ObjectToString) \ 680562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(RegExp.prototype, compile, RegExpCompile) \ 680662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(RegExp.prototype, exec, RegExpExec) \ 680762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(RegExp.prototype, test, RegExpTest) \ 680862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(RegExp.prototype, toString, RegExpToString) \ 68093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, charCodeAt, StringCharCodeAt) \ 68103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, charAt, StringCharAt) \ 681162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, codePointAt, StringCodePointAt) \ 68123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, concat, StringConcat) \ 681362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, endsWith, StringEndsWith) \ 681462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, includes, StringIncludes) \ 681562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, indexOf, StringIndexOf) \ 681662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, lastIndexOf, StringLastIndexOf) \ 681762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, repeat, StringRepeat) \ 681862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, slice, StringSlice) \ 681962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, startsWith, StringStartsWith) \ 6820f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(String.prototype, substr, StringSubstr) \ 682162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, substring, StringSubstring) \ 68223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, toLowerCase, StringToLowerCase) \ 682362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, toString, StringToString) \ 68243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String.prototype, toUpperCase, StringToUpperCase) \ 682562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, trim, StringTrim) \ 682662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, trimLeft, StringTrimLeft) \ 682762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, trimRight, StringTrimRight) \ 682862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String.prototype, valueOf, StringValueOf) \ 68293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(String, fromCharCode, StringFromCharCode) \ 683062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String, fromCodePoint, StringFromCodePoint) \ 683162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(String, raw, StringRaw) \ 68323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, random, MathRandom) \ 68333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, floor, MathFloor) \ 68343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, round, MathRound) \ 68353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, ceil, MathCeil) \ 68363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, abs, MathAbs) \ 68373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, log, MathLog) \ 683813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, log1p, MathLog1p) \ 683913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, log2, MathLog2) \ 684013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, log10, MathLog10) \ 684113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, cbrt, MathCbrt) \ 68423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, exp, MathExp) \ 684313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, expm1, MathExpm1) \ 68443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, sqrt, MathSqrt) \ 68453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, pow, MathPow) \ 68463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, max, MathMax) \ 68473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, min, MathMin) \ 68483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, cos, MathCos) \ 6849f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, cosh, MathCosh) \ 6850f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, sign, MathSign) \ 68513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, sin, MathSin) \ 6852f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, sinh, MathSinh) \ 68533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, tan, MathTan) \ 6854f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, tanh, MathTanh) \ 68553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, acos, MathAcos) \ 6856f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, acosh, MathAcosh) \ 68573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, asin, MathAsin) \ 6858f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, asinh, MathAsinh) \ 68593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, atan, MathAtan) \ 68603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, atan2, MathAtan2) \ 686113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Math, atanh, MathAtanh) \ 68623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, imul, MathImul) \ 68633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, clz32, MathClz32) \ 68643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V(Math, fround, MathFround) \ 6865f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Math, trunc, MathTrunc) \ 6866f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Number, isFinite, NumberIsFinite) \ 6867f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Number, isInteger, NumberIsInteger) \ 6868f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Number, isNaN, NumberIsNaN) \ 6869f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(Number, isSafeInteger, NumberIsSafeInteger) \ 6870c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(Number, parseFloat, NumberParseFloat) \ 6871f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(Number, parseInt, NumberParseInt) \ 687262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Number.prototype, toString, NumberToString) \ 687362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map.prototype, clear, MapClear) \ 687462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map.prototype, delete, MapDelete) \ 687562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map.prototype, entries, MapEntries) \ 687662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map.prototype, forEach, MapForEach) \ 687762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map.prototype, has, MapHas) \ 687862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map.prototype, keys, MapKeys) \ 687962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map.prototype, set, MapSet) \ 688062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Map.prototype, values, MapValues) \ 688162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set.prototype, add, SetAdd) \ 688262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set.prototype, clear, SetClear) \ 688362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set.prototype, delete, SetDelete) \ 688462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set.prototype, entries, SetEntries) \ 688562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set.prototype, forEach, SetForEach) \ 688662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set.prototype, has, SetHas) \ 688762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set.prototype, keys, SetKeys) \ 688862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(Set.prototype, values, SetValues) \ 688962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(WeakMap.prototype, delete, WeakMapDelete) \ 689062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(WeakMap.prototype, has, WeakMapHas) \ 689162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(WeakMap.prototype, set, WeakMapSet) \ 689262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(WeakSet.prototype, add, WeakSetAdd) \ 689362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(WeakSet.prototype, delete, WeakSetDelete) \ 689462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(WeakSet.prototype, has, WeakSetHas) 6895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define ATOMIC_FUNCTIONS_WITH_ID_LIST(V) \ 6897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Atomics, load, AtomicsLoad) \ 6898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Atomics, store, AtomicsStore) 6899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochenum BuiltinFunctionId { 6901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayCode, 6902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DECLARE_FUNCTION_ID(ignored1, ignore2, name) \ 6903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch k##name, 6904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID) 6905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ATOMIC_FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID) 6906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_FUNCTION_ID 6907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Fake id for a special case of Math.pow. Note, it continues the 6908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // list of math functions. 690913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kMathPowHalf, 691013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // These are manually assigned to special getters during bootstrapping. 6911f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kArrayBufferByteLength, 6912c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kArrayEntries, 6913c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kArrayKeys, 6914c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kArrayValues, 6915c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kArrayIteratorNext, 691613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kDataViewBuffer, 691713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kDataViewByteLength, 691813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kDataViewByteOffset, 6919f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kFunctionHasInstance, 6920f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalDecodeURI, 6921f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalDecodeURIComponent, 6922f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalEncodeURI, 6923f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalEncodeURIComponent, 6924f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalEscape, 6925f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kGlobalUnescape, 6926f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kGlobalIsFinite, 6927f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kGlobalIsNaN, 692813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kTypedArrayByteLength, 692913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kTypedArrayByteOffset, 6930c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kTypedArrayEntries, 6931c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kTypedArrayKeys, 693213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kTypedArrayLength, 6933c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kTypedArrayValues, 6934f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSharedArrayBufferByteLength, 6935c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kStringIterator, 6936f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kStringIteratorNext, 6937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 6938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6939014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Result of searching in an optimized code map of a SharedFunctionInfo. Note 694062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// that both {code} and {vector} can be NULL to pass search result status. 694162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct CodeAndVector { 694262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Code* code; // Cached optimized code. 694362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FeedbackVector* vector; // Cached feedback vector. 6944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 6945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SharedFunctionInfo describes the JSFunction information that can be 6947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// shared by multiple instances of the function. 6948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass SharedFunctionInfo: public HeapObject { 6949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 6950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [name]: Function name. 6951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(name, Object) 6952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [code]: Function code. 6954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(code, Code) 6955109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 69563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Get the abstract code associated with the function, which will either be 69573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // a Code object or a BytecodeArray. 69583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline AbstractCode* abstract_code(); 69593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 6960c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Tells whether or not this shared function info is interpreted. 6961c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // 6962c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Note: function->IsInterpreted() does not necessarily return the same value 6963c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // as function->shared()->IsInterpreted() because the shared function info 6964c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // could tier up to baseline via a different function closure. The interpreter 6965c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // entry stub will "self-heal" this divergence when the function is executed. 6966c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool IsInterpreted() const; 6967c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 6968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void ReplaceCode(Code* code); 6969f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool HasBaselineCode() const; 6970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [optimized_code_map]: Map from native context to optimized code 6972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and a shared literals array. 6973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(optimized_code_map, FixedArray) 6974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns entry from optimized code map for specified context and OSR entry. 697662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Code* SearchOptimizedCodeMap(Context* native_context, BailoutId osr_ast_id); 6977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear optimized code map. 6979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClearOptimizedCodeMap(); 6980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 698113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Like ClearOptimizedCodeMap, but preserves literals. 698213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void ClearCodeFromOptimizedCodeMap(); 698313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6984014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We have a special root FixedArray with the right shape and values 6985014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to represent the cleared optimized code map. This predicate checks 6986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // if that root is installed. 6987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool OptimizedCodeMapIsCleared() const; 6988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Removes a specific optimized code object from the optimized code map. 6990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // In case of non-OSR the code reference is cleared from the cache entry but 6991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the entry itself is left in the map in order to proceed sharing literals. 6992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void EvictFromOptimizedCodeMap(Code* optimized_code, const char* reason); 6993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 69943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Add or update entry in the optimized code map for context-dependent code. 69953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static void AddToOptimizedCodeMap(Handle<SharedFunctionInfo> shared, 69963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Context> native_context, 699762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Code> code, BailoutId osr_ast_id); 6998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 6999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Set up the link between shared function info and the script. The shared 7000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // function info is added to the list on the script. 7001c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE static void SetScript(Handle<SharedFunctionInfo> shared, 7002c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> script_object); 7003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description of the optimized code map. 7005c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kEntriesStart = 0; 7006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kContextOffset = 0; 7007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCachedCodeOffset = 1; 700862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kEntryLength = 2; 7009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInitialLength = kEntriesStart + kEntryLength; 7010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNotFound = -1; 7012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7013bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Helpers for assembly code that does a backwards walk of the optimized code 7014bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // map. 7015bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kOffsetToPreviousContext = 7016bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FixedArray::kHeaderSize + kPointerSize * (kContextOffset - kEntryLength); 7017bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kOffsetToPreviousCachedCode = 7018bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FixedArray::kHeaderSize + 7019bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kPointerSize * (kCachedCodeOffset - kEntryLength); 7020bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 70213bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch // [scope_info]: Scope info. 70223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(scope_info, ScopeInfo) 70233bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 7024f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The outer scope info for the purpose of parsing this function, or the hole 7025f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // value if it isn't yet known. 7026f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(outer_scope_info, HeapObject) 7027f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [construct stub]: Code stub for constructing instances of this function. 7029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(construct_stub, Code) 7030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7031f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Sets the given code as the construct stub, and marks builtin code objects 7032f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // as a construct stub. 7033f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void SetConstructStub(Code* code); 7034f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns if this function has been compiled to native code yet. 7036f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool is_compiled() const; 7037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [length]: The function length - usually the number of declared parameters. 7039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Use up to 2^30 parameters. 7040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int length() const; 7041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_length(int value); 7042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [internal formal parameter count]: The declared number of parameters. 7044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For subclass constructors, also includes new.target. 7045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The size of function's frame is internal_formal_parameter_count + 1. 7046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int internal_formal_parameter_count() const; 7047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_internal_formal_parameter_count(int value); 7048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set the formal parameter count so the function code will be 7050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // called without using argument adaptor frames. 7051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void DontAdaptArguments(); 7052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [expected_nof_properties]: Expected number of properties for the function. 7054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int expected_nof_properties() const; 7055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_expected_nof_properties(int value); 7056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 705713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [feedback_metadata] - describes ast node feedback from full-codegen and 7058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // (increasingly) from crankshafted code where sufficient feedback isn't 7059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // available. 706062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(feedback_metadata, FeedbackMetadata) 706162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 706262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // [function_literal_id] - uniquely identifies the FunctionLiteral this 706362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // SharedFunctionInfo represents within its script, or -1 if this 706462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // SharedFunctionInfo object doesn't correspond to a parsed FunctionLiteral. 706562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline int function_literal_id() const; 706662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_function_literal_id(int value); 7067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 7069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // [unique_id] - For --trace-maps purposes, an identifier that's persistent 7070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // even if the GC moves this SharedFunctionInfo. 7071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline int unique_id() const; 7072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_unique_id(int value); 7073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 7074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [instance class name]: class name for instances. 7076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(instance_class_name, Object) 7077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 70786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // [function data]: This field holds some additional data for function. 7079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Currently it has one of: 7080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - a FunctionTemplateInfo to make benefit the API [IsApiFunction()]. 7081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // - a BytecodeArray for the interpreter [HasBytecodeArray()]. 7082f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // - a FixedArray with Asm->Wasm conversion [HasAsmWasmData()]. 7083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(function_data, Object) 7084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 70856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline bool IsApiFunction(); 70866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline FunctionTemplateInfo* get_api_func_data(); 70873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_api_func_data(FunctionTemplateInfo* data); 708862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool HasBytecodeArray() const; 708962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline BytecodeArray* bytecode_array() const; 70903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_bytecode_array(BytecodeArray* bytecode); 70913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void ClearBytecodeArray(); 709262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool HasAsmWasmData() const; 709362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline FixedArray* asm_wasm_data() const; 7094f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void set_asm_wasm_data(FixedArray* data); 7095f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void ClearAsmWasmData(); 70963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 70973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // [function identifier]: This field holds an additional identifier for the 70983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // function. 70993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // - a Smi identifying a builtin function [HasBuiltinFunctionId()]. 71003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // - a String identifying the function's inferred name [HasInferredName()]. 71013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // The inferred_name is inferred from variable or property 71023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // assignment of this function. It is used to facilitate debugging and 71033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // profiling of JavaScript code written in OO style, where almost 71043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // all functions are anonymous but are assigned to object 71053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // properties. 71063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DECL_ACCESSORS(function_identifier, Object) 71073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 71083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool HasBuiltinFunctionId(); 71093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline BuiltinFunctionId builtin_function_id(); 71103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_builtin_function_id(BuiltinFunctionId id); 71113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool HasInferredName(); 71123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline String* inferred_name(); 71133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_inferred_name(String* inferred_name); 71146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 7115c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [script]: Script from which the function originates. 7116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(script, Object) 7117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [start_position_and_type]: Field used to store both the source code 7119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // position, whether or not the function is a function expression, 7120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // and whether or not the function is a toplevel function. The two 7121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // least significants bit indicates whether the function is an 7122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // expression and the rest contains the source code position. 7123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int start_position_and_type() const; 7124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_start_position_and_type(int value); 7125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The function is subject to debugging if a debug info is attached. 712762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool HasDebugInfo() const; 712862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline DebugInfo* GetDebugInfo() const; 7129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // A function has debug code if the compiled code has debug break slots. 713162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool HasDebugCode() const; 7132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [debug info]: Debug information. 7134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(debug_info, Object) 7135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 713662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Bit field containing various information collected for debugging. 713762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // This field is either stored on the kDebugInfo slot or inside the 713862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // debug info struct. 713962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline int debugger_hints() const; 714062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_debugger_hints(int value); 714162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 714262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Indicates that the function was created by the Function function. 714362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Though it's anonymous, toString should treat it as if it had the name 714462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // "anonymous". We don't set the name itself so that the system does not 714562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // see a binding for it. 714662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(name_should_print_as_anonymous) 714762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 714862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Indicates that the function is either an anonymous expression 714962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // or an arrow function (the name field can be set through the API, 715062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // which does not change this flag). 715162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(is_anonymous_expression) 715262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 715362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Indicates that the the shared function info is deserialized from cache. 715462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(deserialized) 715562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 715662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Indicates that the function cannot cause side-effects. 715762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(has_no_side_effect) 715862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 715962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Indicates that |has_no_side_effect| has been computed and set. 716062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(computed_has_no_side_effect) 716162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 716262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Indicates that the function should be skipped during stepping. 716362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(debug_is_blackboxed) 716462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 716562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Indicates that |debug_is_blackboxed| has been computed and set. 716662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(computed_debug_is_blackboxed) 716762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 7168f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // The function's name if it is non-empty, otherwise the inferred name. 7169f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch String* DebugName(); 7170f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 717162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // The function cannot cause any side effects. 717262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool HasNoSideEffect(); 717362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 71743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Used for flags such as --hydrogen-filter. 71753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool PassesFilter(const char* raw_filter); 71763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 7177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Position of the 'function' token in the script source. 7178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int function_token_position() const; 7179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_function_token_position(int function_token_position); 7180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Position of this function in the script source. 7182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int start_position() const; 7183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_start_position(int start_position); 7184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // End position of this function in the script source. 7186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int end_position() const; 7187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_end_position(int end_position); 7188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7189109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Is this function a named function expression in the source code. 7190109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_named_expression) 7191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Is this function a top-level function (scripts, evals). 71933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_toplevel) 7194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit field containing various information collected by the compiler to 7196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // drive optimization. 7197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int compiler_hints() const; 7198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_compiler_hints(int value); 7199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int ast_node_count() const; 72018f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline void set_ast_node_count(int count); 72028f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 7203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int profiler_ticks() const; 7204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_profiler_ticks(int ticks); 72053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 72068f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch // Inline cache age is used to infer whether the function survived a context 72078f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch // disposal or not. In the former case we reset the opt_count. 72088f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline int ic_age(); 72098f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline void set_ic_age(int age); 7210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 72117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Indicates if this function can be lazy compiled. 72127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // This is used to determine if we can safely flush code from a function 72137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // when doing GC if we expect that the function will no longer be used. 72143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation) 72157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 7216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Indicates whether optimizations have been disabled for this 7217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // shared function info. If a function is repeatedly optimized or if 7218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // we cannot optimize the function we disable optimization to avoid 7219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // spending time attempting to optimize it again. 72203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(optimization_disabled) 7221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates the language mode. 7223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline LanguageMode language_mode(); 7224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_language_mode(LanguageMode language_mode); 72253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 72263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // False if the function definitely does not allocate an arguments object. 72273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(uses_arguments) 72281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Indicates that this function uses a super property (or an eval that may 7230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // use a super property). 7231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // This is needed to set up the [[HomeObject]] on the function instance. 7232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(needs_home_object) 7233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 72343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // True if the function has any duplicated parameter names. 72353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(has_duplicate_parameters) 72363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 72373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Indicates whether the function is a native function. 7238589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // These needs special treatment in .call and .apply since 7239257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // null passed as the receiver should not be translated to the 7240257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // global object. 72413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECL_BOOLEAN_ACCESSORS(native) 72423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Indicate that this function should always be inlined in optimized code. 7244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(force_inline) 7245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 724662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Indicates that code for this function must be compiled through the 724762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Ignition / TurboFan pipeline, and is unsupported by 724862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // FullCodegen / Crankshaft. 724962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(must_use_ignition_turbo) 7250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates that code for this function cannot be flushed. 7252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(dont_flush) 7253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates that this function is an asm function. 7255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(asm_function) 7256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7257109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Whether this function was created from a FunctionDeclaration. 7258109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_declaration) 7259109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 7260c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Whether this function was marked to be tiered up. 7261c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_BOOLEAN_ACCESSORS(marked_for_tier_up) 7262c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Indicates that asm->wasm conversion failed and should not be re-attempted. 7264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_BOOLEAN_ACCESSORS(is_asm_wasm_broken) 7265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 7266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline FunctionKind kind() const; 7267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_kind(FunctionKind kind); 72683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Indicates whether or not the code in the shared function support 7270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // deoptimization. 7271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline bool has_deoptimization_support(); 7272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Enable deoptimization support through recompiled code. 7274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void EnableDeoptimizationSupport(Code* recompiled); 7275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Disable (further) attempted optimization of all functions sharing this 72773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // shared function info. 7278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void DisableOptimization(BailoutReason reason); 7279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline BailoutReason disable_optimization_reason(); 7281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Lookup the bailout ID and DCHECK that it exists in the non-optimized 7283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // code, returns whether it asserted (i.e., always true if assertions are 7284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // disabled). 7285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool VerifyBailoutId(BailoutId id); 7286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [source code]: Source code for the function. 7288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasSourceCode() const; 72893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Object> GetSourceCode(); 729062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> GetSourceCodeHarmony(); 7291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Number of times the function was optimized. 7293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline int opt_count(); 7294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_opt_count(int opt_count); 7295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Number of times the function was deoptimized. 7297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_deopt_count(int value); 7298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int deopt_count(); 7299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void increment_deopt_count(); 7300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Number of time we tried to re-enable optimization after it 7302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // was disabled due to high number of deoptimizations. 7303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_opt_reenable_tries(int value); 7304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int opt_reenable_tries(); 7305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void TryReenableOptimization(); 7307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores deopt_count, opt_reenable_tries and ic_age as bit-fields. 7309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_counters(int value); 7310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int counters() const; 7311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores opt_count and bailout_reason as bit-fields. 7313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_opt_count_and_bailout_reason(int value); 7314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int opt_count_and_bailout_reason() const; 7315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_disable_optimization_reason(BailoutReason reason); 7317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tells whether this function should be subject to debugging. 7319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsSubjectToDebugging(); 7320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 732162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Whether this function is defined in user-provided JavaScript code. 732262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool IsUserJavaScript(); 7323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check whether or not this function is inlineable. 7325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInlineable(); 7326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Source size of this function. 7328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int SourceSize(); 7329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns `false` if formal parameters include rest parameters, optional 7331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // parameters, or destructuring parameters. 7332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(caitp): make this a flag set during parsing 7333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_simple_parameters(); 7334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Initialize a SharedFunctionInfo from a parsed function literal. 7336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InitFromFunctionLiteral(Handle<SharedFunctionInfo> shared_info, 7337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FunctionLiteral* lit); 7338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 7340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(SharedFunctionInfo) 7341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(SharedFunctionInfo) 7342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 73438f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch void ResetForNewContext(int new_ic_age); 73448f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 734562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Iterate over all shared function infos in a given script. 734662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch class ScriptIterator { 7347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 734862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch explicit ScriptIterator(Handle<Script> script); 734962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ScriptIterator(Isolate* isolate, Handle<FixedArray> shared_function_infos); 7350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SharedFunctionInfo* Next(); 7351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 735262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Reset the iterator to run on |script|. 735362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void Reset(Handle<Script> script); 735462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 7355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 735662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate_; 735762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray> shared_function_infos_; 735862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int index_; 735962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DISALLOW_COPY_AND_ASSIGN(ScriptIterator); 736062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 736162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 736262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Iterate over all shared function infos on the heap. 736362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch class GlobalIterator { 736462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 736562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch explicit GlobalIterator(Isolate* isolate); 736662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SharedFunctionInfo* Next(); 7367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 736862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 7369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Script::Iterator script_iterator_; 737062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch WeakFixedArray::Iterator noscript_sfi_iterator_; 737162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SharedFunctionInfo::ScriptIterator sfi_iterator_; 7372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DisallowHeapAllocation no_gc_; 737362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DISALLOW_COPY_AND_ASSIGN(GlobalIterator); 7374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 7375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SharedFunctionInfo) 7377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Constants. 7379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDontAdaptArgumentsSentinel = -1; 7380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 73826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Pointer fields. 7383f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kCodeOffset = HeapObject::kHeaderSize; 7384f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kNameOffset = kCodeOffset + kPointerSize; 7385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kOptimizedCodeMapOffset = kNameOffset + kPointerSize; 7386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kScopeInfoOffset = kOptimizedCodeMapOffset + kPointerSize; 7387f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kOuterScopeInfoOffset = kScopeInfoOffset + kPointerSize; 7388f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kConstructStubOffset = kOuterScopeInfoOffset + kPointerSize; 73896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kInstanceClassNameOffset = 73906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kConstructStubOffset + kPointerSize; 73916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kFunctionDataOffset = 73926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kInstanceClassNameOffset + kPointerSize; 73936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kScriptOffset = kFunctionDataOffset + kPointerSize; 73946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kDebugInfoOffset = kScriptOffset + kPointerSize; 73953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kFunctionIdentifierOffset = kDebugInfoOffset + kPointerSize; 739613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kFeedbackMetadataOffset = 73973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch kFunctionIdentifierOffset + kPointerSize; 739862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kFunctionLiteralIdOffset = 739962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kFeedbackMetadataOffset + kPointerSize; 7400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 740162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kUniqueIdOffset = kFunctionLiteralIdOffset + kPointerSize; 7402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLastPointerFieldOffset = kUniqueIdOffset; 7403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 7404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Just to not break the postmortrem support with conditional offsets 740562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kUniqueIdOffset = kFunctionLiteralIdOffset; 740662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kLastPointerFieldOffset = kFunctionLiteralIdOffset; 7407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 7408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 74097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_32_BIT 74107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Smi fields. 7411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLengthOffset = kLastPointerFieldOffset + kPointerSize; 74127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kFormalParameterCountOffset = kLengthOffset + kPointerSize; 7413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kExpectedNofPropertiesOffset = 74147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kFormalParameterCountOffset + kPointerSize; 74157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kNumLiteralsOffset = 74167f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kExpectedNofPropertiesOffset + kPointerSize; 7417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kStartPositionAndTypeOffset = 74187f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kNumLiteralsOffset + kPointerSize; 74197f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kEndPositionOffset = 74207f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kStartPositionAndTypeOffset + kPointerSize; 74217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kFunctionTokenPositionOffset = 74227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kEndPositionOffset + kPointerSize; 74237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kCompilerHintsOffset = 74247f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kFunctionTokenPositionOffset + kPointerSize; 7425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kOptCountAndBailoutReasonOffset = 74267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kCompilerHintsOffset + kPointerSize; 7427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCountersOffset = 7428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOptCountAndBailoutReasonOffset + kPointerSize; 7429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAstNodeCountOffset = 7430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kCountersOffset + kPointerSize; 7431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kProfilerTicksOffset = 7432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAstNodeCountOffset + kPointerSize; 74338f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 74347f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // Total size. 7435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kProfilerTicksOffset + kPointerSize; 74367f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#else 7437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The only reason to use smi fields instead of int fields is to allow 7438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// iteration without maps decoding during garbage collections. 7439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// To avoid wasting space on 64-bit architectures we use the following trick: 7440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// we group integer fields into pairs 7441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// The least significant integer in each pair is shifted left by 1. By doing 7442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// this we guarantee that LSB of each kPointerSize aligned word is not set and 7443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// thus this word cannot be treated as pointer to HeapObject during old space 7444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// traversal. 7445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_LITTLE_ENDIAN 7446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLengthOffset = kLastPointerFieldOffset + kPointerSize; 74477f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kFormalParameterCountOffset = 74487f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kLengthOffset + kIntSize; 74497f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 74507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kExpectedNofPropertiesOffset = 74517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kFormalParameterCountOffset + kIntSize; 74527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kNumLiteralsOffset = 74537f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kExpectedNofPropertiesOffset + kIntSize; 74547f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 74557f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kEndPositionOffset = 74566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kNumLiteralsOffset + kIntSize; 74577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kStartPositionAndTypeOffset = 74587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kEndPositionOffset + kIntSize; 74597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 74607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch static const int kFunctionTokenPositionOffset = 74617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kStartPositionAndTypeOffset + kIntSize; 74626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kCompilerHintsOffset = 7463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kFunctionTokenPositionOffset + kIntSize; 74647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 7465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kOptCountAndBailoutReasonOffset = 74666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kCompilerHintsOffset + kIntSize; 7467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kCountersOffset = 7468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOptCountAndBailoutReasonOffset + kIntSize; 74697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 7470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAstNodeCountOffset = 7471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kCountersOffset + kIntSize; 7472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kProfilerTicksOffset = 7473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAstNodeCountOffset + kIntSize; 74743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 74756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Total size. 7476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kProfilerTicksOffset + kIntSize; 74770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 7478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#elif V8_TARGET_BIG_ENDIAN 7479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kFormalParameterCountOffset = 7480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kLastPointerFieldOffset + kPointerSize; 7481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kLengthOffset = kFormalParameterCountOffset + kIntSize; 7482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNumLiteralsOffset = kLengthOffset + kIntSize; 7484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kExpectedNofPropertiesOffset = kNumLiteralsOffset + kIntSize; 7485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kStartPositionAndTypeOffset = 7487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kExpectedNofPropertiesOffset + kIntSize; 7488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kEndPositionOffset = kStartPositionAndTypeOffset + kIntSize; 7489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kCompilerHintsOffset = kEndPositionOffset + kIntSize; 7491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kFunctionTokenPositionOffset = 7492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kCompilerHintsOffset + kIntSize; 7493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kCountersOffset = kFunctionTokenPositionOffset + kIntSize; 7495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kOptCountAndBailoutReasonOffset = kCountersOffset + kIntSize; 7496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kProfilerTicksOffset = 7498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier kOptCountAndBailoutReasonOffset + kIntSize; 7499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kAstNodeCountOffset = kProfilerTicksOffset + kIntSize; 7500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Total size. 7502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kSize = kAstNodeCountOffset + kIntSize; 7503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 7504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 7505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#error Unknown byte ordering 7506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif // Big endian 7507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif // 64-bit 7508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 75090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 75106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kAlignedSize = POINTER_SIZE_ALIGN(kSize); 7511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7512f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch typedef FixedBodyDescriptor<kCodeOffset, 7513f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kLastPointerFieldOffset + kPointerSize, kSize> 7514f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BodyDescriptor; 7515756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef FixedBodyDescriptor<kNameOffset, 7516f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kLastPointerFieldOffset + kPointerSize, kSize> 7517f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch BodyDescriptorWeakCode; 7518756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 7519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions in start_position_and_type. 7520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The source code start position is in the 30 most significant bits of 7521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the start_position_and_type field. 7522109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kIsNamedExpressionBit = 0; 7523109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kIsTopLevelBit = 1; 7524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kStartPositionShift = 2; 7525109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1); 7526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions in compiler_hints. 75283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch enum CompilerHints { 7529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // byte 0 75303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kAllowLazyCompilation, 7531c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kMarkedForTierUp, 7532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kOptimizationDisabled, 753362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kHasDuplicateParameters, 7534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNative, 75353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kStrictModeFunction, 75363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kUsesArguments, 7537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNeedsHomeObject, 7538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // byte 1 7539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kForceInline, 7540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kIsAsmFunction, 754162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kMustUseIgnitionTurbo, 7542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDontFlush, 754362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kIsDeclaration, 754462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kIsAsmWasmBroken, 754562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 754662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kUnused1, // Unused fields. 754762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kUnused2, 754862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 7549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // byte 2 7550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kFunctionKind, 7551f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // rest of byte 2 and first two bits of byte 3 are used by FunctionKind 7552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // byte 3 755362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kCompilerHintsCount = kFunctionKind + 10, // Pseudo entry 755462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 755562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 755662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Bit positions in debugger_hints. 755762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch enum DebuggerHints { 755862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kIsAnonymousExpression, 755962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kNameShouldPrintAsAnonymous, 756062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kDeserialized, 756162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kHasNoSideEffect, 756262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kComputedHasNoSideEffect, 756362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kDebugIsBlackboxed, 756462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kComputedDebugIsBlackboxed, 75653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }; 756662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 7567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // kFunctionKind has to be byte-aligned 7568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT((kFunctionKind % kBitsPerByte) == 0); 7569f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7570f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class FunctionKindBits : public BitField<FunctionKind, kFunctionKind, 10> {}; 7571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DeoptCountBits : public BitField<int, 0, 4> {}; 7573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OptReenableTriesBits : public BitField<int, 4, 18> {}; 7574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ICAgeBits : public BitField<int, 22, 8> {}; 7575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OptCountBits : public BitField<int, 0, 22> {}; 7577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DisabledOptimizationReasonBits : public BitField<int, 22, 8> {}; 7578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 7580e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#if V8_HOST_ARCH_32_BIT 7581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // On 32 bit platforms, compiler hints is a smi. 7582e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static const int kCompilerHintsSmiTagSize = kSmiTagSize; 7583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static const int kCompilerHintsSize = kPointerSize; 7584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#else 7585e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // On 64 bit platforms, compiler hints is not a smi, see comment above. 7586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static const int kCompilerHintsSmiTagSize = 0; 7587e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static const int kCompilerHintsSize = kIntSize; 7588e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#endif 7589e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 7590c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch STATIC_ASSERT(SharedFunctionInfo::kCompilerHintsCount + 7591c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch SharedFunctionInfo::kCompilerHintsSmiTagSize <= 75923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte); 75933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 7595257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Constants for optimizing codegen for strict mode function and 7596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // native tests when using integer-width instructions. 7597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kStrictModeBit = 7598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kStrictModeFunction + kCompilerHintsSmiTagSize; 7599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNativeBit = kNative + kCompilerHintsSmiTagSize; 7600bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kHasDuplicateParametersBit = 7601bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kHasDuplicateParameters + kCompilerHintsSmiTagSize; 7602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7603f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kFunctionKindShift = 7604f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kFunctionKind + kCompilerHintsSmiTagSize; 7605f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kAllFunctionKindBitsMask = FunctionKindBits::kMask 7606f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch << kCompilerHintsSmiTagSize; 7607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7608c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMarkedForTierUpBit = 7609c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kMarkedForTierUp + kCompilerHintsSmiTagSize; 7610c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Constants for optimizing codegen for strict mode function and 76123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // native tests. 76133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Allows to use byte-width instructions. 7614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kStrictModeBitWithinByte = kStrictModeBit % kBitsPerByte; 7615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNativeBitWithinByte = kNativeBit % kBitsPerByte; 7616bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kHasDuplicateParametersBitWithinByte = 7617bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch kHasDuplicateParametersBit % kBitsPerByte; 7618e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 7619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kClassConstructorBitsWithinByte = 7620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FunctionKind::kClassConstructor << kCompilerHintsSmiTagSize; 7621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(kClassConstructorBitsWithinByte < (1 << kBitsPerByte)); 7622257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7623c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMarkedForTierUpBitWithinByte = 7624c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kMarkedForTierUpBit % kBitsPerByte; 7625c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if defined(V8_TARGET_LITTLE_ENDIAN) 7627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define BYTE_OFFSET(compiler_hint) \ 7628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kCompilerHintsOffset + \ 7629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (compiler_hint + kCompilerHintsSmiTagSize) / kBitsPerByte 7630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif defined(V8_TARGET_BIG_ENDIAN) 7631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define BYTE_OFFSET(compiler_hint) \ 7632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kCompilerHintsOffset + (kCompilerHintsSize - 1) - \ 7633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ((compiler_hint + kCompilerHintsSmiTagSize) / kBitsPerByte) 7634e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#else 7635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#error Unknown byte ordering 7636e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch#endif 7637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kStrictModeByteOffset = BYTE_OFFSET(kStrictModeFunction); 7638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNativeByteOffset = BYTE_OFFSET(kNative); 7639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFunctionKindByteOffset = BYTE_OFFSET(kFunctionKind); 7640bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kHasDuplicateParametersByteOffset = 7641bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch BYTE_OFFSET(kHasDuplicateParameters); 7642c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kMarkedForTierUpByteOffset = BYTE_OFFSET(kMarkedForTierUp); 7643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef BYTE_OFFSET 7644e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 7645e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 764662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Returns entry from optimized code map for specified context. 7647c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The result is either kNotFound, or a start index of the context-dependent 7648c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // entry. 764962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int SearchOptimizedCodeMapEntry(Context* native_context); 7650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo); 7652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 7653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Printing support. 7656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct SourceCodeOf { 7657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit SourceCodeOf(SharedFunctionInfo* v, int max = -1) 7658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : value(v), max_length(max) {} 7659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const SharedFunctionInfo* value; 7660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int max_length; 7661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 7662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, const SourceCodeOf& v); 7665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSGeneratorObject: public JSObject { 7668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 7669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [function]: The function corresponding to this generator object. 7670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(function, JSFunction) 7671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [context]: The context of the suspended computation. 7673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(context, Context) 7674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [receiver]: The receiver of the suspended computation. 7676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(receiver, Object) 7677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 767813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [input_or_debug_pos] 767913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // For executing generators: the most recent input value. 768062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // For suspended generators: debug information (bytecode offset). 768113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // There is currently no need to remember the most recent input value for a 768213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // suspended generator. 768313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(input_or_debug_pos, Object) 7684109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 7685bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // [resume_mode]: The most recent resume mode. 7686bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch enum ResumeMode { kNext, kReturn, kThrow }; 7687bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECL_INT_ACCESSORS(resume_mode) 7688bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 768913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // [continuation] 7690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // 769113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // A positive value indicates a suspended generator. The special 7692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kGeneratorExecuting and kGeneratorClosed values indicate that a generator 7693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // cannot be resumed. 7694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int continuation() const; 7695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_continuation(int continuation); 769613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool is_closed() const; 769713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool is_executing() const; 769813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool is_suspended() const; 769913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 770013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // For suspended generators: the source position at which the generator 770113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // is suspended. 770213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int source_position() const; 7703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 770462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // [register_file]: Saved interpreter register file. 770562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(register_file, FixedArray) 7706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSGeneratorObject) 7708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 7710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSGeneratorObject) 7711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Magic sentinel values for the continuation. 7713bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kGeneratorExecuting = -2; 7714bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kGeneratorClosed = -1; 7715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description. 7717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFunctionOffset = JSObject::kHeaderSize; 7718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kContextOffset = kFunctionOffset + kPointerSize; 7719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kReceiverOffset = kContextOffset + kPointerSize; 772013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kInputOrDebugPosOffset = kReceiverOffset + kPointerSize; 772113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kResumeModeOffset = kInputOrDebugPosOffset + kPointerSize; 7722bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kContinuationOffset = kResumeModeOffset + kPointerSize; 772362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kRegisterFileOffset = kContinuationOffset + kPointerSize; 772462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSize = kRegisterFileOffset + kPointerSize; 7725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSGeneratorObject); 7728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 7729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7730c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// When importing a module namespace (import * as foo from "bar"), a 7731c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// JSModuleNamespace object (representing module "bar") is created and bound to 7732c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// the declared variable (foo). A module can have at most one namespace object. 7733c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass JSModuleNamespace : public JSObject { 7734c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 7735c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(JSModuleNamespace) 7736c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(JSModuleNamespace) 7737c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(JSModuleNamespace) 7738c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7739c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The actual module whose namespace is being represented. 7740c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(module, Module) 7741c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7742c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Retrieve the value exported by [module] under the given [name]. If there is 7743c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // no such export, return Just(undefined). If the export is uninitialized, 7744c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // schedule an exception and return Nothing. 7745c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MUST_USE_RESULT MaybeHandle<Object> GetExport(Handle<String> name); 7746c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 774762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // In-object fields. 774862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch enum { 774962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kToStringTagFieldIndex, 775062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kInObjectFieldCount, 775162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 775262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 7753c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kModuleOffset = JSObject::kHeaderSize; 775462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kHeaderSize = kModuleOffset + kPointerSize; 775562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 775662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSize = kHeaderSize + kPointerSize * kInObjectFieldCount; 7757c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7758c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 7759c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSModuleNamespace); 7760c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 7761c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7762f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// A Module object is a mapping from export names to cells 7763f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// This is still very much in flux. 7764f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass Module : public Struct { 7765f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 7766f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_CAST(Module) 7767f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_VERIFIER(Module) 7768f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_PRINTER(Module) 7769f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7770c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The code representing this Module, or an abstraction thereof. 7771c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // This is either a SharedFunctionInfo or a JSFunction or a ModuleInfo 7772c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // depending on whether the module has been instantiated and evaluated. See 7773c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Module::ModuleVerify() for the precise invariant. 7774f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(code, Object) 7775f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7776c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Arrays of cells corresponding to regular exports and regular imports. 7777c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // A cell's position in the array is determined by the cell index of the 7778c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // associated module entry (which coincides with the variable index of the 7779c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // associated variable). 7780c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(regular_exports, FixedArray) 7781c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(regular_imports, FixedArray) 7782c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7783c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The complete export table, mapping an export name to its cell. 7784c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // TODO(neis): We may want to remove the regular exports from the table. 7785f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(exports, ObjectHashTable) 7786f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7787c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Hash for this object (a random non-zero Smi). 7788c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_INT_ACCESSORS(hash) 7789c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7790c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // The namespace object (or undefined). 7791c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(module_namespace, HeapObject) 7792c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7793c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Modules imported or re-exported by this module. 7794f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Corresponds 1-to-1 to the module specifier strings in 7795f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // ModuleInfo::module_requests. 7796f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(requested_modules, FixedArray) 7797f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7798f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Get the ModuleInfo associated with the code. 7799f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline ModuleInfo* info() const; 7800f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7801c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool instantiated() const; 7802c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool evaluated() const; 7803c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void set_evaluated(); 7804f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7805f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Implementation of spec operation ModuleDeclarationInstantiation. 7806f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Returns false if an exception occurred during instantiation, true 7807f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // otherwise. 7808f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT bool Instantiate(Handle<Module> module, 7809f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::Local<v8::Context> context, 7810c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch v8::Module::ResolveCallback callback); 7811f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7812f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Implementation of spec operation ModuleEvaluation. 7813f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT MaybeHandle<Object> Evaluate(Handle<Module> module); 7814f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7815c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<Object> LoadVariable(Handle<Module> module, int cell_index); 7816c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static void StoreVariable(Handle<Module> module, int cell_index, 7817c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> value); 7818f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7819c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Get the namespace object for [module_request] of [module]. If it doesn't 7820c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // exist yet, it is created. 7821c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<JSModuleNamespace> GetModuleNamespace(Handle<Module> module, 7822c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int module_request); 7823f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7824f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kCodeOffset = HeapObject::kHeaderSize; 7825f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kExportsOffset = kCodeOffset + kPointerSize; 7826c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kRegularExportsOffset = kExportsOffset + kPointerSize; 7827c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kRegularImportsOffset = kRegularExportsOffset + kPointerSize; 7828c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kHashOffset = kRegularImportsOffset + kPointerSize; 7829c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kModuleNamespaceOffset = kHashOffset + kPointerSize; 7830c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kRequestedModulesOffset = 7831c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kModuleNamespaceOffset + kPointerSize; 7832c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kRequestedModulesOffset + kPointerSize; 7833f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7834f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 7835c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static void CreateExport(Handle<Module> module, int cell_index, 7836c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<FixedArray> names); 7837f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static void CreateIndirectExport(Handle<Module> module, Handle<String> name, 7838f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ModuleInfoEntry> entry); 7839f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7840c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Get the namespace object for [module]. If it doesn't exist yet, it is 7841c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // created. 7842c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Handle<JSModuleNamespace> GetModuleNamespace(Handle<Module> module); 7843c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7844f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // The [must_resolve] argument indicates whether or not an exception should be 7845f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // thrown in case the module does not provide an export named [name] 7846f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // (including when a cycle is detected). An exception is always thrown in the 7847f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // case of conflicting star exports. 7848f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // 7849f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // If [must_resolve] is true, a null result indicates an exception. If 7850f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // [must_resolve] is false, a null result may or may not indicate an 7851f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // exception (so check manually!). 7852f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch class ResolveSet; 7853f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT MaybeHandle<Cell> ResolveExport( 7854c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Module> module, Handle<String> name, MessageLocation loc, 7855c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch bool must_resolve, ResolveSet* resolve_set); 7856f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT MaybeHandle<Cell> ResolveImport( 7857f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Module> module, Handle<String> name, int module_request, 7858c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MessageLocation loc, bool must_resolve, ResolveSet* resolve_set); 7859f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7860f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Helper for ResolveExport. 7861f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static MUST_USE_RESULT MaybeHandle<Cell> ResolveExportUsingStarExports( 7862c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Module> module, Handle<String> name, MessageLocation loc, 7863c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch bool must_resolve, ResolveSet* resolve_set); 7864f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 7865f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Module); 7866f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 7867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// JSBoundFunction describes a bound function exotic object. 7869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSBoundFunction : public JSObject { 7870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 7871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [bound_target_function]: The wrapped function object. 7872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(bound_target_function, JSReceiver) 7873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [bound_this]: The value that is always passed as the this value when 7875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // calling the wrapped function. 7876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(bound_this, Object) 7877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [bound_arguments]: A list of values whose elements are used as the first 7879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // arguments to any call to the wrapped function. 7880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(bound_arguments, FixedArray) 7881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7882bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static MaybeHandle<String> GetName(Isolate* isolate, 7883bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<JSBoundFunction> function); 7884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Context> GetFunctionRealm( 7885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSBoundFunction> function); 7886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(JSBoundFunction) 7888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 7890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(JSBoundFunction) 7891014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(JSBoundFunction) 7892014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The bound function's string representation implemented according 7894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to ES6 section 19.2.3.5 Function.prototype.toString ( ). 7895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> ToString(Handle<JSBoundFunction> function); 7896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 7898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBoundTargetFunctionOffset = JSObject::kHeaderSize; 7899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBoundThisOffset = kBoundTargetFunctionOffset + kPointerSize; 7900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBoundArgumentsOffset = kBoundThisOffset + kPointerSize; 7901bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kSize = kBoundArgumentsOffset + kPointerSize; 7902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 7904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSBoundFunction); 7905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 7906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// JSFunction describes JavaScript functions. 7909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSFunction: public JSObject { 7910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 7911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [prototype_or_initial_map]: 7912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(prototype_or_initial_map, Object) 7913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7914589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // [shared]: The information about the function that 7915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // can be shared by instances. 7916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(shared, SharedFunctionInfo) 7917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 791813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kLengthDescriptorIndex = 0; 791913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kNameDescriptorIndex = 1; 792013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 7921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [context]: The context for this function. 7922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Context* context(); 792362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool has_context() const; 7924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_context(Object* context); 7925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline JSObject* global_proxy(); 7926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Context* native_context(); 7927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7928bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static Handle<Object> GetName(Isolate* isolate, Handle<JSFunction> function); 7929bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static MaybeHandle<Smi> GetLength(Isolate* isolate, 7930bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<JSFunction> function); 7931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Context> GetFunctionRealm(Handle<JSFunction> function); 7932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [code]: The generated code object for this function. Executed 7934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // when the function is invoked, e.g. foo() or new foo(). See 7935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [[Call]] and [[Construct]] description in ECMA-262, section 7936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 8.6.2, page 27. 7937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Code* code(); 7938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void set_code(Code* code); 7939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_code_no_write_barrier(Code* code); 7940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline void ReplaceCode(Code* code); 7941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 79423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Get the abstract code associated with the function, which will either be 79433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // a Code object or a BytecodeArray. 79443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline AbstractCode* abstract_code(); 79453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 7946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tells whether this function inlines the given shared function info. 7947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool Inlines(SharedFunctionInfo* candidate); 7948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7949c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Tells whether or not this function is interpreted. 7950c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // 7951c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Note: function->IsInterpreted() does not necessarily return the same value 7952c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // as function->shared()->IsInterpreted() because the shared function info 7953c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // could tier up to baseline via a different function closure. The interpreter 7954c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // entry stub will "self-heal" this divergence when the function is executed. 7955c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool IsInterpreted(); 7956c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 7957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Tells whether or not this function has been optimized. 7958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inline bool IsOptimized(); 7959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7960bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Mark this function for lazy recompilation. The function will be recompiled 7961bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // the next time it is executed. 7962bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch void MarkForBaseline(); 7963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MarkForOptimization(); 7964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void AttemptConcurrentOptimization(); 79653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7966bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Tells whether or not the function is already marked for lazy recompilation. 7967bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline bool IsMarkedForBaseline(); 7968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsMarkedForOptimization(); 7969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsMarkedForConcurrentOptimization(); 7970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tells whether or not the function is on the concurrent recompilation queue. 7972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsInOptimizationQueue(); 7973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Completes inobject slack tracking on initial map if it is active. 7975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void CompleteInobjectSlackTrackingIfActive(); 7976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 797762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // [feedback_vector_cell]: Fixed array holding the feedback vector. 797862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(feedback_vector_cell, Cell) 797962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 798062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch enum FeedbackVectorState { 798162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch TOP_LEVEL_SCRIPT_NEEDS_VECTOR, 798262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch NEEDS_VECTOR, 798362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch HAS_VECTOR 798462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 798562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 798662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline FeedbackVectorState GetFeedbackVectorState(Isolate* isolate) const; 7987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 798862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // feedback_vector() can be used once the function is compiled. 798962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline FeedbackVector* feedback_vector() const; 799062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool has_feedback_vector() const; 799113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static void EnsureLiterals(Handle<JSFunction> function); 799213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 799362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Unconditionally clear the type feedback vector. 799413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void ClearTypeFeedbackInfo(); 799513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 7996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The initial map for an object created by this constructor. 7997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Map* initial_map(); 7998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetInitialMap(Handle<JSFunction> function, Handle<Map> map, 7999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> prototype); 8000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_initial_map(); 8001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void EnsureHasInitialMap(Handle<JSFunction> function); 8002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Creates a map that matches the constructor's initial map, but with 8004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [[prototype]] being new.target.prototype. Because new.target can be a 8005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // JSProxy, this can call back into JavaScript. 8006014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<Map> GetDerivedMap( 8007014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSFunction> constructor, 8008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> new_target); 8009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get and set the prototype property on a JSFunction. If the 8011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // function has an initial map the prototype is set on the initial 8012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // map. Otherwise, the prototype is put in the initial map field 8013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // until an initial map is needed. 8014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_prototype(); 8015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool has_instance_prototype(); 8016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* prototype(); 8017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* instance_prototype(); 8018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetPrototype(Handle<JSFunction> function, 8019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 8020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void SetInstancePrototype(Handle<JSFunction> function, 8021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> value); 8022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 80236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // After prototype is removed, it will not be created when accessed, and 80246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // [[Construct]] from this function will not be allowed. 8025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool RemovePrototype(); 8026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns if this function has been compiled to native code yet. 8028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool is_compiled(); 8029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [next_function_link]: Links functions into various lists, e.g. the list 8031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // of optimized functions hanging off the native_context. The CodeFlusher 8032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // uses this link to chain together flushing candidates. Treated weakly 8033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // by the garbage collector. 8034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DECL_ACCESSORS(next_function_link, Object) 8035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Prints the name of the function using PrintF. 8037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void PrintName(FILE* out = stdout); 8038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSFunction) 8040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Calculate the instance size and in-object properties count. 8042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CalculateInstanceSize(InstanceType instance_type, 8043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int requested_internal_fields, int* instance_size, 8044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int* in_object_properties); 8045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CalculateInstanceSizeForDerivedClass(InstanceType instance_type, 8046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int requested_internal_fields, 8047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int* instance_size, 8048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int* in_object_properties); 80493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static void CalculateInstanceSizeHelper(InstanceType instance_type, 80503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int requested_internal_fields, 80513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int requested_in_object_properties, 80523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int* instance_size, 80533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int* in_object_properties); 8054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visiting policy flags define whether the code entry or next function 8055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // should be visited or not. 8056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum BodyVisitingPolicy { 8057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kVisitCodeEntry = 1 << 0, 8058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kVisitNextFunction = 1 << 1, 8059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSkipCodeEntryAndNextFunction = 0, 8061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kVisitCodeEntryAndNextFunction = kVisitCodeEntry | kVisitNextFunction 8062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 8063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterates the function object according to the visiting policy. 8064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <BodyVisitingPolicy> 8065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptorImpl; 8066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visit the whole object. 8068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kVisitCodeEntryAndNextFunction> BodyDescriptor; 8069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Don't visit next function. 8071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kVisitCodeEntry> BodyDescriptorStrongCode; 8072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kSkipCodeEntryAndNextFunction> 8073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BodyDescriptorWeakCode; 8074791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 8075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSFunction) 8077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSFunction) 8078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The function's name if it is configured, otherwise shared function info 8080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // debug name. 8081014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> GetName(Handle<JSFunction> function); 8082014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8083109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // ES6 section 9.2.11 SetFunctionName 8084109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Because of the way this abstract operation is used in the spec, 8085109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // it should never fail. 8086109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static void SetName(Handle<JSFunction> function, Handle<Name> name, 8087109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<String> prefix); 8088109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 8089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The function's displayName if it is set, otherwise name if it is 8090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // configured, otherwise shared function info 8091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // debug name. 8092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> GetDebugName(Handle<JSFunction> function); 8093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The function's string representation implemented according to 8095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 19.2.3.5 Function.prototype.toString ( ). 8096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<String> ToString(Handle<JSFunction> function); 8097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8098b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Layout descriptors. The last property (from kNonWeakFieldsEndOffset to 8099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // kSize) is weak and has special handling during garbage collection. 8100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPrototypeOrInitialMapOffset = JSObject::kHeaderSize; 8101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSharedFunctionInfoOffset = 8102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPrototypeOrInitialMapOffset + kPointerSize; 8103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kContextOffset = kSharedFunctionInfoOffset + kPointerSize; 810462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kFeedbackVectorOffset = kContextOffset + kPointerSize; 810562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kNonWeakFieldsEndOffset = 810662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kFeedbackVectorOffset + kPointerSize; 8107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kCodeEntryOffset = kNonWeakFieldsEndOffset; 8108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNextFunctionLinkOffset = kCodeEntryOffset + kPointerSize; 8109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kSize = kNextFunctionLinkOffset + kPointerSize; 8110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunction); 8113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// JSGlobalProxy's prototype must be a JSGlobalObject or null, 8117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// and the prototype is hidden. JSGlobalProxy always delegates 8118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// property accesses to its prototype if the prototype is not null. 8119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 8120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A JSGlobalProxy can be reinitialized which will preserve its identity. 8121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 8122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Accessing a JSGlobalProxy requires security check. 8123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSGlobalProxy : public JSObject { 8125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [native_context]: the owner native context of this global proxy object. 8127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // It is null value if this object is not used by any context. 8128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(native_context, Object) 8129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [hash]: The hash code property (undefined if not initialized yet). 8131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(hash, Object) 8132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSGlobalProxy) 8134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsDetachedFrom(JSGlobalObject* global) const; 8136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8137c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static int SizeWithInternalFields(int internal_field_count); 8138c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSGlobalProxy) 8141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSGlobalProxy) 8142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 8144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNativeContextOffset = JSObject::kHeaderSize; 8145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHashOffset = kNativeContextOffset + kPointerSize; 8146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kHashOffset + kPointerSize; 8147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalProxy); 8150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// JavaScript global object. 8154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass JSGlobalObject : public JSObject { 8155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [native context]: the natives corresponding to this global object. 8157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(native_context, Context) 8158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [global proxy]: the global proxy object of the context 8160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(global_proxy, JSObject) 8161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void InvalidatePropertyCell(Handle<JSGlobalObject> object, 8164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Name> name); 8165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ensure that the global object has a cell for the given property name. 8166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<PropertyCell> EnsureEmptyPropertyCell( 8167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSGlobalObject> global, Handle<Name> name, 8168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyCellType cell_type, int* entry_out = nullptr); 8169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(JSGlobalObject) 8171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsDetached(); 8173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSGlobalObject) 8176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSGlobalObject) 8177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 8179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNativeContextOffset = JSObject::kHeaderSize; 8180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kGlobalProxyOffset = kNativeContextOffset + kPointerSize; 8181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHeaderSize = kGlobalProxyOffset + kPointerSize; 8182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kHeaderSize; 8183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalObject); 8186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 81893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Representation for JS Wrapper objects, String, Number, Boolean, etc. 8190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSValue: public JSObject { 8191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [value]: the object being wrapped. 8193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(value, Object) 8194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSValue) 8196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSValue) 8199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSValue) 8200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 8202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kValueOffset = JSObject::kHeaderSize; 8203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kValueOffset + kPointerSize; 8204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSValue); 8207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 82091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 82103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass DateCache; 82113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 82123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Representation for JS date objects. 82133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass JSDate: public JSObject { 82143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 8215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MUST_USE_RESULT MaybeHandle<JSDate> New(Handle<JSFunction> constructor, 8216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> new_target, 8217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch double tv); 8218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 82193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If one component is NaN, all of them are, indicating a NaN time value. 82203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [value]: the time value. 82213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(value, Object) 82223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [year]: caches year. Either undefined, smi, or NaN. 82233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(year, Object) 82243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [month]: caches month. Either undefined, smi, or NaN. 82253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(month, Object) 82263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [day]: caches day. Either undefined, smi, or NaN. 82273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(day, Object) 82283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [weekday]: caches day of week. Either undefined, smi, or NaN. 82293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(weekday, Object) 82303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [hour]: caches hours. Either undefined, smi, or NaN. 82313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(hour, Object) 82323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [min]: caches minutes. Either undefined, smi, or NaN. 82333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(min, Object) 82343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [sec]: caches seconds. Either undefined, smi, or NaN. 82353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(sec, Object) 82363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [cache stamp]: sample of the date cache stamp at the 8237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // moment when chached fields were cached. 82383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(cache_stamp, Object) 82393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSDate) 82413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns the time value (UTC) identifying the current time. 8243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static double CurrentTimeValue(Isolate* isolate); 8244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 82453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns the date field with the specified index. 82463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // See FieldIndex for the list of date fields. 8247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Object* GetField(Object* date, Smi* index); 82483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> SetValue(Handle<JSDate> date, double v); 8250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 82513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void SetValue(Object* value, bool is_value_nan); 82523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 82533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Dispatched behavior. 8254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSDate) 8255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSDate) 8256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The order is important. It must be kept in sync with date macros 82583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // in macros.py. 82593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum FieldIndex { 82603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDateValue, 82613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kYear, 82623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMonth, 82633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDay, 82643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kWeekday, 82653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kHour, 82663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMinute, 82673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kSecond, 82683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kFirstUncachedField, 82693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMillisecond = kFirstUncachedField, 82703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDays, 82713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kTimeInDay, 82723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kFirstUTCField, 82733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kYearUTC = kFirstUTCField, 82743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMonthUTC, 82753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDayUTC, 82763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kWeekdayUTC, 82773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kHourUTC, 82783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMinuteUTC, 82793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kSecondUTC, 82803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kMillisecondUTC, 82813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDaysUTC, 82823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kTimeInDayUTC, 82833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kTimezoneOffset 82843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 82853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 82863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Layout description. 82873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kValueOffset = JSObject::kHeaderSize; 82883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kYearOffset = kValueOffset + kPointerSize; 82893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMonthOffset = kYearOffset + kPointerSize; 82903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kDayOffset = kMonthOffset + kPointerSize; 82913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kWeekdayOffset = kDayOffset + kPointerSize; 82923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kHourOffset = kWeekdayOffset + kPointerSize; 82933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMinOffset = kHourOffset + kPointerSize; 82943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSecOffset = kMinOffset + kPointerSize; 82953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kCacheStampOffset = kSecOffset + kPointerSize; 82963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSize = kCacheStampOffset + kPointerSize; 82973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 82983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 82993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline Object* DoGetField(FieldIndex index); 83003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 83013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* GetUTCField(FieldIndex index, double value, DateCache* date_cache); 83023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 83033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Computes and caches the cacheable fields of the date. 8304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetCachedFields(int64_t local_time_ms, DateCache* date_cache); 83053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 83063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 83073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSDate); 83083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 83093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 83103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 83111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Representation of message objects used for error reporting through 83121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// the API. The messages are formatted in JavaScript so this object is 83131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// a real JavaScript object. The information used for formatting the 83141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// error messages are not directly accessible from JavaScript to 83151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// prevent leaking information to user code called during error 83161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// formatting. 83171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass JSMessageObject: public JSObject { 83181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 83191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [type]: the type of error message. 8320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int type() const; 8321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_type(int value); 83221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 83231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [arguments]: the arguments for formatting the error message. 8324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(argument, Object) 83251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 83261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [script]: the script from which the error message originated. 83271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block DECL_ACCESSORS(script, Object) 83281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 83291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [stack_frames]: an array of stack frames for this error object. 83301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block DECL_ACCESSORS(stack_frames, Object) 83311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 83321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [start_position]: the start position in the script for the error message. 8333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int start_position() const; 83341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block inline void set_start_position(int value); 83351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 83361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // [end_position]: the end position in the script for the error message. 8337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int end_position() const; 83381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block inline void set_end_position(int value); 83391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 8340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int GetLineNumber() const; 8341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns the offset of the given position within the containing line. 8343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int GetColumnNumber() const; 8344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 8345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns the source code line containing the given source 8346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // position, or the empty string if the position is invalid. 8347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<String> GetSourceLine() const; 8348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 834962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline int error_level() const; 835062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_error_level(int level); 835162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSMessageObject) 83531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 83541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Dispatched behavior. 8355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSMessageObject) 8356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSMessageObject) 83571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 83581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // Layout description. 83591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kTypeOffset = JSObject::kHeaderSize; 83601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kArgumentsOffset = kTypeOffset + kPointerSize; 83611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kScriptOffset = kArgumentsOffset + kPointerSize; 8362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStackFramesOffset = kScriptOffset + kPointerSize; 83631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kStartPositionOffset = kStackFramesOffset + kPointerSize; 83641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static const int kEndPositionOffset = kStartPositionOffset + kPointerSize; 836562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kErrorLevelOffset = kEndPositionOffset + kPointerSize; 836662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSize = kErrorLevelOffset + kPointerSize; 83671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 83681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block typedef FixedBodyDescriptor<HeapObject::kMapOffset, 83691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kStackFramesOffset + kPointerSize, 83701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kSize> BodyDescriptor; 83711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 83721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 837362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass JSPromise; 837462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 837562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// TODO(caitp): Make this a Struct once properties are no longer accessed from 837662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// JS 837762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass JSPromiseCapability : public JSObject { 837862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 837962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_CAST(JSPromiseCapability) 838062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 838162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_VERIFIER(JSPromiseCapability) 838262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 838362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(promise, Object) 838462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(resolve, Object) 838562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(reject, Object) 838662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 838762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kPromiseOffset = JSObject::kHeaderSize; 838862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kResolveOffset = kPromiseOffset + kPointerSize; 838962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kRejectOffset = kResolveOffset + kPointerSize; 839062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSize = kRejectOffset + kPointerSize; 839162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 839262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch enum InObjectPropertyIndex { 839362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kPromiseIndex, 839462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kResolveIndex, 839562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kRejectIndex, 839662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kInObjectPropertyCount // Dummy. 839762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 839862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 839962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 840062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSPromiseCapability); 840162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 840262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 840362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass JSPromise : public JSObject { 840462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 840562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_INT_ACCESSORS(status) 840662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(result, Object) 840762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 840862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // There are 3 possible states for these fields -- 840962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // 1) Undefined -- This is the zero state when there is no callback 841062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // or deferred fields registered. 841162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // 841262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // 2) Object -- There is a single callback directly attached to the 841362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // fulfill_reactions, reject_reactions and the deferred fields are 841462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // directly attached to the slots. In this state, deferred_promise 841562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // is a JSReceiver and deferred_on_{resolve, reject} are Callables. 841662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // 841762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // 3) FixedArray -- There is more than one callback and deferred 841862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // fields attached to a FixedArray. 841962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // 842062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // The callback can be a Callable or a Symbol. 842162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(deferred_promise, Object) 842262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(deferred_on_resolve, Object) 842362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(deferred_on_reject, Object) 842462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(fulfill_reactions, Object) 842562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(reject_reactions, Object) 842662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 842762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_INT_ACCESSORS(flags) 842862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 842962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // [has_handler]: Whether this promise has a reject handler or not. 843062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(has_handler) 843162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 843262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // [handled_hint]: Whether this promise will be handled by a catch 843362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // block in an async function. 843462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(handled_hint) 843562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 843662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const char* Status(int status); 843762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 843862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_CAST(JSPromise) 843962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 844062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Dispatched behavior. 844162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_PRINTER(JSPromise) 844262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_VERIFIER(JSPromise) 844362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 844462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Layout description. 844562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kStatusOffset = JSObject::kHeaderSize; 844662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kResultOffset = kStatusOffset + kPointerSize; 844762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kDeferredPromiseOffset = kResultOffset + kPointerSize; 844862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kDeferredOnResolveOffset = 844962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kDeferredPromiseOffset + kPointerSize; 845062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kDeferredOnRejectOffset = 845162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kDeferredOnResolveOffset + kPointerSize; 845262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kFulfillReactionsOffset = 845362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kDeferredOnRejectOffset + kPointerSize; 845462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kRejectReactionsOffset = 845562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kFulfillReactionsOffset + kPointerSize; 845662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kFlagsOffset = kRejectReactionsOffset + kPointerSize; 845762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSize = kFlagsOffset + kPointerSize; 845862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 845962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Flags layout. 846062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kHasHandlerBit = 0; 846162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kHandledHintBit = 1; 846262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 846362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 8464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Regular expressions 8465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The regular expression holds a single reference to a FixedArray in 8466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the kDataOffset field. 8467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The FixedArray contains the following data: 8468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - tag : type of regexp implementation (not compiled yet, atom or irregexp) 8469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - reference to the original source string 8470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - reference to the original flag string 8471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If it is an atom regexp 8472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - a reference to a literal string to search for 8473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// If it is an irregexp regexp: 8474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - a reference to code for Latin1 inputs (bytecode or compiled), or a smi 8475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// used for tracking the last usage (used for code flushing). 8476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// - a reference to code for UC16 inputs (bytecode or compiled), or a smi 8477257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// used for tracking the last usage (used for code flushing).. 8478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - max number of registers used by irregexp implementations. 8479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - number of capture registers (output values) of the regexp. 8480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSRegExp: public JSObject { 8481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Meaning of Type: 8483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // NOT_COMPILED: Initial value. No data has been stored in the JSRegExp yet. 8484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ATOM: A simple string to match against using an indexOf operation. 8485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // IRREGEXP: Compiled with Irregexp. 8486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum Type { NOT_COMPILED, ATOM, IRREGEXP }; 8487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Flag { 8488014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kNone = 0, 8489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kGlobal = 1 << 0, 8490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kIgnoreCase = 1 << 1, 8491014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kMultiline = 1 << 2, 8492014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kSticky = 1 << 3, 8493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kUnicode = 1 << 4, 8494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 8495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef base::Flags<Flag> Flags; 8496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(data, Object) 8498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(flags, Object) 8499014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(source, Object) 8500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8501f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE static MaybeHandle<JSRegExp> New(Handle<String> source, 8502f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Flags flags); 8503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<JSRegExp> Copy(Handle<JSRegExp> regexp); 8504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<JSRegExp> Initialize(Handle<JSRegExp> regexp, 8506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> source, Flags flags); 8507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<JSRegExp> Initialize(Handle<JSRegExp> regexp, 8508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> source, 8509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> flags_string); 8510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Type TypeTag(); 8512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int CaptureCount(); 8513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Flags GetFlags(); 8514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline String* Pattern(); 8515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* DataAt(int index); 8516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set implementation data after the object has been prepared. 8517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SetDataAt(int index, Object* value); 8518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8519c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void SetLastIndex(int index); 8520c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline Object* LastIndex(); 8521c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 8522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int code_index(bool is_latin1) { 8523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_latin1) { 8524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kIrregexpLatin1CodeIndex; 8525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 8526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return kIrregexpUC16CodeIndex; 8527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int saved_code_index(bool is_latin1) { 8531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_latin1) { 8532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kIrregexpLatin1CodeSavedIndex; 8533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 8534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return kIrregexpUC16CodeSavedIndex; 8535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 8536257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 8537257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSRegExp) 8539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 8541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(JSRegExp) 8542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSRegExp) 8543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDataOffset = JSObject::kHeaderSize; 8545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSourceOffset = kDataOffset + kPointerSize; 8546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFlagsOffset = kSourceOffset + kPointerSize; 8547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kFlagsOffset + kPointerSize; 8548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Indices in the data array. 8550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kTagIndex = 0; 8551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSourceIndex = kTagIndex + 1; 8552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kFlagsIndex = kSourceIndex + 1; 8553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDataIndex = kFlagsIndex + 1; 8554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The data fields are used in different ways depending on the 8555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // value of the tag. 8556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Atom regexps (literal strings). 8557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAtomPatternIndex = kDataIndex; 8558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAtomDataSize = kAtomPatternIndex + 1; 8560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Irregexp compiled code or bytecode for Latin1. If compilation 8562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // fails, this fields hold an exception object that should be 8563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // thrown if the regexp is used again. 8564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIrregexpLatin1CodeIndex = kDataIndex; 8565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Irregexp compiled code or bytecode for UC16. If compilation 8566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // fails, this fields hold an exception object that should be 8567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // thrown if the regexp is used again. 8568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kIrregexpUC16CodeIndex = kDataIndex + 1; 8569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Saved instance of Irregexp compiled code or bytecode for Latin1 that 8571257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // is a potential candidate for flushing. 8572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIrregexpLatin1CodeSavedIndex = kDataIndex + 2; 8573257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Saved instance of Irregexp compiled code or bytecode for UC16 that is 8574257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // a potential candidate for flushing. 8575257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kIrregexpUC16CodeSavedIndex = kDataIndex + 3; 8576257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximal number of registers used by either Latin1 or UC16. 8578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only used to check that there is enough stack space 8579257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kIrregexpMaxRegisterCountIndex = kDataIndex + 4; 8580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Number of captures in the compiled regexp. 8581257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kIrregexpCaptureCountIndex = kDataIndex + 5; 858213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Maps names of named capture groups (at indices 2i) to their corresponding 858313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // capture group indices (at indices 2i + 1). 858413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kIrregexpCaptureNameMapIndex = kDataIndex + 6; 8585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 858613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kIrregexpDataSize = kIrregexpCaptureNameMapIndex + 1; 8587e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 8588e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Offsets directly into the data fixed array. 8589e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kDataTagOffset = 8590e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke FixedArray::kHeaderSize + kTagIndex * kPointerSize; 8591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDataOneByteCodeOffset = 8592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedArray::kHeaderSize + kIrregexpLatin1CodeIndex * kPointerSize; 8593d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke static const int kDataUC16CodeOffset = 8594d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke FixedArray::kHeaderSize + kIrregexpUC16CodeIndex * kPointerSize; 8595e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke static const int kIrregexpCaptureCountOffset = 8596e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke FixedArray::kHeaderSize + kIrregexpCaptureCountIndex * kPointerSize; 85976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 85986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // In-object fields. 8599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kLastIndexFieldIndex = 0; 8600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInObjectFieldCount = 1; 8601257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8602257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // The uninitialized value for a regexp code object. 8603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kUninitializedValue = -1; 8604257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8605257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // The compilation error value for the regexp code object. The real error 8606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // object is in the saved code field. 8607257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kCompilationErrorValue = -2; 8608257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 8609257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // When we store the sweep generation at which we moved the code from the 8610257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // code index to the saved code index we mask it of to be in the [0:255] 8611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // range. 8612257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static const int kCodeAgeMask = 0xff; 8613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_OPERATORS_FOR_FLAGS(JSRegExp::Flags) 8616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 8617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8618c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass CompilationCacheShape : public BaseShape<HashTableKey*> { 8619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool IsMatch(HashTableKey* key, Object* value) { 8621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->IsMatch(value); 8622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline uint32_t Hash(HashTableKey* key) { 8625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->Hash(); 8626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 8629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return key->HashForObject(object); 8630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 8631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 8633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPrefixSize = 0; 863562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kEntrySize = 3; 8636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 863862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass InfoVectorPair { 863962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 864062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch InfoVectorPair() : shared_(nullptr), vector_cell_(nullptr) {} 864162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch InfoVectorPair(SharedFunctionInfo* shared, Cell* vector_cell) 864262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : shared_(shared), vector_cell_(vector_cell) {} 864362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 864462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SharedFunctionInfo* shared() const { return shared_; } 864562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Cell* vector() const { return vector_cell_; } 864662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 864762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool has_shared() const { return shared_ != nullptr; } 864862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool has_vector() const { return vector_cell_ != nullptr; } 864962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 865062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 865162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SharedFunctionInfo* shared_; 865262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Cell* vector_cell_; 865362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 86543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 8655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// This cache is used in two different variants. For regexp caching, it simply 8656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// maps identifying info of the regexp to the cached regexp object. Scripts and 8657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// eval code only gets cached after a second probe for the code object. To do 8658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// so, on first "put" only a hash identifying the source is entered into the 8659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// cache, mapping it to a lifetime count of the hash. On each call to Age all 8660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// such lifetimes get reduced, and removed once they reach zero. If a second put 8661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// is called while such a hash is live in the cache, the hash gets replaced by 8662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// an actual cache entry. Age also removes stale live entries from the cache. 8663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Such entries are identified by SharedFunctionInfos pointing to either the 8664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// recompilation stub, or to "old" code. This avoids memory leaks due to 8665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// premature caching of scripts and eval strings that are never needed later. 8666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CompilationCacheTable: public HashTable<CompilationCacheTable, 8667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CompilationCacheShape, 8668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HashTableKey*> { 8669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Find cached value for a string key, otherwise return null. 8671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> Lookup( 8672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> src, Handle<Context> context, LanguageMode language_mode); 867362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch InfoVectorPair LookupScript(Handle<String> src, Handle<Context> context, 867462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch LanguageMode language_mode); 867562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch InfoVectorPair LookupEval(Handle<String> src, 867662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<SharedFunctionInfo> shared, 867762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Context> native_context, 867862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch LanguageMode language_mode, int position); 8679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> LookupRegExp(Handle<String> source, JSRegExp::Flags flags); 8680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<CompilationCacheTable> Put( 8681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<CompilationCacheTable> cache, Handle<String> src, 8682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Context> context, LanguageMode language_mode, 8683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value); 868462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<CompilationCacheTable> PutScript( 868562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<CompilationCacheTable> cache, Handle<String> src, 868662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Context> context, LanguageMode language_mode, 868762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<SharedFunctionInfo> value, Handle<Cell> literals); 8688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<CompilationCacheTable> PutEval( 8689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<CompilationCacheTable> cache, Handle<String> src, 869062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<SharedFunctionInfo> outer_info, Handle<SharedFunctionInfo> value, 869162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Context> native_context, Handle<Cell> literals, int position); 8692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<CompilationCacheTable> PutRegExp( 8693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<CompilationCacheTable> cache, Handle<String> src, 8694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSRegExp::Flags flags, Handle<FixedArray> value); 8695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void Remove(Object* value); 8696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void Age(); 8697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashGenerations = 10; 8698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(CompilationCacheTable) 8700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 8702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheTable); 8703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 8704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8706c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass CodeCacheHashTableShape : public BaseShape<HashTableKey*> { 87076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 87086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static inline bool IsMatch(HashTableKey* key, Object* value) { 87096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return key->IsMatch(value); 87106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 87116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 87126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static inline uint32_t Hash(HashTableKey* key) { 87136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return key->Hash(); 87146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 87156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 87166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 87176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return key->HashForObject(object); 87186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 87196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 8720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 87216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 87226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kPrefixSize = 0; 8723bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // The both the key (name + flags) and value (code object) can be derived from 8724bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // the fixed array that stores both the name and code. 8725bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // TODO(verwaest): Don't allocate a fixed array but inline name and code. 8726bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Rewrite IsMatch to get table + index as input rather than just the raw key. 8727bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kEntrySize = 1; 87286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 87296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 87306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 8731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeCacheHashTable: public HashTable<CodeCacheHashTable, 8732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeCacheHashTableShape, 87336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block HashTableKey*> { 87346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 8735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<CodeCacheHashTable> Put( 8736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<CodeCacheHashTable> table, 8737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name, 8738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code); 87396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 8740bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Code* Lookup(Name* name, Code::Flags flags); 87416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 8742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(CodeCacheHashTable) 87436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 87446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 87456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCacheHashTable); 87466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 87476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 87486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 87493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass TypeFeedbackInfo: public Struct { 87503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 87513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline int ic_total_count(); 87523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_ic_total_count(int count); 87533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87548f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch inline int ic_with_type_info_count(); 8755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void change_ic_with_type_info_count(int delta); 87563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int ic_generic_count(); 8758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void change_ic_generic_count(int delta); 87593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void initialize_storage(); 8761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void change_own_type_change_checksum(); 8763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int own_type_change_checksum(); 8764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_inlined_type_change_checksum(int checksum); 8766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool matches_inlined_type_change_checksum(int checksum); 87673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(TypeFeedbackInfo) 8769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 8771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(TypeFeedbackInfo) 8772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(TypeFeedbackInfo) 8773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStorage1Offset = HeapObject::kHeaderSize; 8775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStorage2Offset = kStorage1Offset + kPointerSize; 8776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStorage3Offset = kStorage2Offset + kPointerSize; 8777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kStorage3Offset + kPointerSize; 87783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 87793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 8780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTypeChangeChecksumBits = 7; 8781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ICTotalCountField: public BitField<int, 0, 8783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize - kTypeChangeChecksumBits> {}; // NOLINT 8784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OwnTypeChangeChecksum: public BitField<int, 8785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize - kTypeChangeChecksumBits, 8786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTypeChangeChecksumBits> {}; // NOLINT 8787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ICsWithTypeInfoCountField: public BitField<int, 0, 8788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize - kTypeChangeChecksumBits> {}; // NOLINT 8789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class InlinedTypeChangeChecksum: public BitField<int, 8790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSmiValueSize - kTypeChangeChecksumBits, 8791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTypeChangeChecksumBits> {}; // NOLINT 8792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 87933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackInfo); 87943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 87953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationSite: public Struct { 87973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 8798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kMaximumArrayBytesToPretransition = 8 * 1024; 8799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const double kPretenureRatio; 8800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPretenureMinimumCreated = 100; 8801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Values for pretenure decision field. 8803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum PretenureDecision { 8804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kUndecided = 0, 8805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDontTenure = 1, 8806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kMaybeTenure = 2, 8807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTenure = 3, 8808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kZombie = 4, 8809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLastPretenureDecisionValue = kZombie 8810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 88113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* PretenureDecisionName(PretenureDecision decision); 88133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(transition_info, Object) 8815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // nested_site threads a list of sites that represent nested literals 8816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // walked in a particular order. So [[1, 2], 1, 2] will have one 8817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // nested_site, but [[1, 2], 3, [4]] will have a list of two. 8818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(nested_site, Object) 8819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(pretenure_data) 8820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(pretenure_create_count) 8821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(dependent_code, DependentCode) 8822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(weak_next, Object) 88233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Initialize(); 88253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This method is expensive, it should only be called for reporting. 8827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsNestedSite(); 8828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // transition_info bitfields, for constructed array transition info. 8830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ElementsKindBits: public BitField<ElementsKind, 0, 15> {}; 8831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class UnusedBits: public BitField<int, 15, 14> {}; 8832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DoNotInlineBit: public BitField<bool, 29, 1> {}; 8833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bitfields for pretenure_data 8835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class MementoFoundCountBits: public BitField<int, 0, 26> {}; 8836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class PretenureDecisionBits: public BitField<PretenureDecision, 26, 3> {}; 8837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class DeoptDependentCodeBit: public BitField<bool, 29, 1> {}; 8838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(PretenureDecisionBits::kMax >= kLastPretenureDecisionValue); 8839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Increments the mementos found counter and returns true when the first 8841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // memento was found for a given allocation site. 8842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IncrementMementoFoundCount(int increment = 1); 8843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void IncrementMementoCreateCount(); 8845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag GetPretenureMode(); 8847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ResetPretenureDecision(); 8849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline PretenureDecision pretenure_decision(); 8851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_pretenure_decision(PretenureDecision decision); 8852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool deopt_dependent_code(); 8854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_deopt_dependent_code(bool deopt); 8855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int memento_found_count(); 8857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_memento_found_count(int count); 8858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline int memento_create_count(); 8860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_memento_create_count(int count); 8861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The pretenuring decision is made during gc, and the zombie state allows 8863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // us to recognize when an allocation site is just being kept alive because 8864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a later traversal of new space may discover AllocationMementos that point 8865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to this AllocationSite. 8866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsZombie(); 8867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsMaybeTenure(); 8869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void MarkZombie(); 8871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool MakePretenureDecision(PretenureDecision current_decision, 8873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double ratio, 8874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool maximum_size_scavenge); 8875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool DigestPretenuringFeedback(bool maximum_size_scavenge); 8877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ElementsKind GetElementsKind(); 8879014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetElementsKind(ElementsKind kind); 8880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool CanInlineCall(); 8882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetDoNotInlineCall(); 8883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool SitePointsToLiteral(); 8885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch template <AllocationSiteUpdateMode update_or_check = 8887f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AllocationSiteUpdateMode::kUpdate> 8888f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static bool DigestTransitionFeedback(Handle<AllocationSite> site, 8889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind); 8890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AllocationSite) 8892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AllocationSite) 8893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AllocationSite) 8895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline AllocationSiteMode GetMode( 8896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind boilerplate_elements_kind); 8897c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static AllocationSiteMode GetMode(ElementsKind from, ElementsKind to); 8898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool CanTrack(InstanceType type); 8899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTransitionInfoOffset = HeapObject::kHeaderSize; 8901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNestedSiteOffset = kTransitionInfoOffset + kPointerSize; 8902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPretenureDataOffset = kNestedSiteOffset + kPointerSize; 8903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPretenureCreateCountOffset = 8904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPretenureDataOffset + kPointerSize; 8905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDependentCodeOffset = 8906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPretenureCreateCountOffset + kPointerSize; 8907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kWeakNextOffset = kDependentCodeOffset + kPointerSize; 8908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kWeakNextOffset + kPointerSize; 8909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // During mark compact we need to take special care for the dependent code 8911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // field. 8912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPointerFieldsBeginOffset = kTransitionInfoOffset; 8913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPointerFieldsEndOffset = kWeakNextOffset; 8914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8915f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch typedef FixedBodyDescriptor<kPointerFieldsBeginOffset, 8916f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch kPointerFieldsEndOffset, kSize> 8917f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MarkingBodyDescriptor; 8918f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 8919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For other visitors, use the fixed body descriptor below. 8920109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch typedef FixedBodyDescriptor<HeapObject::kHeaderSize, kSize, kSize> 8921109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch BodyDescriptor; 8922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 8924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool PretenuringDecisionMade(); 8925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationSite); 89273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 89283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 89293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AllocationMemento: public Struct { 8931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 8932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAllocationSiteOffset = HeapObject::kHeaderSize; 8933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kAllocationSiteOffset + kPointerSize; 8934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(allocation_site, Object) 8936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsValid(); 8938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline AllocationSite* GetAllocationSite(); 8939109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline Address GetAllocationSiteUnchecked(); 8940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AllocationMemento) 8942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AllocationMemento) 8943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AllocationMemento) 8945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 8947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationMemento); 8948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 8949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Representation of a slow alias as part of a sloppy arguments objects. 8952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// For fast aliases (if HasSloppyArgumentsElements()): 8953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - the parameter map contains an index into the context 8954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - all attributes of the element have default values 8955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// For slow aliases (if HasDictionaryArgumentsElements()): 8956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - the parameter map contains no fast alias mapping (i.e. the hole) 8957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - this struct (in the slow backing store) contains an index into the context 8958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// - all attributes are available as part if the property details 8959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass AliasedArgumentsEntry: public Struct { 8960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 8961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int aliased_context_slot() const; 8962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_aliased_context_slot(int count); 8963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AliasedArgumentsEntry) 8965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 8967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AliasedArgumentsEntry) 8968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AliasedArgumentsEntry) 8969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kAliasedContextSlot = HeapObject::kHeaderSize; 8971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kAliasedContextSlot + kPointerSize; 8972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 8974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AliasedArgumentsEntry); 8975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 8976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 89773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum AllowNullsFlag {ALLOW_NULLS, DISALLOW_NULLS}; 8979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum RobustnessFlag {ROBUST_STRING_TRAVERSAL, FAST_STRING_TRAVERSAL}; 8980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8981f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8_EXPORT_PRIVATE StringHasher { 8982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 8983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit inline StringHasher(int length, uint32_t seed); 8984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <typename schar> 8986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t HashSequentialString(const schar* chars, 8987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length, 8988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t seed); 8989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Reads all the data, even for long strings and computes the utf16 length. 8991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static uint32_t ComputeUtf8Hash(Vector<const char> chars, 8992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t seed, 8993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* utf16_length_out); 8994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 899580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // Calculated hash value for a string consisting of 1 to 899680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // String::kMaxArrayIndexSize digits with no leading zeros (except "0"). 899780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen // value is represented decimal value. 89989ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick static uint32_t MakeArrayIndexHash(uint32_t value, int length); 899980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 9000c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // No string is allowed to have a hash of zero. That value is reserved 9001c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // for internal properties. If the hash calculation yields zero then we 9002c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // use 27 instead. 9003c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch static const int kZeroHash = 27; 9004c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 9005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Reusable parts of the hashing algorithm. 9006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(static uint32_t AddCharacterCore(uint32_t running_hash, uint16_t c)); 9007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(static uint32_t GetHashCore(uint32_t running_hash)); 9008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier INLINE(static uint32_t ComputeRunningHash(uint32_t running_hash, 9009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const uc16* chars, int length)); 9010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier INLINE(static uint32_t ComputeRunningHashOneByte(uint32_t running_hash, 9011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* chars, 9012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int length)); 9013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 9015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the value to store in the hash field of a string with 9016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the given length and contents. 9017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t GetHashField(); 9018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if the hash of this string can be computed without 9019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // looking at the contents. 9020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool has_trivial_hash(); 9021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Adds a block of characters to the hash. 9022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<typename Char> 9023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void AddCharacters(const Char* chars, int len); 9024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Add a character to the hash. 9027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void AddCharacter(uint16_t c); 9028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Update index. Returns true if string is still an index. 9029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool UpdateIndex(uint16_t c); 9030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length_; 9032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t raw_running_hash_; 9033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t array_index_; 9034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_array_index_; 9035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool is_first_char_; 9036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_COPY_AND_ASSIGN(StringHasher); 9037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass IteratingStringHasher : public StringHasher { 9041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 9042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline uint32_t Hash(String* string, uint32_t seed); 9043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VisitOneByteString(const uint8_t* chars, int length); 9044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VisitTwoByteString(const uint16_t* chars, int length); 9045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline IteratingStringHasher(int len, uint32_t seed); 9048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void VisitConsString(ConsString* cons_string); 9049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_COPY_AND_ASSIGN(IteratingStringHasher); 9050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 905144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 905244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 9053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The characteristics of a string are stored in its map. Retrieving these 9054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// few bits of information is moderately expensive, involving two memory 9055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// loads where the second is dependent on the first. To improve efficiency 9056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// the shape of the string is given its own class so that it can be retrieved 9057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// once and used for several string operations. A StringShape is small enough 9058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// to be passed by value and is immutable, but be aware that flattening a 9059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// string can potentially alter its shape. Also be aware that a GC caused by 9060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// something else can alter the shape of a string due to ConsString 9061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// shortcutting. Keeping these restrictions in mind has proven to be error- 9062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// prone and so we no longer put StringShapes in variables unless there is a 9063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// concrete performance benefit at that particular point in the code. 9064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass StringShape BASE_EMBEDDED { 9065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline explicit StringShape(const String* s); 9067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline explicit StringShape(Map* s); 9068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline explicit StringShape(InstanceType t); 9069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsSequential(); 9070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsExternal(); 9071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsCons(); 907269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline bool IsSliced(); 907362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool IsThin(); 907469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline bool IsIndirect(); 9075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsExternalOneByte(); 9076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsExternalTwoByte(); 9077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsSequentialOneByte(); 9078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsSequentialTwoByte(); 9079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsInternalized(); 9080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline StringRepresentationTag representation_tag(); 908169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline uint32_t encoding_tag(); 9082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint32_t full_representation_tag(); 9083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint32_t size_tag(); 9084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 9085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint32_t type() { return type_; } 9086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void invalidate() { valid_ = false; } 9087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool valid() { return valid_; } 9088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 9089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void invalidate() { } 9090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 90913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type_; 9094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 9095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_valid() { valid_ = true; } 9096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool valid_; 9097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else 9098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_valid() { } 9099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 9100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The Name abstract class captures anything that can be used as a property 9104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// name, i.e., strings and symbols. All names store a hash value. 9105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Name: public HeapObject { 9106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 9107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get and set the hash field of the name. 9108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint32_t hash_field(); 9109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_hash_field(uint32_t value); 9110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tells whether the hash code has been computed. 9112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasHashCode(); 9113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns a hash value used for the property table 9115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint32_t Hash(); 9116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Equality operations. 9118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool Equals(Name* other); 9119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static bool Equals(Handle<Name> one, Handle<Name> two); 9120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Conversion. 9122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool AsArrayIndex(uint32_t* index); 9123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the name is private, it can only name own properties. 9125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsPrivate(); 9126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9127109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch inline bool IsUniqueName() const; 9128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Return a string version of this name that is converted according to the 9130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // rules described in ES6 section 9.2.11. 9131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<String> ToFunctionName(Handle<Name> name); 913213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch MUST_USE_RESULT static MaybeHandle<String> ToFunctionName( 913313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<Name> name, Handle<String> prefix); 9134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Name) 9136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Name) 9138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 9139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void NameShortPrint(); 9140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int NameShortPrint(Vector<char> str); 9141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 9142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description. 9144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashFieldSlot = HeapObject::kHeaderSize; 9145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT 9146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashFieldOffset = kHashFieldSlot; 9147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#else 9148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kHashFieldOffset = kHashFieldSlot + kIntSize; 9149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 9150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kSize = kHashFieldSlot + kPointerSize; 9151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Mask constant for checking if a name has a computed hash code 9153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and if it is a string that is an array index. The least significant bit 9154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // indicates whether a hash code has been computed. If the hash code has 9155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // been computed the 2nd bit tells whether the string can be used as an 9156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // array index. 9157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHashNotComputedMask = 1; 9158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIsNotArrayIndexMask = 1 << 1; 9159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNofHashBitFields = 2; 9160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shift constant retrieving hash code from hash field. 9162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kHashShift = kNofHashBitFields; 9163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only these bits are relevant in the hash, since the top two are shifted 9165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // out. 9166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kHashBitMask = 0xffffffffu >> kHashShift; 9167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Array index strings this short can keep their index in the hash field. 9169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxCachedArrayIndexLength = 7; 9170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 917113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Maximum number of characters to consider when trying to convert a string 917213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // value into an array index. 917313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kMaxArrayIndexSize = 10; 917413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 9175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For strings which are array indexes the hash value has the string length 9176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // mixed into the hash, mainly to avoid a hash value of zero which would be 9177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the case for the string '0'. 24 bits are used for the array index value. 9178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kArrayIndexValueBits = 24; 9179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kArrayIndexLengthBits = 9180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kBitsPerInt - kArrayIndexValueBits - kNofHashBitFields; 9181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 918213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch STATIC_ASSERT(kArrayIndexLengthBits > 0); 918313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch STATIC_ASSERT(kMaxArrayIndexSize < (1 << kArrayIndexLengthBits)); 9184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ArrayIndexValueBits : public BitField<unsigned int, kNofHashBitFields, 9186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayIndexValueBits> {}; // NOLINT 9187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ArrayIndexLengthBits : public BitField<unsigned int, 9188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNofHashBitFields + kArrayIndexValueBits, 9189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayIndexLengthBits> {}; // NOLINT 9190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that kMaxCachedArrayIndexLength + 1 is a power of two so we 9192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // could use a mask to test if the length of string is less than or equal to 9193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kMaxCachedArrayIndexLength. 9194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(IS_POWER_OF_TWO(kMaxCachedArrayIndexLength + 1)); 9195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const unsigned int kContainsCachedArrayIndexMask = 9197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (~static_cast<unsigned>(kMaxCachedArrayIndexLength) 9198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch << ArrayIndexLengthBits::kShift) | 9199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsNotArrayIndexMask; 9200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Value of empty hash field indicating that the hash is not computed. 9202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kEmptyHashField = 9203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsNotArrayIndexMask | kHashNotComputedMask; 9204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 9206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsHashFieldComputed(uint32_t field); 9207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Name); 9210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ES6 symbols. 9214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Symbol: public Name { 9215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 9216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [name]: The print name of a symbol, or undefined if none. 9217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(name, Object) 9218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(flags) 9220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [is_private]: Whether this is a private symbol. Private symbols can only 9222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // be used to designate own properties of objects. 9223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(is_private) 9224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [is_well_known_symbol]: Whether this is a spec-defined well-known symbol, 9226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or not. Well-known symbols do not throw when an access check fails during 9227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // a load. 9228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(is_well_known_symbol) 9229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 923062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // [is_public]: Whether this is a symbol created by Symbol.for. Calling 923162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Symbol.keyFor on such a symbol simply needs to return the attached name. 923262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_BOOLEAN_ACCESSORS(is_public) 923362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 9234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Symbol) 9235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 9237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Symbol) 9238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Symbol) 9239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description. 9241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNameOffset = Name::kSize; 9242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kFlagsOffset = kNameOffset + kPointerSize; 9243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kFlagsOffset + kPointerSize; 9244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 924562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Flags layout. 924662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kPrivateBit = 0; 924762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kWellKnownSymbolBit = 1; 924862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kPublicBit = 2; 924962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 9250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef FixedBodyDescriptor<kNameOffset, kFlagsOffset, kSize> BodyDescriptor; 9251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SymbolShortPrint(std::ostream& os); 9253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 9255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const char* PrivateSymbolToName() const; 9256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 9258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier friend class Name; // For PrivateSymbolToName. 9259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 9260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Symbol); 9262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 9263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ConsString; 9266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The String abstract class captures JavaScript string values: 9268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 9269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Ecma-262: 9270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 4.3.16 String Value 9271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A string value is a member of the type String and is a finite 9272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ordered sequence of zero or more 16-bit unsigned integer values. 9273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 9274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// All string values have a length field. 9275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass String: public Name { 9276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Encoding { ONE_BYTE_ENCODING, TWO_BYTE_ENCODING }; 9278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class SubStringRange { 9280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 9281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit inline SubStringRange(String* string, int first = 0, 9282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = -1); 9283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class iterator; 9284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline iterator begin(); 9285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline iterator end(); 9286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9287014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 9288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch String* string_; 9289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int first_; 9290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length_; 9291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch }; 9292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 929369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Representation of the flat content of a String. 929469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // A non-flat string doesn't have flat content. 929569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // A flat string has content that's encoded as a sequence of either 9296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // one-byte chars or two-byte UC16. 929769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returned by String::GetFlatContent(). 929869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch class FlatContent { 929969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 930069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returns true if the string is flat and this structure contains content. 9301bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsFlat() const { return state_ != NON_FLAT; } 9302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if the structure contains one-byte content. 9303bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsOneByte() const { return state_ == ONE_BYTE; } 930469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returns true if the structure contains two-byte content. 9305bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsTwoByte() const { return state_ == TWO_BYTE; } 930669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return the one byte content of the string. Only use if IsOneByte() 9308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // returns true. 9309bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Vector<const uint8_t> ToOneByteVector() const { 9310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(ONE_BYTE, state_); 9311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Vector<const uint8_t>(onebyte_start, length_); 931269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 931369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Return the two-byte content of the string. Only use if IsTwoByte() 931469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // returns true. 9315bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Vector<const uc16> ToUC16Vector() const { 9316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(TWO_BYTE, state_); 9317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Vector<const uc16>(twobyte_start, length_); 9318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9320bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch uc16 Get(int i) const { 9321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(i < length_); 9322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(state_ != NON_FLAT); 9323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (state_ == ONE_BYTE) return onebyte_start[i]; 9324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return twobyte_start[i]; 932569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 932669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool UsesSameString(const FlatContent& other) const { 9328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return onebyte_start == other.onebyte_start; 9329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 9330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 933169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 9332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum State { NON_FLAT, ONE_BYTE, TWO_BYTE }; 933369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 933469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Constructors only used by String::GetFlatContent(). 9335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit FlatContent(const uint8_t* start, int length) 9336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : onebyte_start(start), length_(length), state_(ONE_BYTE) {} 9337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit FlatContent(const uc16* start, int length) 9338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : twobyte_start(start), length_(length), state_(TWO_BYTE) { } 9339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FlatContent() : onebyte_start(NULL), length_(0), state_(NON_FLAT) { } 9340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch union { 9342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* onebyte_start; 9343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uc16* twobyte_start; 9344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 9345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length_; 934669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch State state_; 934769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 934869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch friend class String; 9349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class IterableSubString; 935069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch }; 935169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier template <typename Char> 9353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier INLINE(Vector<const Char> GetCharVector()); 9354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 9355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get and set the length of the string. 9356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int length() const; 9357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_length(int value); 9358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get and set the length of the string using acquire loads and release 9360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // stores. 9361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int synchronized_length() const; 9362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void synchronized_set_length(int value); 9363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns whether this string has only one-byte chars, i.e. all of them can 9365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // be one-byte encoded. This might be the case even if the string is 936669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // two-byte. Such strings may appear when the embedder prefers 9367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // two-byte external representations even for one-byte data. 9368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsOneByteRepresentation() const; 9369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsTwoByteRepresentation() const; 9370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 937169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Cons and slices have an encoding flag that may not represent the actual 937269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // encoding of the underlying string. This is taken into account here. 937369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Requires: this->IsFlat() 9374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsOneByteRepresentationUnderneath(); 937569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline bool IsTwoByteRepresentationUnderneath(); 937669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 93779dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen // NOTE: this should be considered only a hint. False negatives are 93789dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen // possible. 9379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasOnlyOneByteChars(); 93806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 9381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get and set individual two byte chars in the string. 9382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void Set(int index, uint16_t value); 9383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get individual two byte char in the string. Repeated calls 9384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to this method are not efficient unless the string is flat. 9385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(uint16_t Get(int index)); 9386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.3.1 ToNumber Applied to the String Type 9388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> ToNumber(Handle<String> subject); 9389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 9390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Flattens the string. Checks first inline to see if it is 9391f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // necessary. Does nothing if the string is not a cons string. 9392f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // Flattening allocates a sequential string with the same data as 9393f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // the given string and mutates the cons string to a degenerate 9394f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // form, where the first component is the new sequential string and 9395f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // the second component is the empty string. If allocation fails, 9396f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // this function returns a failure. If flattening succeeds, this 9397f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // function returns the sequential string that is now the first 9398f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // component of the cons string. 9399f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // 9400f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // Degenerate cons strings are handled specially by the garbage 9401f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke // collector (see IsShortcutCandidate). 9402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Handle<String> Flatten(Handle<String> string, 9404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure = NOT_TENURED); 9405f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 940669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Tries to return the content of a flat string as a structure holding either 940769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // a flat vector of char or of uc16. 940869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // If the string isn't flat, and therefore doesn't have flat content, the 940969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // returned structure will report so, and can't provide a vector of either 941069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // kind. 941169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch FlatContent GetFlatContent(); 941269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 941369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Returns the parent of a sliced string or first part of a flat cons string. 941469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Requires: StringShape(this).IsIndirect() && this->IsFlat() 941569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline String* GetUnderlying(); 9416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // String relational comparison, implemented according to ES6 section 7.2.11 9418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Abstract Relational Comparison (step 5): The comparison of Strings uses a 9419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // simple lexicographic ordering on sequences of code unit values. There is no 9420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // attempt to use the more complex, semantically oriented definitions of 9421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // character or string equality and collating order defined in the Unicode 9422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // specification. Therefore String values that are canonically equal according 9423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to the Unicode standard could test as unequal. In effect this algorithm 9424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // assumes that both Strings are already in normalized form. Also, note that 9425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // for strings containing supplementary characters, lexicographic ordering on 9426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // sequences of UTF-16 code unit values differs from that on sequences of code 9427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // point values. 9428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static ComparisonResult Compare(Handle<String> x, 9429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> y); 9430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9431c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Perform ES6 21.1.3.8, including checking arguments. 9432c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static Object* IndexOf(Isolate* isolate, Handle<Object> receiver, 9433c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> search, Handle<Object> position); 9434f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Perform string match of pattern on subject, starting at start index. 9435c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Caller must ensure that 0 <= start_index <= sub->length(), as this does not 9436c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // check any arguments. 9437c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static int IndexOf(Isolate* isolate, Handle<String> receiver, 9438c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<String> search, int start_index); 9439f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 9440f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static Object* LastIndexOf(Isolate* isolate, Handle<Object> receiver, 9441f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> search, Handle<Object> position); 9442f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 9443c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Encapsulates logic related to a match and its capture groups as required 9444c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // by GetSubstitution. 9445c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch class Match { 9446c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 9447c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual Handle<String> GetMatch() = 0; 9448c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual MaybeHandle<String> GetCapture(int i, bool* capture_exists) = 0; 9449c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual Handle<String> GetPrefix() = 0; 9450c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual Handle<String> GetSuffix() = 0; 9451c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual int CaptureCount() = 0; 9452c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch virtual ~Match() {} 9453c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch }; 9454c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 9455c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // ES#sec-getsubstitution 9456c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // GetSubstitution(matched, str, position, captures, replacement) 9457c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Expand the $-expressions in the string and return a new string with 9458c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // the result. 9459c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MUST_USE_RESULT static MaybeHandle<String> GetSubstitution( 9460c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Isolate* isolate, Match* match, Handle<String> replacement); 9461c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 9462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // String equality operations. 9463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool Equals(String* other); 9464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static bool Equals(Handle<String> one, Handle<String> two); 9465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUtf8EqualTo(Vector<const char> str, bool allow_prefix_match = false); 9466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsOneByteEqualTo(Vector<const uint8_t> str); 94679fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block bool IsTwoByteEqualTo(Vector<const uc16> str); 9468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Return a UTF8 representation of the string. The string is null 9470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // terminated but may optionally contain nulls. Length is returned 9471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // in length_output if length_output is not a null pointer The string 9472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // should be nearly flat, otherwise the performance of this method may 9473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // be very slow (quadratic in the length). Setting robustness_flag to 9474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ROBUST_STRING_TRAVERSAL invokes behaviour that is robust This means it 9475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // handles unexpected data without causing assert failures and it does not 9476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // do any heap allocations. This is useful when printing stack traces. 9477f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::unique_ptr<char[]> ToCString(AllowNullsFlag allow_nulls, 9478f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch RobustnessFlag robustness_flag, int offset, 9479f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int length, int* length_output = 0); 9480f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch std::unique_ptr<char[]> ToCString( 9481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block AllowNullsFlag allow_nulls = DISALLOW_NULLS, 9482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block RobustnessFlag robustness_flag = FAST_STRING_TRAVERSAL, 9483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int* length_output = 0); 9484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ComputeArrayIndex(uint32_t* index); 9486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Externalization. 9488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool MakeExternal(v8::String::ExternalStringResource* resource); 9489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MakeExternal(v8::String::ExternalOneByteStringResource* resource); 9490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Conversion. 9492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool AsArrayIndex(uint32_t* index); 949362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch uint32_t inline ToValidIndex(Object* number); 9494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 949513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Trimming. 949613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch enum TrimMode { kTrim, kTrimLeft, kTrimRight }; 949713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Handle<String> Trim(Handle<String> string, TrimMode mode); 949813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 9499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(String) 9500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void PrintOn(FILE* out); 9502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // For use during stack traces. Performs rudimentary sanity check. 9504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool LooksValid(); 9505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 950713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void StringShortPrint(StringStream* accumulator, bool show_details = true); 9508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void PrintUC16(std::ostream& os, int start = 0, int end = -1); // NOLINT 9509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if defined(DEBUG) || defined(OBJECT_PRINT) 951069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch char* ToAsciiArray(); 9511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 9512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(String) 9513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(String) 9514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool IsFlat(); 9516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 9518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLengthOffset = Name::kSize; 9519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kLengthOffset + kPointerSize; 9520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Max char codes. 9522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int32_t kMaxOneByteCharCode = unibrow::Latin1::kMaxChar; 9523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kMaxOneByteCharCodeU = unibrow::Latin1::kMaxChar; 95243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMaxUtf16CodeUnit = 0xffff; 9525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uint32_t kMaxUtf16CodeUnitU = kMaxUtf16CodeUnit; 9526109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const uc32 kMaxCodePoint = 0x10ffff; 9527d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 9528d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Maximal string length. 9529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxLength = (1 << 28) - 16; 9530d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 9531d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Max length for computing hash. For strings longer than this limit the 9532d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // string length is used as the hash value. 9533d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block static const int kMaxHashCalcLength = 16383; 9534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Limit for truncation in short printing. 9536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMaxShortPrintLength = 1024; 9537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Support for regular expressions. 9539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const uc16* GetTwoByteData(unsigned start); 9540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Helper function for flattening strings. 9542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block template <typename sinkchar> 9543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void WriteToFlat(String* source, 9544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block sinkchar* sink, 9545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int from, 9546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int to); 9547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The return value may point to the first aligned word containing the first 9549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // non-one-byte character, rather than directly to the non-one-byte character. 9550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If the return value is >= the passed length, the entire string was 9551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // one-byte. 9552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int NonAsciiStart(const char* chars, int length) { 9553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* start = chars; 95549fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block const char* limit = chars + length; 9555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length >= kIntptrSize) { 9557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check unaligned bytes. 9558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (!IsAligned(reinterpret_cast<intptr_t>(chars), sizeof(uintptr_t))) { 9559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) { 9560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 9561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ++chars; 9563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check aligned words. 9565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(unibrow::Utf8::kMaxOneByteChar == 0x7F); 9566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uintptr_t non_one_byte_mask = kUintptrAllBitsSet / 0xFF * 0x80; 9567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (chars + sizeof(uintptr_t) <= limit) { 9568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (*reinterpret_cast<const uintptr_t*>(chars) & non_one_byte_mask) { 9569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 9570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chars += sizeof(uintptr_t); 95729fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 95739fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 9574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check remaining unaligned bytes. 95759fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block while (chars < limit) { 9576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (static_cast<uint8_t>(*chars) > unibrow::Utf8::kMaxOneByteChar) { 9577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 9578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 95799fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block ++chars; 95809fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 9581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 95839fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 95849fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 9585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsAscii(const char* chars, int length) { 9586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NonAsciiStart(chars, length) >= length; 9587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsAscii(const uint8_t* chars, int length) { 9590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 9591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NonAsciiStart(reinterpret_cast<const char*>(chars), length) >= length; 9592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int NonOneByteStart(const uc16* chars, int length) { 95959fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block const uc16* limit = chars + length; 9596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uc16* start = chars; 95979fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block while (chars < limit) { 9598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (*chars > kMaxOneByteCharCodeU) return static_cast<int>(chars - start); 95999fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block ++chars; 96009fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 9601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<int>(chars - start); 96029fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 96039fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 9604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline bool IsOneByte(const uc16* chars, int length) { 9605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NonOneByteStart(chars, length) >= length; 9606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 9607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class Visitor> 9609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline ConsString* VisitFlat(Visitor* visitor, 9610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* string, 9611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = 0); 9612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<FixedArray> CalculateLineEnds(Handle<String> string, 9614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool include_ending_line); 9615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use the hash field to forward to the canonical internalized string 9617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // when deserializing an internalized string. 9618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SetForwardedInternalizedString(String* string); 9619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline String* GetForwardedInternalizedString(); 9620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class Name; 9623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class StringTableInsertionKey; 9624f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 9625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<String> SlowFlatten(Handle<ConsString> cons, 9626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag tenure); 96277f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 9628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Slow case of String::Equals. This implementation works on any strings 9629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // but it is most efficient on strings that are almost flat. 9630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool SlowEquals(String* other); 9631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool SlowEquals(Handle<String> one, Handle<String> two); 9633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Slow case of AsArrayIndex. 9635f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V8_EXPORT_PRIVATE bool SlowAsArrayIndex(uint32_t* index); 9636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Compute and set the hash code. 9638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t ComputeAndSetHash(); 9639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(String); 9641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The SeqString abstract class captures sequential string values. 9645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass SeqString: public String { 9646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SeqString) 9648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 96493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Layout description. 96503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kHeaderSize = String::kSize; 96513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Truncate the string in-place if possible and return the result. 9653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // In case of new_length == 0, the empty string is returned without 9654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // truncating the original string. 9655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT static Handle<String> Truncate(Handle<SeqString> string, 9656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int new_length); 9657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(SeqString); 9659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The OneByteString class captures sequential one-byte string objects. 9663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Each character in the OneByteString is an one-byte character. 9664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SeqOneByteString: public SeqString { 9665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kHasOneByteEncoding = true; 9667ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 9668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 9669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint16_t SeqOneByteStringGet(int index); 9670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void SeqOneByteStringSet(int index, uint16_t value); 9671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the address of the characters in this string. 9673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Address GetCharsAddress(); 9674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint8_t* GetChars(); 9676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SeqOneByteString) 9678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. This method is called by the 9680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // garbage collector to compute the actual size of an OneByteString 9681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instance. 9682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int SeqOneByteStringSize(InstanceType instance_type); 9683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Computes the size for an OneByteString instance of a given length. 9685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int SizeFor(int length) { 96867f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return OBJECT_POINTER_ALIGN(kHeaderSize + length * kCharSize); 9687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 9688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximal memory usage for a single sequential one-byte string. 96903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMaxSize = 512 * MB - 1; 9691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT((kMaxSize - kHeaderSize) >= String::kMaxLength); 9692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(SeqOneByteString); 9695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The TwoByteString class captures sequential unicode string objects. 9699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Each character in the TwoByteString is a two-byte uint16_t. 9700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass SeqTwoByteString: public SeqString { 9701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kHasOneByteEncoding = false; 9703ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 9704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 9705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uint16_t SeqTwoByteStringGet(int index); 9706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void SeqTwoByteStringSet(int index, uint16_t value); 9707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the address of the characters in this string. 9709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Address GetCharsAddress(); 9710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uc16* GetChars(); 9712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // For regexp code. 9714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const uint16_t* SeqTwoByteStringGetData(unsigned start); 9715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SeqTwoByteString) 9717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Garbage collection support. This method is called by the 9719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // garbage collector to compute the actual size of a TwoByteString 9720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // instance. 9721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline int SeqTwoByteStringSize(InstanceType instance_type); 9722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Computes the size for a TwoByteString instance of a given length. 9724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int SizeFor(int length) { 97257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return OBJECT_POINTER_ALIGN(kHeaderSize + length * kShortSize); 9726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 9727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9728e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Maximal memory usage for a single sequential two-byte string. 97293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMaxSize = 512 * MB - 1; 9730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(static_cast<int>((kMaxSize - kHeaderSize)/sizeof(uint16_t)) >= 9731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::kMaxLength); 9732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(SeqTwoByteString); 9735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The ConsString class describes string values built by using the 9739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// addition operator on strings. A ConsString is a pair where the 9740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// first and second components are pointers to other string values. 9741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// One or both components of a ConsString can be pointers to other 9742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ConsStrings, creating a binary tree of ConsStrings where the leaves 9743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// are non-ConsString string values. The string value represented by 9744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// a ConsString can be obtained by concatenating the leaf string 9745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// values in a left-to-right depth-first traversal of the tree. 9746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ConsString: public String { 9747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // First string of the cons cell. 9749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline String* first(); 9750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Doesn't check that the result is a string, even in debug mode. This is 9751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // useful during GC where the mark bits confuse the checks. 9752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* unchecked_first(); 9753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_first(String* first, 9754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 9755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Second string of the cons cell. 9757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline String* second(); 9758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Doesn't check that the result is a string, even in debug mode. This is 9759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // useful during GC where the mark bits confuse the checks. 9760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline Object* unchecked_second(); 9761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_second(String* second, 9762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 9763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 9765c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE uint16_t ConsStringGet(int index); 9766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ConsString) 9768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 9770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kFirstOffset = POINTER_SIZE_ALIGN(String::kSize); 9771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSecondOffset = kFirstOffset + kPointerSize; 9772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kSecondOffset + kPointerSize; 9773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Minimum length for a cons string. 9775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kMinLength = 13; 9776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9777756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize> 9778756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick BodyDescriptor; 9779756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 9780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(ConsString) 978169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString); 9784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 978662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// The ThinString class describes string objects that are just references 978762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// to another string object. They are used for in-place internalization when 978862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// the original string cannot actually be internalized in-place: in these 978962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// cases, the original string is converted to a ThinString pointing at its 979062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// internalized version (which is allocated as a new object). 979162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// In terms of memory layout and most algorithms operating on strings, 979262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// ThinStrings can be thought of as "one-part cons strings". 979362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass ThinString : public String { 979462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 979562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Actual string that this ThinString refers to. 979662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline String* actual() const; 979762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_actual(String* s, 979862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 979962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 980062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_EXPORT_PRIVATE uint16_t ThinStringGet(int index); 980162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 980262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_CAST(ThinString) 980362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_VERIFIER(ThinString) 980462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 980562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Layout description. 980662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kActualOffset = String::kSize; 980762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSize = kActualOffset + kPointerSize; 980862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 980962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef FixedBodyDescriptor<kActualOffset, kSize, kSize> BodyDescriptor; 981062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 981162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 981262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DISALLOW_COPY_AND_ASSIGN(ThinString); 981362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 9814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 981569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// The Sliced String class describes strings that are substrings of another 981669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// sequential string. The motivation is to save time and memory when creating 981769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// a substring. A Sliced String is described as a pointer to the parent, 981869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// the offset from the start of the parent string and the length. Using 981969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// a Sliced String therefore requires unpacking of the parent string and 982069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// adding the offset to the start address. A substring of a Sliced String 982169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// are not nested since the double indirection is simplified when creating 982269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// such a substring. 982369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Currently missing features are: 982469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - handling externalized parent strings 982569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - external strings as parent 982669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// - truncating sliced string to enable otherwise unneeded parent to be GC'ed. 982769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass SlicedString: public String { 982869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 982969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline String* parent(); 9830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_parent(String* parent, 9831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 9832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int offset() const; 983369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch inline void set_offset(int offset); 983469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 983569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Dispatched behavior. 9836c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE uint16_t SlicedStringGet(int index); 983769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(SlicedString) 983969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 984069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Layout description. 984169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize); 984269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kOffsetOffset = kParentOffset + kPointerSize; 984369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kSize = kOffsetOffset + kPointerSize; 984469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 984569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Minimum length for a sliced string. 984669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kMinLength = 13; 984769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 984869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch typedef FixedBodyDescriptor<kParentOffset, 984969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kOffsetOffset + kPointerSize, kSize> 985069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch BodyDescriptor; 985169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(SlicedString) 985369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 985469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 985569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString); 985669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 985769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 985869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The ExternalString class describes string values that are backed by 9860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// a string resource that lies outside the V8 heap. ExternalStrings 9861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// consist of the length field common to all strings, a pointer to the 9862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// external resource. It is important to ensure (externally) that the 9863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// resource is not deallocated while the ExternalString is live in the 9864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// V8 heap. 9865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 9866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The API expects that all ExternalStrings are created through the 9867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// API. Therefore, ExternalStrings should not be used internally. 9868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ExternalString: public String { 9869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ExternalString) 9871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 9873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kResourceOffset = POINTER_SIZE_ALIGN(String::kSize); 98743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kShortSize = kResourceOffset + kPointerSize; 98753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kResourceDataOffset = kResourceOffset + kPointerSize; 98763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSize = kResourceDataOffset + kPointerSize; 98773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 98783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Return whether external string is short (data pointer is not cached). 98793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline bool is_short(); 9880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kResourceOffset == Internals::kStringResourceOffset); 9882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalString); 9885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The ExternalOneByteString class is an external string backed by an 9889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// one-byte string. 9890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExternalOneByteString : public ExternalString { 9891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kHasOneByteEncoding = true; 9893ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 9894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef v8::String::ExternalOneByteStringResource Resource; 9895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The underlying resource. 98973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline const Resource* resource(); 98983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_resource(const Resource* buffer); 98993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 99003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Update the pointer cache to the external character array. 99013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The cached pointer is always valid, as the external character array does = 99023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // not move during lifetime. Deserialization is the only exception, after 99033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // which the pointer cache has to be refreshed. 99043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void update_data_cache(); 99053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline const uint8_t* GetChars(); 9907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 9909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint16_t ExternalOneByteStringGet(int index); 9910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ExternalOneByteString) 9912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 9914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalOneByteString); 9917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The ExternalTwoByteString class is an external string backed by a UTF-16 9921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// encoded string. 9922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ExternalTwoByteString: public ExternalString { 9923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 9924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const bool kHasOneByteEncoding = false; 9925ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 9926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block typedef v8::String::ExternalStringResource Resource; 9927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The underlying string resource. 99293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline const Resource* resource(); 99303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_resource(const Resource* buffer); 99313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 99323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Update the pointer cache to the external character array. 99333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // The cached pointer is always valid, as the external character array does = 99343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // not move during lifetime. Deserialization is the only exception, after 99353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // which the pointer cache has to be refreshed. 99363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void update_data_cache(); 99373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 99383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline const uint16_t* GetChars(); 9939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 99413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline uint16_t ExternalTwoByteStringGet(int index); 9942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // For regexp code. 99443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline const uint16_t* ExternalTwoByteStringGetData(unsigned start); 9945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ExternalTwoByteString) 9947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 9949756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 9950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(ExternalTwoByteString); 9952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Utility superclass for stack-allocated objects that must be updated 9956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// on gc. It provides two ways for the gc to update instances, either 9957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// iterating or updating after gc. 9958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Relocatable BASE_EMBEDDED { 9959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 996044f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit inline Relocatable(Isolate* isolate); 996144f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline virtual ~Relocatable(); 9962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void IterateInstance(ObjectVisitor* v) { } 9963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void PostGarbageCollection() { } 9964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void PostGarbageCollectionProcessing(Isolate* isolate); 9966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static int ArchiveSpacePerThread(); 9967257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static char* ArchiveState(Isolate* isolate, char* to); 9968257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static char* RestoreState(Isolate* isolate, char* from); 9969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Iterate(Isolate* isolate, ObjectVisitor* v); 9970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void Iterate(ObjectVisitor* v, Relocatable* top); 9971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static char* Iterate(ObjectVisitor* v, char* t); 9972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 997444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 9975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Relocatable* prev_; 9976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A flat string reader provides random access to the contents of a 9980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// string independent of the character width of the string. The handle 9981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// must be valid as long as the reader is being used. 9982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass FlatStringReader : public Relocatable { 9983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 998444f0eee88ff00398ff7f715fab053374d808c90dSteve Block FlatStringReader(Isolate* isolate, Handle<String> str); 998544f0eee88ff00398ff7f715fab053374d808c90dSteve Block FlatStringReader(Isolate* isolate, Vector<const char> input); 9986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void PostGarbageCollection(); 9987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline uc32 Get(int index); 9988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier template <typename Char> 9989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Char Get(int index); 9990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length() { return length_; } 9991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 9992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String** str_; 9993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_one_byte_; 9994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length_; 9995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const void* start_; 9996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 9997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This maintains an off-stack representation of the stack frames required 10000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// to traverse a ConsString, allowing an entirely iterative and restartable 10001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// traversal of the entire string 10002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass ConsStringIterator { 10003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline ConsStringIterator() {} 10005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline explicit ConsStringIterator(ConsString* cons_string, int offset = 0) { 10006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Reset(cons_string, offset); 10007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Reset(ConsString* cons_string, int offset = 0) { 10009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch depth_ = 0; 10010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Next will always return NULL. 10011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (cons_string == NULL) return; 10012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Initialize(cons_string, offset); 10013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns NULL when complete. 10015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline String* Next(int* offset_out) { 10016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *offset_out = 0; 10017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (depth_ == 0) return NULL; 10018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Continue(offset_out); 10019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kStackSize = 32; 10023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use a mask instead of doing modulo operations for stack wrapping. 10024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDepthMask = kStackSize-1; 10025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(IS_POWER_OF_TWO(kStackSize)); 10026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline int OffsetForDepth(int depth); 10027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void PushLeft(ConsString* string); 10029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void PushRight(ConsString* string); 10030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void AdjustMaximumDepth(); 10031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Pop(); 10032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool StackBlown() { return maximum_depth_ - depth_ == kStackSize; } 10033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Initialize(ConsString* cons_string, int offset); 10034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* Continue(int* offset_out); 10035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* NextLeaf(bool* blew_stack); 10036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String* Search(int* offset_out); 10037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stack must always contain only frames for which right traversal 10039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // has not yet been performed. 10040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConsString* frames_[kStackSize]; 10041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ConsString* root_; 10042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int depth_; 10043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int maximum_depth_; 10044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int consumed_; 10045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DISALLOW_COPY_AND_ASSIGN(ConsStringIterator); 10046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass StringCharacterStream { 10050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline StringCharacterStream(String* string, 10052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = 0); 10053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline uint16_t GetNext(); 10054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool HasMore(); 10055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void Reset(String* string, int offset = 0); 10056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VisitOneByteString(const uint8_t* chars, int length); 10057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void VisitTwoByteString(const uint16_t* chars, int length); 10058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ConsStringIterator iter_; 10061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_one_byte_; 10062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch union { 10063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* buffer8_; 10064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint16_t* buffer16_; 10065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 10066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* end_; 10067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_COPY_AND_ASSIGN(StringCharacterStream); 10068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename T> 10072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass VectorIterator { 10073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block VectorIterator(T* d, int l) : data_(Vector<const T>(d, l)), index_(0) { } 10075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block explicit VectorIterator(Vector<const T> data) : data_(data), index_(0) { } 10076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block T GetNext() { return data_[index_++]; } 10077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool has_more() { return index_ < data_.length(); } 10078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Vector<const T> data_; 10080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int index_; 10081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The Oddball describes objects null, undefined, true, and false. 10085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Oddball: public HeapObject { 10086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10087bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // [to_number_raw]: Cached raw to_number computed at startup. 10088bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline double to_number_raw() const; 10089bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline void set_to_number_raw(double value); 10090bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 10091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [to_string]: Cached to_string computed at startup. 10092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(to_string, String) 10093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [to_number]: Cached to_number computed at startup. 10095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(to_number, Object) 10096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [typeof]: Cached type_of computed at startup. 10098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(type_of, String) 10099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline byte kind() const; 1010144f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void set_kind(byte kind); 1010244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 10103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 section 7.1.3 ToNumber for Boolean, Null, Undefined. 10104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static inline Handle<Object> ToNumber(Handle<Oddball> input); 10105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Oddball) 10107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 10109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Oddball) 10110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Initialize the fields. 10112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Initialize(Isolate* isolate, Handle<Oddball> oddball, 10113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* to_string, Handle<Object> to_number, 10114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const char* type_of, byte kind); 10115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 10117bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kToNumberRawOffset = HeapObject::kHeaderSize; 10118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kToStringOffset = kToNumberRawOffset + kDoubleSize; 10119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kToNumberOffset = kToStringOffset + kPointerSize; 10120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kTypeOfOffset = kToNumberOffset + kPointerSize; 10121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kKindOffset = kTypeOfOffset + kPointerSize; 1012244f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kSize = kKindOffset + kPointerSize; 1012344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1012444f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kFalse = 0; 1012544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kTrue = 1; 1012644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kNotBooleanMask = ~1; 1012744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kTheHole = 2; 1012844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kNull = 3; 10129109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const byte kArgumentsMarker = 4; 1013044f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const byte kUndefined = 5; 10131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const byte kUninitialized = 6; 10132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const byte kOther = 7; 10133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const byte kException = 8; 101343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const byte kOptimizedOut = 9; 10135bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const byte kStaleRegister = 10; 10136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef FixedBodyDescriptor<kToStringOffset, kTypeOfOffset + kPointerSize, 10138756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kSize> BodyDescriptor; 10139756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 10140bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch STATIC_ASSERT(kToNumberRawOffset == HeapNumber::kValueOffset); 10141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kKindOffset == Internals::kOddballKindOffset); 10142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kNull == Internals::kNullOddballKind); 10143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kUndefined == Internals::kUndefinedOddballKind); 10144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(Oddball); 10147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Cell: public HeapObject { 10151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [value]: value of the cell. 10153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(value, Object) 10154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Cell) 10156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline Cell* FromValueAddress(Address value) { 10158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* result = FromAddress(value - kValueOffset); 10159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<Cell*>(result); 10160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Address ValueAddress() { 10163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return address() + kValueOffset; 10164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 10165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Cell) 10168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Cell) 10169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 10171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kValueOffset = HeapObject::kHeaderSize; 10172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kValueOffset + kPointerSize; 10173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10174756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef FixedBodyDescriptor<kValueOffset, 10175756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kValueOffset + kPointerSize, 10176756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick kSize> BodyDescriptor; 10177756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 10178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Cell); 10180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass PropertyCell : public HeapObject { 10184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [property_details]: details of the global property. 10186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(property_details_raw, Object) 10187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [value]: value of the global property. 10188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(value, Object) 10189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [dependent_code]: dependent code that depends on the type of the global 10190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // property. 10191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(dependent_code, DependentCode) 10192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline PropertyDetails property_details(); 10194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_property_details(PropertyDetails details); 10195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyCellConstantType GetConstantType(); 10197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Computes the new type of the cell's contents for the given value, but 10199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // without actually modifying the details. 10200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static PropertyCellType UpdatedType(Handle<PropertyCell> cell, 10201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 10202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDetails details); 10203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Prepares property cell at given entry for receiving given value. 10204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // As a result the old cell could be invalidated and/or dependent code could 10205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // be deoptimized. Returns the prepared property cell. 10206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static Handle<PropertyCell> PrepareForValue( 10207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<GlobalDictionary> dictionary, int entry, Handle<Object> value, 10208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyDetails details); 10209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<PropertyCell> InvalidateEntry( 10211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<GlobalDictionary> dictionary, int entry); 10212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetValueWithInvalidation(Handle<PropertyCell> cell, 10214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> new_value); 10215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(PropertyCell) 10217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(PropertyCell) 10220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(PropertyCell) 10221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Layout description. 10223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kDetailsOffset = HeapObject::kHeaderSize; 10224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kValueOffset = kDetailsOffset + kPointerSize; 10225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kDependentCodeOffset = kValueOffset + kPointerSize; 10226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kDependentCodeOffset + kPointerSize; 10227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef FixedBodyDescriptor<kValueOffset, 10229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize, 10230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize> BodyDescriptor; 10231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(PropertyCell); 10234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass WeakCell : public HeapObject { 10238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 10239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Object* value() const; 10240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // This should not be called by anyone except GC. 10242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void clear(); 10243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // This should not be called by anyone except allocator. 10245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void initialize(HeapObject* value); 10246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool cleared() const; 10248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_ACCESSORS(next, Object) 10250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_next(Object* the_hole_value); 10252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool next_cleared(); 10254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CAST(WeakCell) 10256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_PRINTER(WeakCell) 10258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_VERIFIER(WeakCell) 10259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Layout description. 10261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kValueOffset = HeapObject::kHeaderSize; 10262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kNextOffset = kValueOffset + kPointerSize; 10263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kSize = kNextOffset + kPointerSize; 10264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier typedef FixedBodyDescriptor<kValueOffset, kSize, kSize> BodyDescriptor; 10266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 10268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DISALLOW_IMPLICIT_CONSTRUCTORS(WeakCell); 10269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 10270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10272257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// The JSProxy describes EcmaScript Harmony proxies 102733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass JSProxy: public JSReceiver { 10274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 10275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<JSProxy> New(Isolate* isolate, 10276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object>, 10277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object>); 10278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // [handler]: The handler property. 10280257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECL_ACCESSORS(handler, Object) 10281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [target]: The target property. 10282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(target, JSReceiver) 102833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // [hash]: The hash code property (undefined if not initialized yet). 102843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(hash, Object) 102853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Context> GetFunctionRealm(Handle<JSProxy> proxy); 102873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(JSProxy) 102893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch INLINE(bool IsRevoked() const); 10291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Revoke(Handle<JSProxy> proxy); 10292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.1 10294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static MaybeHandle<Object> GetPrototype(Handle<JSProxy> receiver); 10295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.2 10297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetPrototype(Handle<JSProxy> proxy, 10298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 10299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool from_javascript, 10300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 10301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.3 10302014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> IsExtensible(Handle<JSProxy> proxy); 10303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10304014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.4 (when passed DONT_THROW) 10305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> PreventExtensions( 10306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSProxy> proxy, ShouldThrow should_throw); 10307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.5 10309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> GetOwnPropertyDescriptor( 10310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSProxy> proxy, Handle<Name> name, 10311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc); 10312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.6 10314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnProperty( 10315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSProxy> object, Handle<Object> key, 10316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 10317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.7 10319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> HasProperty(Isolate* isolate, 10320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSProxy> proxy, 10321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> name); 10322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.8 10324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static MaybeHandle<Object> GetProperty( 10325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSProxy> proxy, Handle<Name> name, 103263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> receiver, bool* was_found); 103273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.9 10329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> SetProperty(Handle<JSProxy> proxy, 10330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> name, 10331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, 10332014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> receiver, 10333014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LanguageMode language_mode); 10334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 10335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.10 (when passed SLOPPY) 10336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DeletePropertyOrElement( 10337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSProxy> proxy, Handle<Name> name, LanguageMode language_mode); 103383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.5.12 10340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> OwnPropertyKeys( 10341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSReceiver> receiver, Handle<JSProxy> proxy, 10342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyFilter filter, KeyAccumulator* accumulator); 10343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 10344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<PropertyAttributes> GetPropertyAttributes( 10345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LookupIterator* it); 10346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10347014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Dispatched behavior. 10348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_PRINTER(JSProxy) 10349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_VERIFIER(JSProxy) 10350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Layout description. 10352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kTargetOffset = JSReceiver::kHeaderSize; 10353014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHandlerOffset = kTargetOffset + kPointerSize; 10354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kHashOffset = kHandlerOffset + kPointerSize; 10355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kHashOffset + kPointerSize; 10356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef FixedBodyDescriptor<JSReceiver::kPropertiesOffset, kSize, kSize> 10358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BodyDescriptor; 10359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1036013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Object* GetIdentityHash(Handle<JSProxy> receiver); 10361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1036213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Smi* GetOrCreateIdentityHash(Isolate* isolate, Handle<JSProxy> proxy); 10363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10364109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static Maybe<bool> SetPrivateProperty(Isolate* isolate, Handle<JSProxy> proxy, 10365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Symbol> private_name, 10366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, 10367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 10368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10369109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch private: 10370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy); 10371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSCollection : public JSObject { 10375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [table]: the backing hash table 10377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(table, Object) 10378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTableOffset = JSObject::kHeaderSize; 10380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kTableOffset + kPointerSize; 10381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSCollection); 10384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JSSet describes EcmaScript Harmony sets 10388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSSet : public JSCollection { 10389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSSet) 10391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Initialize(Handle<JSSet> set, Isolate* isolate); 10393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Clear(Handle<JSSet> set); 10394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSSet) 10397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSSet) 10398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSSet); 10401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JSMap describes EcmaScript Harmony maps 10405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSMap : public JSCollection { 10406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSMap) 10408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Initialize(Handle<JSMap> map, Isolate* isolate); 10410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Clear(Handle<JSMap> map); 10411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSMap) 10414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSMap) 10415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSMap); 10418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10420c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass JSArrayIterator : public JSObject { 10421c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch public: 10422c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_PRINTER(JSArrayIterator) 10423c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_VERIFIER(JSArrayIterator) 10424c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10425c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECLARE_CAST(JSArrayIterator) 10426c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10427c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [object]: the [[IteratedObject]] internal field. 10428c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(object, Object) 10429c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10430c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [index]: The [[ArrayIteratorNextIndex]] internal field. 10431c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(index, Object) 10432c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10433c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // [map]: The Map of the [[IteratedObject]] field at the time the iterator is 10434c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // allocated. 10435c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(object_map, Object) 10436c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10437c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Return the ElementsKind that a JSArrayIterator's [[IteratedObject]] is 10438c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // expected to have, based on its instance type. 10439c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static ElementsKind ElementsKindForInstanceType(InstanceType instance_type); 10440c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10441c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIteratedObjectOffset = JSObject::kHeaderSize; 10442c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kNextIndexOffset = kIteratedObjectOffset + kPointerSize; 10443c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kIteratedObjectMapOffset = kNextIndexOffset + kPointerSize; 10444c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kIteratedObjectMapOffset + kPointerSize; 10445c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 10446c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private: 10447c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayIterator); 10448c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}; 10449c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1045062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// The [Async-from-Sync Iterator] object 1045162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// (proposal-async-iteration/#sec-async-from-sync-iterator-objects) 1045262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// An object which wraps an ordinary Iterator and converts it to behave 1045362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// according to the Async Iterator protocol. 1045462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch// (See https://tc39.github.io/proposal-async-iteration/#sec-iteration) 1045562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass JSAsyncFromSyncIterator : public JSObject { 1045662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 1045762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_CAST(JSAsyncFromSyncIterator) 1045862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_PRINTER(JSAsyncFromSyncIterator) 1045962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECLARE_VERIFIER(JSAsyncFromSyncIterator) 1046062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1046162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Async-from-Sync Iterator instances are ordinary objects that inherit 1046262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // properties from the %AsyncFromSyncIteratorPrototype% intrinsic object. 1046362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Async-from-Sync Iterator instances are initially created with the internal 1046462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // slots listed in Table 4. 1046562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // (proposal-async-iteration/#table-async-from-sync-iterator-internal-slots) 1046662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(sync_iterator, JSReceiver) 1046762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1046862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Offsets of object fields. 1046962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSyncIteratorOffset = JSObject::kHeaderSize; 1047062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kSize = kSyncIteratorOffset + kPointerSize; 1047162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1047262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 1047362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSAsyncFromSyncIterator); 1047462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}; 1047562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 10476f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass JSStringIterator : public JSObject { 10477f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public: 10478f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Dispatched behavior. 10479f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_PRINTER(JSStringIterator) 10480f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_VERIFIER(JSStringIterator) 10481f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10482f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECLARE_CAST(JSStringIterator) 10483f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10484f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // [string]: the [[IteratedString]] internal field. 10485f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(string, String) 10486f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10487f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // [index]: The [[StringIteratorNextIndex]] internal field. 10488f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline int index() const; 10489f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline void set_index(int value); 10490f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10491f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kStringOffset = JSObject::kHeaderSize; 10492f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kNextIndexOffset = kStringOffset + kPointerSize; 10493f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kSize = kNextIndexOffset + kPointerSize; 10494f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 10495f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private: 10496f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSStringIterator); 10497f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}; 10498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// OrderedHashTableIterator is an iterator that iterates over the keys and 10500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// values of an OrderedHashTable. 10501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 10502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The iterator has a reference to the underlying OrderedHashTable data, 10503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// [table], as well as the current [index] the iterator is at. 10504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 10505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When the OrderedHashTable is rehashed it adds a reference from the old table 10506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// to the new table as well as storing enough data about the changes so that the 10507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// iterator [index] can be adjusted accordingly. 10508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// 10509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When the [Next] result from the iterator is requested, the iterator checks if 10510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// there is a newer table that it needs to transition to. 10511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class Derived, class TableType> 10512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OrderedHashTableIterator: public JSObject { 10513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [table]: the backing hash table mapping keys to values. 10515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(table, Object) 10516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [index]: The index into the data table. 10518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(index, Object) 10519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [kind]: The kind of iteration this is. One of the [Kind] enum values. 10521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(kind, Object) 10522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef OBJECT_PRINT 10524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void OrderedHashTableIteratorPrint(std::ostream& os); // NOLINT 10525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 10526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTableOffset = JSObject::kHeaderSize; 10528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kIndexOffset = kTableOffset + kPointerSize; 10529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kKindOffset = kIndexOffset + kPointerSize; 10530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kKindOffset + kPointerSize; 10531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Kind { 10533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kKindKeys = 1, 10534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kKindValues = 2, 10535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kKindEntries = 3 10536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 10537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Whether the iterator has more elements. This needs to be called before 10539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // calling |CurrentKey| and/or |CurrentValue|. 10540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasMore(); 10541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Move the index forward one. 10543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MoveNext() { 10544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_index(Smi::FromInt(Smi::cast(index())->value() + 1)); 10545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Populates the array with the next key and value and then moves the iterator 10548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // forward. 10549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This returns the |kind| or 0 if the iterator is already at the end. 10550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Smi* Next(JSArray* value_array); 10551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the current key of the iterator. This should only be called when 10553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // |HasMore| returns true. 10554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* CurrentKey(); 10555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Transitions the iterator to the non obsolete backing store. This is a NOP 10558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // if the [table] is not obsolete. 10559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Transition(); 10560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(OrderedHashTableIterator); 10562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSSetIterator: public OrderedHashTableIterator<JSSetIterator, 10566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OrderedHashSet> { 10567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSSetIterator) 10570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSSetIterator) 10571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSSetIterator) 10573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Called by |Next| to populate the array. This allows the subclasses to 10575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // populate the array differently. 10576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void PopulateValueArray(FixedArray* array); 10577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSSetIterator); 10580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSMapIterator: public OrderedHashTableIterator<JSMapIterator, 10584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OrderedHashMap> { 10585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSMapIterator) 10588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSMapIterator) 10589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSMapIterator) 10591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Called by |Next| to populate the array. This allows the subclasses to 10593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // populate the array differently. 10594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void PopulateValueArray(FixedArray* array); 10595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the current value of the iterator. This should only be called when 10598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // |HasMore| returns true. 10599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Object* CurrentValue(); 10600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSMapIterator); 10602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Base class for both JSWeakMap and JSWeakSet 10606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSWeakCollection: public JSObject { 10607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10608f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(JSWeakCollection) 10609f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 10610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [table]: the backing hash table mapping keys to values. 10611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(table, Object) 10612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [next]: linked list of encountered weak maps during GC. 10614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(next, Object) 10615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Initialize(Handle<JSWeakCollection> collection, Isolate* isolate); 10617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void Set(Handle<JSWeakCollection> collection, Handle<Object> key, 10618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> value, int32_t hash); 10619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool Delete(Handle<JSWeakCollection> collection, Handle<Object> key, 10620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int32_t hash); 1062162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<JSArray> GetEntries(Handle<JSWeakCollection> holder, 1062262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int max_entries); 10623014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTableOffset = JSObject::kHeaderSize; 10625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNextOffset = kTableOffset + kPointerSize; 10626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kNextOffset + kPointerSize; 10627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visiting policy defines whether the table and next collection fields 10629014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // should be visited or not. 10630014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum BodyVisitingPolicy { kVisitStrong, kVisitWeak }; 10631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterates the function object according to the visiting policy. 10633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch template <BodyVisitingPolicy> 10634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptorImpl; 10635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visit the whole object. 10637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kVisitStrong> BodyDescriptor; 10638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Don't visit table and next collection fields. 10640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch typedef BodyDescriptorImpl<kVisitWeak> BodyDescriptorWeak; 10641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakCollection); 10644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JSWeakMap describes EcmaScript Harmony weak maps 10648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSWeakMap: public JSWeakCollection { 10649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSWeakMap) 10651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSWeakMap) 10654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSWeakMap) 10655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakMap); 10658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JSWeakSet describes EcmaScript Harmony weak sets 10662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSWeakSet: public JSWeakCollection { 10663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSWeakSet) 10665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSWeakSet) 10668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSWeakSet) 10669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 10671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakSet); 10672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 10673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Whether a JSArrayBuffer is a SharedArrayBuffer or not. 10676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochenum class SharedFlag { kNotShared, kShared }; 10677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSArrayBuffer: public JSObject { 10680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 10681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [backing_store]: backing memory for this array 10682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(backing_store, void) 10683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [byte_length]: length in bytes 10685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(byte_length, Object) 10686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t bit_field() const; 10688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_bit_field(uint32_t bits); 10689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool is_external(); 10691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_is_external(bool value); 10692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline bool is_neuterable(); 10694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_is_neuterable(bool value); 10695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool was_neutered(); 10697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_was_neutered(bool value); 10698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_shared(); 10700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_is_shared(bool value); 10701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1070262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool has_guard_region(); 1070362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline void set_has_guard_region(bool value); 1070462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 10705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSArrayBuffer) 10706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Neuter(); 10708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10709c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE static void Setup( 10710c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSArrayBuffer> array_buffer, Isolate* isolate, bool is_external, 10711c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void* data, size_t allocated_length, 10712c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch SharedFlag shared = SharedFlag::kNotShared); 10713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1071462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Returns false if array buffer contents could not be allocated. 1071562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // In this case, |array_buffer| will not be set up. 1071662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static bool SetupAllocatingData( 1071762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSArrayBuffer> array_buffer, Isolate* isolate, 1071862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t allocated_length, bool initialize = true, 1071962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SharedFlag shared = SharedFlag::kNotShared) WARN_UNUSED_RESULT; 10720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSArrayBuffer) 10723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSArrayBuffer) 10724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kByteLengthOffset = JSObject::kHeaderSize; 10726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBackingStoreOffset = kByteLengthOffset + kPointerSize; 10727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBitFieldSlot = kBackingStoreOffset + kPointerSize; 10728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_LITTLE_ENDIAN || !V8_HOST_ARCH_64_BIT 10729014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBitFieldOffset = kBitFieldSlot; 10730014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#else 10731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kBitFieldOffset = kBitFieldSlot + kIntSize; 10732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 10733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kBitFieldSlot + kPointerSize; 10734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSizeWithInternalFields = 10736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize + v8::ArrayBuffer::kInternalFieldCount * kPointerSize; 10737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Iterates all fields in the object including internal ones except 10739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // kBackingStoreOffset and kBitFieldSlot. 10740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 10741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class IsExternal : public BitField<bool, 1, 1> {}; 10743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class IsNeuterable : public BitField<bool, 2, 1> {}; 10744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class WasNeutered : public BitField<bool, 3, 1> {}; 10745014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class IsShared : public BitField<bool, 4, 1> {}; 1074662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch class HasGuardRegion : public BitField<bool, 5, 1> {}; 10747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10748014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 10749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBuffer); 107503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 107513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10752257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 10753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSArrayBufferView: public JSObject { 107543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 10755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [buffer]: ArrayBuffer that this typed array views. 10756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(buffer, Object) 107573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // [byte_offset]: offset of typed array in bytes. 10759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(byte_offset, Object) 107603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [byte_length]: length of typed array in bytes. 10762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(byte_length, Object) 107633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSArrayBufferView) 10765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSArrayBufferView) 10767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool WasNeutered() const; 10769014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kBufferOffset = JSObject::kHeaderSize; 10771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kByteOffsetOffset = kBufferOffset + kPointerSize; 10772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kByteLengthOffset = kByteOffsetOffset + kPointerSize; 10773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kViewSize = kByteLengthOffset + kPointerSize; 107743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 107753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 10776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP 10777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(raw_byte_offset, Object) 10778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(raw_byte_length, Object) 10779014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 10780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSArrayBufferView); 107823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 107833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 107843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSTypedArray: public JSArrayBufferView { 107863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 10787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // [length]: length of typed array in elements. 10788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(length, Object) 10789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline uint32_t length_value() const; 107903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1079162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // ES6 9.4.5.3 1079262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnProperty( 1079362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate* isolate, Handle<JSTypedArray> o, Handle<Object> key, 1079462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 1079562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 10796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSTypedArray) 107973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalArrayType type(); 10799c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE size_t element_size(); 10800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSArrayBuffer> GetBuffer(); 10802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1080362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static inline MaybeHandle<JSTypedArray> Validate(Isolate* isolate, 1080462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> receiver, 1080562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const char* method_name); 1080662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 10807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSTypedArray) 10809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSTypedArray) 10810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLengthOffset = kViewSize + kPointerSize; 10812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kLengthOffset + kPointerSize; 10813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSizeWithInternalFields = 10815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize + v8::ArrayBufferView::kInternalFieldCount * kPointerSize; 108163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 108173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 10818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<JSArrayBuffer> MaterializeArrayBuffer( 10819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSTypedArray> typed_array); 10820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP 10821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(raw_length, Object) 10822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 10823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSTypedArray); 108253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 108263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 108273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JSDataView: public JSArrayBufferView { 1082969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch public: 10830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(JSDataView) 1083169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 10833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSDataView) 10834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSDataView) 1083569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSize = kViewSize; 1083769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kSizeWithInternalFields = 10839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kSize + v8::ArrayBufferView::kInternalFieldCount * kPointerSize; 1084069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1084169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 10842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(JSDataView); 1084369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}; 1084469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1084569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10846257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Foreign describes objects pointing from JavaScript to C structures. 10847257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass Foreign: public HeapObject { 10848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10849257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // [address]: field containing the address. 108503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline Address foreign_address(); 108513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inline void set_foreign_address(Address value); 10852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(Foreign) 10854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 10856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(Foreign) 10857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(Foreign) 10858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 10860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 108613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kForeignAddressOffset = HeapObject::kHeaderSize; 108623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSize = kForeignAddressOffset + kPointerSize; 10863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kForeignAddressOffset == Internals::kForeignAddressOffset); 10865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch class BodyDescriptor; 10867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Foreign); 10870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The JSArray describes JavaScript Arrays 10874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Such an array can be in one of two modes: 10875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - fast, backing storage is a FixedArray and length <= elements.length(); 10876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Please note: push and pop can be used to grow and shrink the array. 10877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - slow, backing storage is a HashTable with numbers as keys. 10878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JSArray: public JSObject { 10879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [length]: The length property. 10881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(length, Object) 10882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 108834515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // Overload the length setter to skip write barrier when the length 108844515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke // is set to a smi. This matches the set function on FixedArray. 108854515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke inline void set_length(Smi* length); 108864515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 10887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static bool HasReadOnlyLength(Handle<JSArray> array); 10888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool WouldChangeReadOnlyLength(Handle<JSArray> array, uint32_t index); 10889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 10890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Initialize the array with the given capacity. The function may 10891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // fail due to out-of-memory situations, but only if the requested 10892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // capacity is non-zero. 10893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Initialize(Handle<JSArray> array, int capacity, int length = 0); 10894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the JSArray has fast elements, and new_length would result in 10896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // normalization, returns true. 10897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool SetLengthWouldNormalize(uint32_t new_length); 10898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static inline bool SetLengthWouldNormalize(Heap* heap, uint32_t new_length); 10899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 109003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Initializes the array to a certain length. 10901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool AllowsSetLength(); 10902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static void SetLength(Handle<JSArray> array, uint32_t length); 109043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 10905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set the content of the array to the content of storage. 10906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static inline void SetContent(Handle<JSArray> array, 10907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArrayBase> storage); 10908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // ES6 9.4.2.1 10910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> DefineOwnProperty( 10911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, Handle<JSArray> o, Handle<Object> name, 10912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, ShouldThrow should_throw); 10913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool AnythingToArrayLength(Isolate* isolate, 10915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> length_object, 10916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint32_t* output); 10917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT static Maybe<bool> ArraySetLength(Isolate* isolate, 10918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSArray> a, 10919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyDescriptor* desc, 10920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ShouldThrow should_throw); 10921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 109223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Checks whether the Array has the current realm's Array.prototype as its 109233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // prototype. This function is best-effort and only gives a conservative 109243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // approximation, erring on the side of false, in particular with respect 109253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // to Proxies and objects with a hidden prototype. 109263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool HasArrayPrototype(Isolate* isolate); 109273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 10928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CAST(JSArray) 10929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Dispatched behavior. 10931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(JSArray) 10932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(JSArray) 10933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Number of element slots to pre-allocate for an empty array. 10935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPreallocatedArrayElements = 4; 10936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Layout description. 10938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kLengthOffset = JSObject::kHeaderSize; 10939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kLengthOffset + kPointerSize; 10940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kInitialMaxFastElementArray = 10942f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch (kMaxRegularHeapObjectSize - FixedArray::kHeaderSize - kSize - 10943f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AllocationMemento::kSize) / 10944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kPointerSize; 10945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 10947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSArray); 10948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 10949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> CacheInitialJSArrayMaps(Handle<Context> native_context, 10952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> initial_map); 10953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 109556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// JSRegExpResult is just a JSArray with a specific initial map. 109566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// This initial map adds in-object properties for "index" and "input" 109576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// properties, as assigned by RegExp.prototype.exec, which allows 109586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// faster creation of RegExp exec results. 109596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// This class just holds constants used when creating the result. 109606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// After creation the result must be treated as a JSArray in all regards. 109616ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass JSRegExpResult: public JSArray { 109626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 109636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Offsets of object fields. 109646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kIndexOffset = JSArray::kSize; 109656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kInputOffset = kIndexOffset + kPointerSize; 109666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kSize = kInputOffset + kPointerSize; 109676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Indices of in-object properties. 109686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kIndexIndex = 0; 109696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static const int kInputIndex = 1; 109706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 109716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DISALLOW_IMPLICIT_CONSTRUCTORS(JSRegExpResult); 109726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 109736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 109746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 10975109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// An accessor must have a getter, but can have no setter. 10976109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// 10977109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// When setting a property, V8 searches accessors in prototypes. 10978109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// If an accessor was found and it does not have a setter, 10979109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// the request is ignored. 10980109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// 10981109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// If the accessor in the prototype has the READ_ONLY property attribute, then 10982109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// a new value is added to the derived object when the property is set. 10983109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// This shadows the accessor in the prototype. 10984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass AccessorInfo: public Struct { 10985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 10986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(name, Object) 10987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(flag) 10988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(expected_receiver_type, Object) 10989bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // This directly points at a foreign C function to be used from the runtime. 10990109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(getter, Object) 10991109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(setter, Object) 10992bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // This either points at the same as above, or a trampoline in case we are 10993bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // running with the simulator. Use these entries from generated code. 10994bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECL_ACCESSORS(js_getter, Object) 10995109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(data, Object) 10996109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 10997bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static Address redirect(Isolate* isolate, Address address, 10998bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch AccessorComponent component); 10999bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Address redirected_getter() const; 11000bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 11001109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Dispatched behavior. 11002109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECLARE_PRINTER(AccessorInfo) 11003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool all_can_read(); 11005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_all_can_read(bool value); 11006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline bool all_can_write(); 11008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_all_can_write(bool value); 11009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11010014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_special_data_property(); 11011014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_is_special_data_property(bool value); 11012014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11013c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool replace_on_access(); 11014c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline void set_replace_on_access(bool value); 11015c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 110163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool is_sloppy(); 110173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline void set_is_sloppy(bool value); 110183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 11019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline PropertyAttributes property_attributes(); 11020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block inline void set_property_attributes(PropertyAttributes attributes); 11021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Checks whether the given receiver is compatible with this accessor. 11023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static bool IsCompatibleReceiverMap(Isolate* isolate, 11024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<AccessorInfo> info, 11025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map); 11026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsCompatibleReceiver(Object* receiver); 11027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AccessorInfo) 11029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AccessorInfo) 11032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Append all descriptors to the array that are not already there. 11034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return number added. 11035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int AppendUnique(Handle<Object> descriptors, 11036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array, 11037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int valid_descriptors); 11038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNameOffset = HeapObject::kHeaderSize; 11040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kFlagOffset = kNameOffset + kPointerSize; 11041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kExpectedReceiverTypeOffset = kFlagOffset + kPointerSize; 11042bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kSetterOffset = kExpectedReceiverTypeOffset + kPointerSize; 11043bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kGetterOffset = kSetterOffset + kPointerSize; 11044bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kJsGetterOffset = kGetterOffset + kPointerSize; 11045bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static const int kDataOffset = kJsGetterOffset + kPointerSize; 11046109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSize = kDataOffset + kPointerSize; 11047109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool HasExpectedReceiverType(); 11051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit positions in flag. 11053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAllCanReadBit = 0; 11054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAllCanWriteBit = 1; 11055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSpecialDataProperty = 2; 110563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch static const int kIsSloppy = 3; 11057c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kReplaceOnAccess = 4; 11058c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch class AttributesField : public BitField<PropertyAttributes, 5, 3> {}; 11059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorInfo); 11061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 110643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Support for JavaScript accessors: A pair of a getter and a setter. Each 110653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// accessor can either be 110663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * a pointer to a JavaScript function or proxy: a real accessor 110673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * undefined: considered an accessor by the spec, too, strangely enough 110683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * the hole: an accessor which has not been set 110693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// * a pointer to a map: a transition used to ensure map sharing 110703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass AccessorPair: public Struct { 110713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 110723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(getter, Object) 110733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECL_ACCESSORS(setter, Object) 110743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AccessorPair) 11076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Handle<AccessorPair> Copy(Handle<AccessorPair> pair); 11078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11079014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* get(AccessorComponent component); 11080014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set(AccessorComponent component, Object* value); 110813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 110823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Note: Returns undefined instead in case of a hole. 11083109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static Handle<Object> GetComponent(Handle<AccessorPair> accessor_pair, 11084109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch AccessorComponent component); 110853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 110863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Set both components, skipping arguments which are a JavaScript null. 11087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void SetComponents(Object* getter, Object* setter); 110883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool Equals(AccessorPair* pair); 11090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool Equals(Object* getter_value, Object* setter_value); 11091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool ContainsAccessor(); 110933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AccessorPair) 11096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AccessorPair) 110973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 110983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kGetterOffset = HeapObject::kHeaderSize; 110993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSetterOffset = kGetterOffset + kPointerSize; 111003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kSize = kSetterOffset + kPointerSize; 111013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 111023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 111033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Strangely enough, in addition to functions and harmony proxies, the spec 111043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // requires us to consider undefined as a kind of accessor, too: 111053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // var obj = {}; 111063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Object.defineProperty(obj, "foo", {get: undefined}); 111073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // assertTrue("foo" in obj); 11108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool IsJSAccessor(Object* obj); 111093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 111103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(AccessorPair); 111113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 111123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 111133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass AccessCheckInfo: public Struct { 11115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(callback, Object) 1111713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(named_interceptor, Object) 1111813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(indexed_interceptor, Object) 11119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(data, Object) 11120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(AccessCheckInfo) 11122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(AccessCheckInfo) 11125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(AccessCheckInfo) 11126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1112713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static AccessCheckInfo* Get(Isolate* isolate, Handle<JSObject> receiver); 1112813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 1112913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kCallbackOffset = HeapObject::kHeaderSize; 1113013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kNamedInterceptorOffset = kCallbackOffset + kPointerSize; 1113113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kIndexedInterceptorOffset = 1113213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kNamedInterceptorOffset + kPointerSize; 1113313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kDataOffset = kIndexedInterceptorOffset + kPointerSize; 11134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kDataOffset + kPointerSize; 11135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(AccessCheckInfo); 11138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass InterceptorInfo: public Struct { 11142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(getter, Object) 11144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(setter, Object) 11145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(query, Object) 11146f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(descriptor, Object) 11147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(deleter, Object) 11148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(enumerator, Object) 11149f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DECL_ACCESSORS(definer, Object) 11150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(data, Object) 11151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_BOOLEAN_ACCESSORS(can_intercept_symbols) 11152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECL_BOOLEAN_ACCESSORS(all_can_read) 11153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(non_masking) 11154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 11155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline int flags() const; 11156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline void set_flags(int flags); 11157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(InterceptorInfo) 11159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(InterceptorInfo) 11162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(InterceptorInfo) 11163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kGetterOffset = HeapObject::kHeaderSize; 11165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSetterOffset = kGetterOffset + kPointerSize; 11166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kQueryOffset = kSetterOffset + kPointerSize; 11167f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kDescriptorOffset = kQueryOffset + kPointerSize; 11168f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kDeleterOffset = kDescriptorOffset + kPointerSize; 11169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kEnumeratorOffset = kDeleterOffset + kPointerSize; 11170f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kDefinerOffset = kEnumeratorOffset + kPointerSize; 11171f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static const int kDataOffset = kDefinerOffset + kPointerSize; 11172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kFlagsOffset = kDataOffset + kPointerSize; 11173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kSize = kFlagsOffset + kPointerSize; 11174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 11175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kCanInterceptSymbolsBit = 0; 11176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static const int kAllCanReadBit = 1; 11177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kNonMasking = 2; 11178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(InterceptorInfo); 11181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass CallHandlerInfo: public Struct { 11185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(callback, Object) 11187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(data, Object) 11188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_ACCESSORS(fast_handler, Object) 11189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(CallHandlerInfo) 11191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(CallHandlerInfo) 11194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(CallHandlerInfo) 11195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kCallbackOffset = HeapObject::kHeaderSize; 11197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kDataOffset = kCallbackOffset + kPointerSize; 11198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kFastHandlerOffset = kDataOffset + kPointerSize; 11199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kSize = kFastHandlerOffset + kPointerSize; 11200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(CallHandlerInfo); 11203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass TemplateInfo: public Struct { 11207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(tag, Object) 11209109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_ACCESSORS(serial_number, Object) 11210109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DECL_INT_ACCESSORS(number_of_properties) 11211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(property_list, Object) 11212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_ACCESSORS(property_accessors, Object) 11213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(TemplateInfo) 11215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECLARE_CAST(TemplateInfo) 11217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kTagOffset = HeapObject::kHeaderSize; 11219109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kSerialNumberOffset = kTagOffset + kPointerSize; 11220109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kNumberOfProperties = kSerialNumberOffset + kPointerSize; 11221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kPropertyListOffset = kNumberOfProperties + kPointerSize; 11222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kPropertyAccessorsOffset = 11223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kPropertyListOffset + kPointerSize; 11224c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kHeaderSize = kPropertyAccessorsOffset + kPointerSize; 112253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kFastTemplateInstantiationsCacheSize = 1 * KB; 11227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 112283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 11229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(TemplateInfo); 11230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass FunctionTemplateInfo: public TemplateInfo { 11234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(call_code, Object) 11236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(prototype_template, Object) 1123762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_ACCESSORS(prototype_provider_template, Object) 11238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(parent_template, Object) 11239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(named_property_handler, Object) 11240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(indexed_property_handler, Object) 11241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(instance_template, Object) 11242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(class_name, Object) 11243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(signature, Object) 11244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(instance_call_handler, Object) 11245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(access_check_info, Object) 1124613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECL_ACCESSORS(shared_function_info, Object) 11247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_ACCESSORS(js_function, Object) 11248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(flag) 11249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int length() const; 11251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_length(int value); 11252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Following properties use flag bits. 11254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_BOOLEAN_ACCESSORS(hidden_prototype) 11255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_BOOLEAN_ACCESSORS(undetectable) 11256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If the bit is set, object instances created by this function 11257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // requires access check. 11258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_BOOLEAN_ACCESSORS(needs_access_check) 1125969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DECL_BOOLEAN_ACCESSORS(read_only_prototype) 11260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(remove_prototype) 11261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECL_BOOLEAN_ACCESSORS(do_not_cache) 11262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_BOOLEAN_ACCESSORS(accept_any_receiver) 11263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11264c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DECL_ACCESSORS(cached_property_name, Object) 11265c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 11266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(FunctionTemplateInfo) 11267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(FunctionTemplateInfo) 11270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(FunctionTemplateInfo) 11271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1127262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kInvalidSerialNumber = 0; 1127362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 11274109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch static const int kCallCodeOffset = TemplateInfo::kHeaderSize; 11275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kPrototypeTemplateOffset = 11276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kCallCodeOffset + kPointerSize; 1127762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kPrototypeProviderTemplateOffset = 11278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPrototypeTemplateOffset + kPointerSize; 1127962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kParentTemplateOffset = 1128062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kPrototypeProviderTemplateOffset + kPointerSize; 11281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNamedPropertyHandlerOffset = 11282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kParentTemplateOffset + kPointerSize; 11283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kIndexedPropertyHandlerOffset = 11284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kNamedPropertyHandlerOffset + kPointerSize; 11285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceTemplateOffset = 11286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIndexedPropertyHandlerOffset + kPointerSize; 11287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kClassNameOffset = kInstanceTemplateOffset + kPointerSize; 11288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSignatureOffset = kClassNameOffset + kPointerSize; 11289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kInstanceCallHandlerOffset = kSignatureOffset + kPointerSize; 11290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kAccessCheckInfoOffset = 11291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceCallHandlerOffset + kPointerSize; 1129213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kSharedFunctionInfoOffset = 1129313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch kAccessCheckInfoOffset + kPointerSize; 1129413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kFlagOffset = kSharedFunctionInfoOffset + kPointerSize; 11295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kLengthOffset = kFlagOffset + kPointerSize; 11296c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kCachedPropertyNameOffset = kLengthOffset + kPointerSize; 11297c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kSize = kCachedPropertyNameOffset + kPointerSize; 11298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1129913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static Handle<SharedFunctionInfo> GetOrCreateSharedFunctionInfo( 1130013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* isolate, Handle<FunctionTemplateInfo> info); 11301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Returns parent function template or null. 11302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline FunctionTemplateInfo* GetParent(Isolate* isolate); 11303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if |object| is an instance of this function template. 1130413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool IsTemplateFor(JSObject* object); 11305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsTemplateFor(Map* map); 1130613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch inline bool instantiated(); 11307014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11308c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Helper function for cached accessors. 11309c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static MaybeHandle<Name> TryGetCachedPropertyName(Isolate* isolate, 11310c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> getter); 11311c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 11312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Bit position in the flag, from least significant bit position. 11314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kHiddenPrototypeBit = 0; 11315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kUndetectableBit = 1; 11316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kNeedsAccessCheckBit = 2; 1131769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch static const int kReadOnlyPrototypeBit = 3; 11318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kRemovePrototypeBit = 4; 11319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kDoNotCacheBit = 5; 1132013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch static const int kAcceptAnyReceiver = 6; 11321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(FunctionTemplateInfo); 11323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ObjectTemplateInfo: public TemplateInfo { 11327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(constructor, Object) 11329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_ACCESSORS(data, Object) 11330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_INT_ACCESSORS(internal_field_count) 11331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_BOOLEAN_ACCESSORS(immutable_proto) 11332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(ObjectTemplateInfo) 11334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(ObjectTemplateInfo) 11337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(ObjectTemplateInfo) 11338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kConstructorOffset = TemplateInfo::kHeaderSize; 11340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // LSB is for immutable_proto, higher bits for internal_field_count 11341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kDataOffset = kConstructorOffset + kPointerSize; 11342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kSize = kDataOffset + kPointerSize; 11343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Starting from given object template's constructor walk up the inheritance 11345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // chain till a function template that has an instance template is found. 11346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline ObjectTemplateInfo* GetParent(Isolate* isolate); 11347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 11349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class IsImmutablePrototype : public BitField<bool, 0, 1> {}; 11350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch class InternalFieldCount 11351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : public BitField<int, IsImmutablePrototype::kNext, 29> {}; 11352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The DebugInfo class holds additional information for a function being 11356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// debugged. 11357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass DebugInfo: public Struct { 11358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The shared function info for the source being debugged. 11360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(shared, SharedFunctionInfo) 11361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1136262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Bit field containing various information collected for debugging. 1136362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DECL_INT_ACCESSORS(debugger_hints) 1136462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 11365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DECL_ACCESSORS(debug_bytecode_array, Object) 11366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Fixed array holding status information for each active break point. 11367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(break_points, FixedArray) 11368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Check if there is a break point at a source position. 11370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool HasBreakPoint(int source_position); 11371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Attempt to clear a break point. Return true if successful. 11372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static bool ClearBreakPoint(Handle<DebugInfo> debug_info, 11373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set a break point. 11375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static void SetBreakPoint(Handle<DebugInfo> debug_info, int source_position, 11376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Get the break point objects for a source position. 11378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> GetBreakPointObjects(int source_position); 11379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Find the break point info holding this break point object. 11380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Object> FindBreakPointInfo(Handle<DebugInfo> debug_info, 11381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> break_point_object); 11382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the number of break points for this function. 11383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int GetBreakPointCount(); 11384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11385f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool HasDebugBytecodeArray(); 11386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline bool HasDebugCode(); 11387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11388f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline BytecodeArray* OriginalBytecodeArray(); 11389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline BytecodeArray* DebugBytecodeArray(); 11390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline Code* DebugCode(); 11391109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(DebugInfo) 11393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(DebugInfo) 11396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(DebugInfo) 11397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSharedFunctionInfoIndex = Struct::kHeaderSize; 1139962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kDebuggerHintsIndex = 11400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSharedFunctionInfoIndex + kPointerSize; 1140162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static const int kDebugBytecodeArrayIndex = 1140262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch kDebuggerHintsIndex + kPointerSize; 11403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kBreakPointsStateIndex = 11404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kDebugBytecodeArrayIndex + kPointerSize; 11405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kBreakPointsStateIndex + kPointerSize; 11406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kEstimatedNofBreakPointsInFunction = 4; 11408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11410f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Get the break point info object for a source position. 11411f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Object* GetBreakPointInfo(int source_position); 11412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(DebugInfo); 11414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The BreakPointInfo class holds information for break points set in a 11418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// function. The DebugInfo object holds a BreakPointInfo object for each code 11419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// position with one or more break points. 11420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass BreakPointInfo: public Struct { 11421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The position in the source for the break position. 11423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECL_INT_ACCESSORS(source_position) 11424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // List of related JavaScript break points. 11425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DECL_ACCESSORS(break_point_objects, Object) 11426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Removes a break point. 11428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void ClearBreakPoint(Handle<BreakPointInfo> info, 11429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Set a break point. 11431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static void SetBreakPoint(Handle<BreakPointInfo> info, 11432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check if break point info has this break point object. 11434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static bool HasBreakPointObject(Handle<BreakPointInfo> info, 11435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> break_point_object); 11436109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Get the number of break points for this code offset. 11437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int GetBreakPointCount(); 11438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11439f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int GetStatementPosition(Handle<DebugInfo> debug_info); 11440f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 11441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CAST(BreakPointInfo) 11442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Dispatched behavior. 11444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_PRINTER(BreakPointInfo) 11445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_VERIFIER(BreakPointInfo) 11446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11447f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static const int kSourcePositionIndex = Struct::kHeaderSize; 11448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kBreakPointObjectsIndex = 11449f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch kSourcePositionIndex + kPointerSize; 11450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSize = kBreakPointObjectsIndex + kPointerSize; 11451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block private: 11453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(BreakPointInfo); 11454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define VISITOR_SYNCHRONIZATION_TAGS_LIST(V) \ 11458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kStringTable, "string_table", "(Internalized strings)") \ 114593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(kExternalStringsTable, "external_strings_table", "(External strings)") \ 11460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kStrongRootList, "strong_root_list", "(Strong roots)") \ 11461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kSmiRootList, "smi_root_list", "(Smi roots)") \ 11462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kBootstrapper, "bootstrapper", "(Bootstrapper)") \ 11463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kTop, "top", "(Isolate)") \ 11464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kRelocatable, "relocatable", "(Relocatable)") \ 11465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kDebug, "debug", "(Debugger)") \ 11466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kCompilationCache, "compilationcache", "(Compilation cache)") \ 11467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kHandleScope, "handlescope", "(Handle scope)") \ 11468109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch V(kDispatchTable, "dispatchtable", "(Dispatch table)") \ 11469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kBuiltins, "builtins", "(Builtins)") \ 11470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kGlobalHandles, "globalhandles", "(Global handles)") \ 11471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kEternalHandles, "eternalhandles", "(Eternal handles)") \ 11472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kThreadManager, "threadmanager", "(Thread manager)") \ 11473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(kStrongRoots, "strong roots", "(Strong roots)") \ 114743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(kExtensions, "Extensions", "(Extensions)") 114753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 114763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass VisitorSynchronization : public AllStatic { 114773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 114783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECLARE_ENUM(enum_item, ignore1, ignore2) enum_item, 114793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum SyncTag { 114803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch VISITOR_SYNCHRONIZATION_TAGS_LIST(DECLARE_ENUM) 114813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kNumberOfSyncTags 114823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 114833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_ENUM 114843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 114853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const char* const kTags[kNumberOfSyncTags]; 114863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const char* const kTagNames[kNumberOfSyncTags]; 114873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 11488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Abstract base class for visiting, and optionally modifying, the 11490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// pointers contained in Objects. Used in GC and serialization/deserialization. 11491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ObjectVisitor BASE_EMBEDDED { 11492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual ~ObjectVisitor() {} 11494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Visits a contiguous arrays of pointers in the half-open range 11496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // [start, end). Any or all of the values may be modified on return. 11497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitPointers(Object** start, Object** end) = 0; 11498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Handy shorthand for visiting a single pointer. 11500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); } 11501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Visit weak next_code_link in Code object. 11503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitNextCodeLink(Object** p) { VisitPointers(p, p + 1); } 11504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // To allow lazy clearing of inline caches the visitor has 11506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // a rich interface for iterating over Code objects.. 11507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Visits a code target in the instruction stream. 11509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitCodeTarget(RelocInfo* rinfo); 11510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11511791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // Visits a code entry in a JS function. 11512791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block virtual void VisitCodeEntry(Address entry_address); 11513791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 11514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Visits a global property cell reference in the instruction stream. 11515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitCell(RelocInfo* rinfo); 11516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 11517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Visits a runtime entry in the instruction stream. 11518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitRuntimeEntry(RelocInfo* rinfo) {} 11519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Visits the resource of an one-byte or two-byte string. 11521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitExternalOneByteString( 11522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::String::ExternalOneByteStringResource** resource) {} 11523d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block virtual void VisitExternalTwoByteString( 11524d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block v8::String::ExternalStringResource** resource) {} 11525d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 11526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Visits a debug call target in the instruction stream. 11527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block virtual void VisitDebugTarget(RelocInfo* rinfo); 11528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Visits the byte sequence in a function's prologue that contains information 11530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // about the code's age. 11531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitCodeAgeSequence(RelocInfo* rinfo); 11532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 115333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Visit pointer embedded into a code object. 115343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void VisitEmbeddedPointer(RelocInfo* rinfo); 115353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Visits an external reference embedded into a code object. 115373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void VisitExternalReference(RelocInfo* rinfo); 115383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visits an external reference. 11540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void VisitExternalReference(Address* p) {} 11541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Visits an (encoded) internal reference. 11543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch virtual void VisitInternalReference(RelocInfo* rinfo) {} 11544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1154544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Visits a handle that has an embedder-assigned class ID. 1154644f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual void VisitEmbedderReference(Object** p, uint16_t class_id) {} 1154744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 11548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Intended for serialization/deserialization checking: insert, or 11549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // check for the presence of, a tag at this position in the stream. 115503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Also used for marking up GC roots in heap snapshots. 115513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void Synchronize(VisitorSynchronization::SyncTag tag) {} 11552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// BooleanBit is a helper class for setting and getting a bit in an integer. 11556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass BooleanBit : public AllStatic { 11557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 11558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline bool get(int value, int bit_position) { 11559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (value & (1 << bit_position)) != 0; 11560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 11561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static inline int set(int value, int bit_position, bool v) { 11563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (v) { 11564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value |= (1 << bit_position); 11565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 11566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value &= ~(1 << bit_position); 11567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 11568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return value; 11569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 11570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 11571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // NOLINT, false-positive due to second-order macros. 11574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // NOLINT, false-positive due to second-order macros. 11575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1157662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/object-macros-undef.h" 1157762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 11578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_OBJECTS_H_ 11579